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ę!

0
張皓翔 5 marzec 2020, 18:04

2 odpowiedzi

Najlepsza odpowiedź

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ł.

2
M Oehm 5 marzec 2020, 15:11

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}}.

1
Maxim Egorushkin 5 marzec 2020, 15:09