Vypadá to na spojitý seznam ... takže ti to zkusím vysvětlit na umělém příkladu.
Představ si, že máš doma "poschovávané" věci. Vypadá to tak, že po bytě/domě máš skříňky, kde jsou uložené nějaké věci a jediné, co víš, je umístění první skříňky (na papírku máš uloženou adresu - pointer (prvni) - na první skříňku ... třeba "za komodou v ložnici"). Je tam uložená nějaká věc (v tvém případě je to hodn). K té hodnotě se dostaneš tak, že dojdeš na adresu a přístoupíš k hodnotě (prvni->hodn).
Každý taková skříňka obsahuje lísteček s adresou (pointerem) na další takovou skříňku (dalsi). Když se chceš dostat na další skříňku, tak si musíš "opsat adresu" té další skříňky na svůj papírek (prvni = prvni->dalsi). Tím se dostaneš na další skříňku v pořadí. Kde je zase uložená nějaká věc (hodn) a papírek (pointer) s umístěním další takové skříňky (dalsi).
Jsou dvě věci, které se u takového seznamu musí dodržet. Musíš mít někde stále uloženou adresu (pointer) na úplně první skříňku, protože když ten papírek zahodíš, tak už ji nenajdeš. A druhá věc je ta, že v poslední skříňce musí být papírek prázdný (NULL), aby se tím označilo, že je to poslední skříňka.
Kód dpole[i] = prvni->hodn; tedy znamená, že si do pole dpole na index i ukládá hodnotu ze skříňky, na kterou ukazuje adresa (pointer) uložená v prvni.
a ten druhý (prvni = prvni->dalsi;) znamená, že si opisuješ na papírek (prvni) adresu další skříňy v pořadí nebo-li se posunuješ v tom seznamu na další položku (skříňku).