Istnieją dwie wersje funkcji wprowadzania listy pojedynczo.
Jedna jest powszechna wersja za pomocą jednego wskaźnika i łatwo zrozumieć:
void insert(struct node *newt) {
struct node *node = head, *prev = NULL;
while (node != NULL && node->data < newt->data) {
prev = node;
node = node->next;
}
newt->next = node;
if (prev == NULL)
head = newt;
else
prev->next = newt;
}
Inny używa wskaźnika do wskaźnika:
void insert(struct node *newt)
{
struct node **link = &head;
while (*link && (*link)->data < newt->data)
link = &(*link)->next;
newt->next = *link;
*link = newt; //confuse me
}
Jestem zdezorientowany o *link = newt;
, chociaż przypisuję Newt do * Link, poprzedni węzeł nadal wskazuje Oryginalny adres?
Z góry dziękuję!
2 odpowiedzi
Podczas wkładania węzła z przodu musisz zaktualizować głowę listy. Podczas wkładania po tym musisz zaktualizować pole next
poprzedniego węzła. Używanie wskaźnika do wskaźnika węzła robi to:
Najpierw:
struct node **link = &head;
Teraz link
jest wskaźnikiem do wskaźnika głowy. Jeśli zaktualizujesz *link
, aktualizujesz głowę przez ten wskaźnik.
Później:
link = &(*link)->next;
Teraz link
jest wskaźnikiem do bieżącego pola {x1}}.}. Jeśli zaktualizujesz *link
, aktualizujesz, że pole next
.
W obu przypadkach, jeśli odczytujesz się z *link
, otrzymasz bieżący węzeł.
Poprzedni węzeł nadal wskazuje na oryginalny adres?
W *link = newt;
przypisuje newt
do poprzedniego członka {X2}}.
link
Albo wskazuje na head
lub do poprzedniego członka {X2}}.
Podobne pytania
Nowe pytania
c
C jest językiem programowania ogólnego przeznaczenia, używanym do programowania systemów (system operacyjny i systemy wbudowane), bibliotek, gier i wielu platform. Ten znacznik powinien być używany w przypadku ogólnych pytań dotyczących języka C, zgodnie z definicją w standardzie ISO 9899 (najnowsza wersja 9899: 2018, chyba że określono inaczej - również oznaczanie żądań dotyczących wersji za pomocą c89, c99, c11 itd.). C różni się od C ++ i nie należy go łączyć ze znacznikiem C ++ bez racjonalnego powodu.