为什么执行到链表归并的时候就不执行了呢?

wangya55 2008-04-10 05:06:31
#include<iostream.h>

struct node{
int data;
node *next;
};

node* Listcreat() //创建链表
{ node *head,*n,*tail;
int a;
head=NULL; //空链
cout<<"请输入数据(0表示结束):";
for(cin>>a;a!=0;cin>>a)
{ n=new node;
n->data=a;
if(!head) tail=head=n;
else tail->next=n,tail=n;
}
if(head) tail->next=NULL;
return head;
}

void clearlist(node *list)//如果链表不是有序且是升序的,则将链表被所有结点删除
{ node*head,*p;
head=list;
while(head)
{ p=head;head=head->next;delete p;}
cout<<"无效数据清除成功!\n";
}

int panduan(node *List)//判断链表是不是有序(升序)的链表
{ node *head,*p;
head=List;
if(head)
{p=head->next;
for(head;head->next!=NULL;head=head->next,p=head->next)
for(p;p!=NULL;p=p->next)
if(p->data<head->data) return 0;
if(!head->next) return 1;
}else return 0;
}

void print(node*List)//输出链表上所有的数据元素
{ node *p;
p=List;
while(p)
{ cout<<p->data<<'\t';p=p->next; }
cout<<endl;
}


void combin (node *La,node *Lb) //实现链表La,Lb的归并,归并后为Lc
{
node *pa,*pb,*pc,*Lc;
pa=La->next;
pb=Lb->next;
Lc=pc=pa; //归并后的链表的头结点指向连表La的头结点
while(pa&&pb)
{ if(pa->data<=pb->data)
{pc->next=pa;pc=pa;pa=pa->next;}
else
{pc->next=pb;pc=pb;pb=pb->next;}
}
if(pa) pc->next=pa;//插入剩余的结点
else pc->next=pb;//插入剩余的结点
delete(Lb);
print(Lc);//输出归并后的集合元素
}

void main()
{ node *List_La, *List_Lb, *List_Lc;

cout<<"集合A"<<endl;
List_La=Listcreat();//创建链表List_La存储集合A的元素
while(!panduan(List_La))
{
cout<<"输入的数据无效,请输入有序的集合元素!\n";
clearlist(List_La);
List_La=Listcreat();//判断后重新输入集合元素
}

cout<<"集合B"<<endl;
List_Lb=Listcreat();//创建链表List_La存储集合A的元素
while(!panduan(List_Lb))
{
cout<<"输入的数据无效,请输入有序的集合元素!\n";
clearlist(List_Lb);
List_Lb=Listcreat();
}
cout<<"经过归并后!";
combin(List_La,List_Lb);
}
...全文
109 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
上面代码可以了。帮你修改了一下。
我的中文显示乱码。你自己替换一下吧。
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
#include<iostream.h>

struct node{
int data;
node *next;
};

node* Listcreat() //´´½¨Á´±í
{
node *head,*n,*tail;
int a;
head=NULL; //¿ÕÁ´
cout<<"ÇëÊäÈëÊý¾Ý£¨0±íʾ½áÊø£©:";
for(cin>>a;a!=0;cin>>a)
{
n=new node;
n->data=a;
n->next = NULL;
if(!head) tail=head=n;
else tail->next=n,tail=n;
}
if(head) tail->next=NULL;
return head;
}

void clearlist(node *list)//Èç¹ûÁ´±í²»ÊÇÓÐÐòÇÒÊÇÉýÐòµÄ£¬Ôò½«Á´±í±»ËùÓнáµãɾ³ý
{
node*head,*p;
head=list;
while(head)
{
p=head;head=head->next;
delete p;
}
cout<<"ÎÞЧÊý¾ÝÇå³ý³É¹¦£¡\n";
}

int panduan(node *List)//ÅжÏÁ´±íÊDz»ÊÇÓÐÐò£¨ÉýÐò£©µÄÁ´±í
{
node *head,*p;
head=List;
if(head)
{
p=head->next;
for(head;head->next!=NULL;head=head->next,p=head->next)
for(p;p!=NULL;p=p->next)
if(p->data<head->data)
return 0;
if(!head->next)
return 1;
}
else
return 0;
return 1;
}

void print(node*List)//Êä³öÁ´±íÉÏËùÓеÄÊý¾ÝÔªËØ
{
node *p;
p=List;
while(p)
{ cout<<p->data<<'\t';p=p->next; }
cout<<endl;
}

