I wanted to merge two sorted link lists by pointer manipulation, but stuck at this point. cant find out the mistake. Help me please. I think the problem is in while loop. I want to make it space efficient and do not want to make another list.
#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();
}
Your while loop condition is not quite right.
is fine, but only when both lists are the same length!. When the lists are of different lengths, either
ptr1->nextorptr2->nextwill beNULL, and you’ll get a segmentation fault. Changing to to&&is not the correct thing to do, because you’ll lose the end of one of your lists!Use this:
Now, inside your loop you have tests like this:
replace this with
so that unequal length lists don’t terminate early and don’t segfault inside.
Next, inside your insert operations, you do things like
and
This is bad, because
tempis undefined as you never write any valid data to it! The bug here is that your assignments are the wrong way round. You should have donetemp=ptr1andtemp=ptr2respectively.Finally, your cleanup operation to fix up equal length input lists needs to account for the fact that unequal length input lists can result in either
ptr1orptr2beingNULL:And all seems to be well. I’ve tested the resulting code on
1 3 5,2 4 6and1 3,2and1 4,2 3and1 3,2 3and all work as I’d expect them to.