Ogółem masz tu coś w rodzaju listy jednokierunkowej. W Twojej strukturze masz dwa pola: jeden na dane, drugi na referencję do obiektu będącego Twoją strukturą. O tych referencjach pomyśl jak o wagonikach - możesz doczepić wagonik (ustawić referencję na inny obiekt typu wezel*, albo możesz odczepić wagonik (wtedy referencja jest na NULL, czyli wskaźnik pusty).
W tym przypadku jednak doczepianie wagoników nie odbywa się od początku, a tak jakby od końca, bo pierwszy wagonik, który tworzysz (czyli pierwsze wykonanie pętli) będzie miał referencję do następnego obiektu na NULL (innymi słowy następny wagonik będzie pustym wagonikiem - czyli tak, jakby go nie było).
W kolejnych krokach można by to opisać tak (L:X <- L - linia, X - numer linii w Twoim programie):
L:14 -> przydzielasz pamięć na wszystkie pola (tworzysz wagonik)
L:15 -> pole dane ustawiasz na konkretną wartość poprzez operator dostępu (->) (innymi słowy do wagonika coś wrzucasz)
L:16 -> do pola nastepny dodajesz referencję na inny obiekt (czyli de facto podczepiasz inny wagonik)
L:17 -> tutaj istotna część: Twoim następnym obiektem (wagonikiem) jest obiekt (wagonik), który już utworzyłeś. Logiczne, prawda? Mamy już jeden wagonik i chcemy, by był on następnym wagonikiem dla innego wagonika. Stąd to przypisanie wskaźnika. Innymi słowy, na koniec pętli wskaźnik p wskazuje na wagonik, który utworzyliśmy.
I teraz powtarzamy to, co zrobiliśmy. Na koniec wypisywanie informacji. Zauważ, że kolejka była tworzona od tyłu, czyli jakbyśmy mieli to zobrazować poprzez numerację wagoników, to byśmy mieli
(pierwsze wykonanie pętli) 1 -> NULL
(drugie wykonanie pętli) 2 -> 1 -> NULL
(czwarte wykonanie pętli) 4 -> 3 -> 2 -> 1 -> NULL,
gdzie q na koniec pierwszej pętli wskazuje na wagonik nr 4. I teraz odczytujemy kolejne wagoniki.
W razie pytań - pytaj śmiało.