void DelList(node *p)
{
node *q = p;
while(p)
{
q = p->next;
delete p;
p = q;
}
}
void combin (node *La,node *Lb) //ʵÏÖÁ´±íLa,LbµÄ¹é²¢,¹é²¢ºóΪLc
{
node *pa,*pb,*pc,*Lc;
pa=La;
pb=Lb;

pc = new node;
pc->next = NULL;
Lc=pc; //¹é²¢ºóµÄÁ´±íµÄÍ·½áµãÖ¸ÏòÁ¬±íLaµÄÍ·½áµã
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pb=pb->next;
}
pc = pc->next;
}

if(pa)
pc->next=pa;//²åÈëÊ£ÓàµÄ½áµã
else
pc->next=pb;//²åÈëÊ£ÓàµÄ½áµã
pc = Lc;
Lc = Lc->next;
delete pc;
print(Lc);//Êä³ö¹é²¢ºóµÄ¼¯ºÏÔªËØ
DelList(Lc);
}



void main()
{
node *List_La = NULL, *List_Lb = NULL;

cout<<"¼¯ºÏA"<<endl;
List_La=Listcreat();//´´½¨Á´±íList_La´æ´¢¼¯ºÏAµÄÔªËØ
while(!panduan(List_La))
{
cout<<"ÊäÈëµÄÊý¾ÝÎÞЧ£¬ÇëÊäÈëÓÐÐòµÄ¼¯ºÏÔªËØ!\n";
clearlist(List_La);
List_La=Listcreat();//ÅжϺóÖØÐÂÊäÈ뼯ºÏÔªËØ
}

cout<<"¼¯ºÏB"<<endl;
List_Lb=Listcreat();//´´½¨Á´±íList_La´æ´¢¼¯ºÏAµÄÔªËØ
while(!panduan(List_Lb))
{
cout<<"ÊäÈëµÄÊý¾ÝÎÞЧ£¬ÇëÊäÈëÓÐÐòµÄ¼¯ºÏÔªËØ!\n";
clearlist(List_Lb);
List_Lb=Listcreat();
}
cout<<"¾­¹ý¹é²¢ºó£¡";
combin(List_La,List_Lb);
}
wangya55 2008-04-11
  • 打赏
  • 举报
回复
还是不懂啊!那怎么办啊
wangya55 2008-04-11
  • 打赏
  • 举报
回复
各位高手能不能帮我指出来具体错在哪里面啊!
我的combin函数是根据我的数据结构的书上面的算法写出来的,怎么就不能执行呢
Supper_Jerry 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dizuo 的回复:]
C/C++ code:ls的什么编译器?
中文都不识?@_@
[/Quote]
vc 6.0 中文拷贝出来就是乱码。严重降低了我抢分的威力,嘿嘿。
jieao111 2008-04-11
  • 打赏
  • 举报
回复
1)注意
void combin (node *La,node *Lb)
{
node *pa,*pb,*pc,*Lc;
pa=La->next;
pb=Lb->next;
Lc=pc=pa; //这里的pc需要new的。。
2)在看看你的链表的合并时,表头指向的值具体是这么合并的。。
wenjun1130 2008-04-11
  • 打赏
  • 举报
回复
void combin (node *La,node *Lb) 
{
node *pa,*pb,*pc,*Lc;
pa=La; //因为La,Lb中有data数据,所以应该从La,Lb开始比较
pb=Lb;
if(pa->data<=pb->data)
{
Lc=pc=pa; // 数据小的为头
pa=pa->next; //下次比较从下个元素开始
}
else
{
Lc=pc=pb; // 数据小的为头
pb=pb->next; //下次比较从下个元素开始
}
while(pa&&pb)
{ if(pa->data<=pb->data)
{pc->next=pa;pc=pa;pa=pa->next;}
else
{pc->next=pb;pc=pb;pb=pb->next;}
}
if(pa) pc->next=pa;
else pc->next=pb;
//delete(Lb); //Lb的所有节点全部在Lc上 所以不能删除
print(Lc);
}
ryfdizuo 2008-04-11
  • 打赏
  • 举报
回复
:ls的什么编译器?
中文都不识?@_@
canybox 2008-04-10
  • 打赏
  • 举报
回复
学会DEBUG,运行时你明显发现指针值是相同的...
pc->next=pa;
canybox 2008-04-10
  • 打赏
  • 举报
回复

void combin (node *La,node *Lb) //实现链表La,Lb的归并,归并后为Lc
{
node *pa,*pb,*pc,*Lc;
pa=La->next;
pb=Lb->next;
Lc=pa; //归并后的链表的头结点指向连表La的头结点

pc = La; //pc应赋值为头节点的指针,不然后面会出错,环状...

while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}

if(pa) pc->next=pa;//插入剩余的结点
else pc->next=pb;//插入剩余的结点
delete(Lb);
print(Lc);//输出归并后的集合元素
}

wangya55 2008-04-10
  • 打赏
  • 举报
回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