2016-03-20 7 views
1

wenn ich Knoten an den Kopf einfügen, funktioniert es nicht. aber an anderen Orten einfügen funktioniert gut.Verlorene Knoten beim Einfügen in den Kopf

hier ist meine Insert-Funktion

int insert_before(ListNode *head, ListNode *p, int x){ 
ListNode *tmp, *cursor; 
if(head == NULL || p == NULL) return -1;                           
if(head == p){ 
    tmp = malloc(sizeof(ListNode)); 
    tmp->val = x; 
    // insert node 
    tmp->next = p; 
    p = tmp; 

    printf("insert before: \n"); 
    printList(head); 
    return 0; 
} 
cursor = head; 
while(cursor->next != p && cursor->next != NULL) cursor = cursor->next; 
tmp = malloc(sizeof(ListNode)); 
tmp->val = x; 
//insert node 
tmp->next = p; 
cursor->next = tmp; 


printf("insert before: \n"); 
printList(head); 
return 0; 

}

meine Hauptfunktion

int main(){ 
ListNode *head, *tmp; 
int x=0; 
int arr[5] = {1,2,4,5,6}; 
head = createList(arr, 5); 
printList(head); 
tmp = get_by_index(head,3); 

// insert 
//insert_after(head, x); 
insert_before(head, tmp, 100); 
// insert_before(head, head, 100); 
printf("in main: "); 
printList(head); 

printf("insert_before return %d \n", x); 
return 0; 

}

wenn ich insert_before laufen (Kopf, tmp, x), es funktioniert fein enter image description here , wenn ich insert_before (Kopf, Kopf, 100) ausführen; es haben keine Änderungen;

+1

Wie der Name schon sagt, sollte die Funktion 'insert_before' die Variable' head' aktualisieren, um auf den neu erstellten Kopf der Liste zu zeigen. Bei seiner gegenwärtigen Implementierung ist es unmöglich, da Sie diese Variable nach Wert übergeben. –

+0

danke, ich verstehe es. – fangxing

Antwort

1

Einfügen in den Kopf der verketteten Liste ersetzt den Kopf, das geht nicht mit der Funktion foo (node ​​* head). Stattdessen sollten Sie den Zeiger des Kopfzeigers übergeben, damit die Funktion ihn ändern kann.

+0

Danke, ich denke meine Frage ist mit [dieser] dupliziert (http://stackoverflow.com/questions/6810359/modifying-head-pointer-in-a-linked-list) – fangxing

0

Sie haben Syntax Ihres Codes wenig,

es
int insert_before(ListNode **head, ListNode *p, int x) 

Ich denke, man muss sich ändern, was ich hier zu sagen versuche.

+0

danke, hol es :) – fangxing

Verwandte Themen