2016-04-23 33 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