0

我想通过指针操作合并两个排序的链接列表,但停留在这一点上。无法找出错误。请帮帮我。我认为问题出在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();
}
4

2 回答 2

2

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

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

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

于 2012-11-12T14:18:03.210 回答
2

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

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

很好,但只有当两个列表的长度相同时!当列表的长度不同时,要么 要么ptr1->nextptr2->nextNULL你会得到一个分段错误。更改为 to&&不是正确的做法,因为您会丢失其中一个列表的结尾!

用这个:

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

最后,修复等长输入列表的清理操作需要考虑这样一个事实,即不等长的输入列表可能导致ptr1以下ptr2情况NULL

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

一切似乎都很好。我已经在1 3 5, 2 4 6and 1 3, 2and 1 4, 2 3and上测试了生成的代码1 32 3所有这些都可以按照我的预期工作。

于 2012-11-12T14:31:29.763 回答