2016-06-27 11 views
-2

Unten ist der Code in der Sprache C:Warum funktioniert der folgende Code zum Einfügen eines Knotens am Ende einer einfach verknüpften Liste nicht?

Funktionsaufruf:

insert(&head,value); 

void insert(struct node** headref,int value) 
{ 
    struct node* head = (*headref); 

    while(head!=NULL) 
    { 

     head= head->link; 
    } 

    struct node* new_node=(struct node*)malloc(sizeof(struct node)); 

    new_node->data=value; 
    new_node->link=NULL; 

    head=new_node; 
} 
+1

Wie die Liste wissen über das neue Element soll? Sie müssten das Element "link" des letzten Elements in der Liste so einstellen, dass es auf das neue Element verweist. Sobald "head" zu NULL wird, haben Sie das Element verloren, dessen "link" -Member Sie festlegen müssen. Eine bessere Schleifenbeendigungsbedingung wäre 'while (head-> link! = NULL)' – enhzflep

+0

Ich schlage vor, du bewegst nie deinen 'Kopf', da es nicht empfohlen wird !! Es ist ein Referenzzeiger, der immer auf den Startknoten in der verknüpften Liste zeigen sollte. Verwenden Sie stattdessen einen anderen Zeiger. –

Antwort

0

Sie müssen das letzte Element der Liste zu new_node sonst verknüpfen verlieren Sie die Linked-ness (wenn es so ist, Wort :)) deiner Liste. Sie müssen 2 Zeiger im Zyklus speichern - head, den Sie bereits haben, und einen Zeiger auf das vorherige Element (das Element vor dem Kopf). Achten Sie besonders auf den Fall, dass Sie eine leere Liste haben!

0
while(head!=NULL) 
{ 
    head= head->link; 
} 

Am Ende dieser Schleife head wäre NULL .Sie könnte

while(head->link!=NULL) 
{ 
    head= head->link; 
} 

und dann etwas tun, wie

head->link = new_node; 

Jetzt haben Sie am letzten Knoten stoppen wollen Seien Sie besonders vorsichtig, wenn die Liste leer ist, denn dann wird head->link einen Fehler ausgeben, wenn head=NULL. Sie können einen Scheck am Anfang platzieren wie

//allocate new_node here 
if(head==NULL) 
{ 
    *headref = new_node; //Note only in this case would headref ever change 
} 
0

Sie den letzten Knoten head mit new_node zu ersetzen, die nicht erwartet wird. Schleife bis zum letzten Knoten und machen die head->link-new_node zu zeigen, wie unten dargestellt:

insert(&head,value); 

void insert(struct node** headref,int value) 
{ 
    struct node* head = (*headref); 

    while(head->link !=NULL) 
    { 

     head= head->link; 
    } 

    struct node* new_node=(struct node*)malloc(sizeof(struct node)); 

    new_node->data=value; 
    new_node->link=NULL; 

    head->link=new_node; 
} 
+0

Also fügen Sie dieses Element nach dem 'head' Knoten ein? Habe ich recht? –

+0

ja .. Am Ende der "while" -Schleife zeigt der "head" -Knoten auf den letzten Knoten der verknüpften Liste. Und 'new_node' wird nach dem' head' Knoten eingefügt. – Fazlin

+0

Ok! Nehmen wir ein Szenario, in dem es 5 Elemente gibt und der "Kopf" auf das erste Element zeigt. Nachdem der 'new_node' eingefügt wurde (nach dem' head' nach Ihrer Logik), auf welchen Knoten zeigt der 'new_node'? Ich sehe, dass deine 'new_node-> Verbindung = NULL' ist. Ich denke, es wird einen Effekt geben! –

0

Logic Fehler. Versuche dies.

struct node* new_node=(struct node*)malloc(sizeof(struct node)); 
new_node->data=value; 
new_node->link=NULL; 

if (!head) 
{ 
    head = new_node; 
    return; 
} 

// Use for or while loop as below. 
// 1. for(;head->link;head=head->link); 
// or 
/* 2. */ 
while (head->link) 
{ 
    head = head->link; 
} 
head->link = new_node; 

Besser, Kopf mit irgendeinem bedeutungsvollen Namen umzubenennen!

+0

Sie spiegeln keine Änderung in' headref' wider –

0

In der Funktion wird die lokale Variable head dem neu erstellten Knoten zugewiesen. Nach dem Verlassen der Funktion wird diese lokale Variable zerstört und die ursprüngliche Liste wird nicht geändert.

Darüber hinaus diese Schleife

while (head != NULL) 
{ 
    head = head->link; 
} 

macht keinen Sinn. Tatsächlich kann es

head = NULL; 

ersetzt werden Die Funktion kann aussehen, wie es in dem folgenden demonstrativen Programm gezeigt wird.

#include <stdio.h> 
#include <stdlib.h> 

struct node 
{ 
    int data; 
    struct node *link; 
}; 

int insert(struct node **head, int value) 
{ 
    struct node *tmp = malloc(sizeof(struct node)); 
    int success = tmp != NULL; 

    if (success) 
    { 
     tmp->data = value; 
     tmp->link = NULL; 

     while (*head) head = &(*head)->link; 

     *head = tmp; 
    } 

    return success; 
} 

void display(struct node*head) 
{ 
    for (; head != NULL; head = head->link) printf(" %d", head->data); 
} 

int main(void) 
{ 
    const int N = 10; 
    struct node *head = NULL; 

    int i = 0; 
    while (i < N && insert(&head, i)) i++; 

    display(head); 

    return 0; 
} 

Sein Ausgang ist

0 1 2 3 4 5 6 7 8 9 
Verwandte Themen