2016-04-23 35 views
0

下面的代碼不工作... 我試圖合併2使用迭代函數的鏈表.. 但它沒有給予所需的輸出..它是打印元素無限 我正在學習編程.. 幫我... 在此先感謝...合併2排序鏈表未得到期望的輸出

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


typedef struct Node 
{ 
    int data; 
    struct Node *next; 
}list_node; 



list_node* MergeLists(list_node *headA, list_node* headB) 
{ 
    if (headA == NULL && headB == NULL) { 
    return NULL; 
    } 

    if (headA == NULL) { 
    return headB; 
} 

if (headB == NULL) { 
    return headA; 
} 

if (headA->data > headB->data) { 
    list_node *tmp = headB; 
    headB = headA; 
    headA = tmp; 
} 

list_node *listHead = headA; 

while (headB) { 

    while (headA->next != NULL && 
      headB->data > headA->next->data) { 
     headA = headA->next; 
    } 


    list_node* nextB = headB->next; 
    headB->next = headA->next; 
    headA->next = headB; 
    headB = nextB; 
    } 

    return listHead; 
} 

list_node* push(list_node* head_r, int new_data) 
    { 
    list_node* new_Node = (list_node*)malloc(sizeof(list_node)); 

    new_Node->data = new_data; 
    new_Node->next = head_r; 
    head_r = new_Node; 
    return head_r; 
    } 

void Print(list_node* head_r) 
{ 
    while(head_r) 
    { 
     printf("%d\n", head_r->data); 
     head_r = head_r->next; 
    } 


} 

int main() 
{ 

    list_node* l_list = NULL; 
    list_node* l_list2 = NULL; 
    l_list = push(push(push(push(push(l_list, 1),2),3),4),5); 
    l_list2 = push(push(push(push(push(l_list, 6),8),3),4),0); 
    MergeLists(l_list, l_list2); 
    printf("Merge 2 Sorted list \n"); 
    Print(l_list); 
    return 0; 

} 
+0

注:大部分的共同的德(約80%)是爲了處理*特殊情況*。通過使用指向節點的指針,可以避免* all *特殊情況,將合併函數減少到大約五行代碼 – wildplasser

+1

,請使用for循環進行l_list賦值! – trans1st0r

+0

請標記答案是否正確;) – Mateusz

回答

1

你必須在這條線上一個錯字l_list2 = push(push(push(push(push(l_list, 6),8),3),4),0); 我想這應該是l_list2 = push(push(push(push(push(l_list2, 6),8),3),4),0);

發生了什麼事情是,你現在有兩個變量指向同一個列表。當你做合併時,你嘗試將列表合併到它自己。因爲合併算法的每一步你的列表變得更大,它永遠不會結束。

0

if (headA->data > headB->data) { 
     list_node *tmp = headB; 
     headB = headA; 
     headA = tmp; 
    } 

應該

if (headA->data > headB->data) { 
     list_node *tmp = headB; 
     headB = headA; 
     headA = *tmp; //tmp is a pointer 
    } 

而且在

l_list2 = push(push(push(push(push(l_list, 6),8),3),4),0); 

應該

l_list2 = push(push(push(push(push(l_list2, 6),8),3),4),0); //l_list2