2016-04-01 13 views
0

Beispiel Ergebnis:alternative merge verketteten Liste (C-Code)

2 angegebene verketteten Liste:

LL1: 1 3 5 7 9

LL2: 2 4 6

Nach dem Ausführen des Programms sollte das Ergebnis ...

Ergebnis:

LL1: 1 2 3 4 5 6 7 9

LL2: empty

Etwas ist mit dem folgenden Code falsch.

void alternateMergeLinkedList(LinkedList *ll1, LinkedList *ll2) 
{ 
    /* add your code here */ 
    int index = 1; 
    int j; 

    ListNode *ptr_node1; 
    ListNode *ptr_node2; 

    ptr_node1 = ll1->head; 
    ptr_node2 = ll2->head; 

    while (ptr_node2 != NULL) { 
     j = insertNode(ll1, index, ptr_node2->item); 
     j = removeNode(ll2, 0); 
     index += 2; 
    } 
} 

Da InsertNode und removeNode Funktionen:

int insertNode(LinkedList *ll, int index, int value) 
{ 

    ListNode *pre, *cur; 

    if (ll == NULL || index < 0 || index > ll->size + 1) 
     return -1; 

    // If empty list or inserting first node, need to update head pointer 
    if (ll->head == NULL || index == 0) { 
     cur = ll->head; 
     ll->head = malloc(sizeof(ListNode)); 
     ll->head->item = value; 
     ll->head->next = cur; 
     ll->size++; 
     return 0; 
    } 

    // Find the nodes before and at the target position 
    // Create a new node and reconnect the links 
    if ((pre = findNode(ll, index - 1)) != NULL) { 
     cur = pre->next; 
     pre->next = malloc(sizeof(ListNode)); 
     pre->next->item = value; 
     pre->next->next = cur; 
     ll->size++; 
     return 0; 
    } 

    return -1; 
} 


int removeNode(LinkedList *ll, int index) 
{ 

    ListNode *pre, *cur; 

    // Highest index we can remove is size-1 
    if (ll == NULL || index < 0 || index >= ll->size) 
     return -1; 

    // If removing first node, need to update head pointer 
    if (index == 0) { 
     cur = ll->head->next; 
     free(ll->head); 
     ll->head = cur; 
     ll->size--; 

     return 0; 
    } 

    // Find the nodes before and after the target position 
    // Free the target node and reconnect the links 
    if ((pre = findNode(ll, index - 1)) != NULL) { 

     if (pre->next == NULL) 
      return -1; 

     cur = pre->next; 
     pre->next = cur->next; 
     free(cur); 
     ll->size--; 
     return 0; 
    } 

    return -1; 
} 
+0

Versuchen Sie, den Code zeilenweise in einem Debugger zu durchlaufen, um zu sehen, was er tatsächlich tut. –

+0

Auch in Ihrer Funktion 'alternateMergeLinkedList' ist dieser 'index + = 2' möglicherweise nicht so gut, wenn' ll2' länger ist als 'll1'. –

+0

Schließlich haben Sie uns das erwartete Ergebnis gezeigt, aber was sind die * tatsächlichen * Ergebnisse? Wie bekommst du das Ergebnis? Bitte [lesen Sie, wie Sie gute Fragen stellen können] (http://stackoverflow.com/help/how-to-ask) und erfahren Sie, wie Sie ein [minimales, ** vollständiges ** und verifizierbares Beispiel] erstellen können (http: //stackoverflow.com/help/mcve). –

Antwort

0

Sie setzen ptr_node2 einmal vor der Schleife, und das ist es. Wenn Sie es nicht in der Schleife aktualisieren, wird es sich nicht ändern.

Eine bessere Loop-Bedingung könnte while (ll2->size > 0) sein.

+0

Vielen Dank. Das löst das Problem der Endlosschleife. Das Ergebnis ist jedoch nicht das, was wir erwarten. input: LL1: 1 3 5 LL2: 2 4 output: LL1: 1 2 3 5 -572.662.307 LL2: Leeren liegt ein Problem mit der zweiten Iteration. – Aung

Verwandte Themen