合并两个已排序的链接列表

时间:2012-11-12 14:13:21

标签: c++ pointers merge linked-list

我想通过指针操作合并两个已排序的链接列表,但此时仍然存在。找不到错误。请帮帮我。我认为问题出在while循环中。我想让它节省空间,不想再制作另一份清单。

#include<iostream>
#include<conio.h>
using namespace std;
struct s
{
   int info;
   s *next;
};

int main()
{
    int i;
    char choice = 'y';
    s *ptr1, *ptr2, *start1, *start2, *reversedHead, *temp;
    ptr1= new s;
    start1=ptr1;
    cout<<"SIZE OF A NODE IS "<<sizeof(s)<<" BYTES"<<endl<<endl;
    while(choice=='y')
    {
                  cout<<"Enter info for node: ";
                  cin>>i;
                  ptr1->info = i;
                  cout<<"Do you wish to enter more nodes.? 'y'/'n'"<<endl;
                  cin>>choice;

                  if(choice=='y')
                  {
                                 ptr1->next = new s;
                                 ptr1 = ptr1->next;
                  }
                  else
                  {
                      ptr1->next = NULL;
                  }
    }
    choice = 'y';
    ptr2= new s;
    start2=ptr2;
    cout<<"SIZE OF A NODE IS "<<sizeof(s)<<" BYTES"<<endl<<endl;
    while(choice=='y')
    {
                  cout<<"Enter info for node: ";
                  cin>>i;
                  ptr2->info = i;
                  cout<<"Do you wish to enter more nodes.? 'y'/'n'"<<endl;
                  cin>>choice;

                  if(choice=='y')
                  {
                                 ptr2->next = new s;
                                 ptr2 = ptr2->next;
                  }
                  else
                  {
                      ptr2->next = NULL;
                  }
    }

    ptr1=start1;
    ptr2=start2;
    while(ptr1->next!=NULL || ptr2->next!=NULL)
    {
                         if(ptr1->info < ptr2->info)
                         {
                                       if(ptr1->next->info < ptr2->info)
                                                           ptr1=ptr1->next;
                                       else
                                       {
                                           ptr2=temp;
                                           ptr2=ptr2->next;
                                           temp->next=ptr1->next;
                                           ptr1->next=temp;
                                       }
                         }
                         else
                         {
                             if(ptr2->next->info < ptr1->info)
                                                 ptr2=ptr2->next;
                             else
                             {
                                 ptr1=temp;
                                 ptr1=ptr1->next;
                                 temp->next=ptr2->next;
                                 ptr2->next=temp;
                             }
                         }
    }
    if(ptr1->next==NULL)
                    ptr1->next=ptr2;
    else
        ptr2->next=ptr1;
    cout<<"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";                    
    if(start1->info>start2->info)
    {
                             ptr2=start2;
                             while(ptr2!=NULL){
                                              cout<<ptr2->info<<"\t";
                                              ptr2=ptr2->next;}
    } 
    else
    {
                             ptr1=start1;
                             while(ptr1!=NULL){
                                              cout<<ptr1->info<<"\t";
                                              ptr1=ptr1->next;}
    }          



    getch();
}

2 个答案:

答案 0 :(得分:2)

没有检查,但让我们从这里开始:

 while(ptr1->next!=NULL || ptr2->next!=NULL)

它应该是&&而不是||,因为您不希望在其中一个列表中的下一个条目为空时继续比较(您确实在其中一个ifs中使用其内容) while loop)

答案 1 :(得分:2)

你的while循环条件不太正确。

while(ptr1->next!=NULL || ptr2->next!=NULL)

很好,但只有当两个列表长度相同时!当列表长度不同时,ptr1->nextptr2->next将为NULL,您将收到细分错误。更改为&&不是正确的做法,因为您将丢失其中一个列表的结尾!

使用此:

while((ptr1 != NULL && ptr2 != NULL) && (ptr1->next!=NULL || ptr2->next!=NULL))

现在,在你的循环中你有这样的测试:

if(ptr1->next->info < ptr2->info)

替换它
if(ptr1 != NULL && ptr1->next->info < ptr2->info)

这样不等长度列表不会提前终止,也不会在内部发生段错误。

接下来,在插入操作中,您可以执行

之类的操作
ptr1=temp;
ptr1=ptr1->next

ptr2=temp;
ptr2=ptr2->next;

这很糟糕,因为temp未定义,因为您从未向其写过任何有效数据!这里的错误是你的任务是错误的方式。您应该分别完成temp=ptr1temp=ptr2

最后,用于修复等长输入列表的清理操作需要考虑到不等长度输入列表可能导致ptr1ptr2NULL

if(ptr1 != NULL && ptr1->next==NULL)
    ptr1->next=ptr2;
else if (ptr2 != NULL)
    ptr2->next=ptr1;

一切似乎都很好。我在1 3 52 4 61 321 42 31 3上测试了结果代码, 2 3所有工作都是我期望的。