| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1493 人关注过本帖
标题:请教一个链表合并的问题!!!
只看楼主 加入收藏
蓝天
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2005-9-29
收藏
 问题点数:0 回复次数:4 
请教一个链表合并的问题!!!

请各位英雄帮小弟看看这条程序,功能是将所有在链表B中但不在链表A中的数据元素插入到A中,之后将链表A的元素输出(链表A,B中的元素按非递减排列)。该程序在VC++6.0中可以通过,但输出结果时却有问题,请各位帮帮忙! 多谢! #include"stdio.h" #include"stdlib.h" #include"iostream.h" #define NULL 0 typedef int datatype; typedef struct node * pointer; typedef struct node{ datatype data; pointer next; }lnode;

pointer initlist(){ //初始化链表 pointer l; l=(pointer)malloc(sizeof(lnode)); l->next=NULL; return l; }

pointer create_list(){ //创建链表 pointer head,p,q; datatype x; head=(pointer)malloc(sizeof(lnode)); p=head; cout<<"请从小到大输入链表的元素,输入0则结束:\n"; cin>>x; while(x!=0) { q=(pointer)malloc(sizeof(lnode)); q->data=x; p->next=q; p=q; cout<<"请输入下一个数:\n"; cin>>x; } p->next=NULL; return head; }

void print_list(pointer head){ //输出链表中的元素 pointer p; p=head->next; while(p!=NULL) { cout<<p->data<<"\t"; p=p->next; } cout<<endl; }

pointer union_list(pointer p,pointer q) { //将所有在链表Q中但不在链表P中的数据元素插入到P中 pointer r; r=p->next; q=q->next; while(r->data!=NULL) { while(q->data!=NULL) { if(q->data==r->data) q=q->next; else { p->next=q; p=q; q=q->next; } } r=r->next; } return p; }

void main() { pointer Alist,Blist,Clist; cout<<"请输入链表A的元素:\n"; Alist=create_list(); //链表A中的元素按非递减排列 print_list(Alist); cout<<"\n请输入链表B的元素:\n"; Blist=create_list(); //链表A中的元素按非递减排列 print_list(Blist); union_list(Alist,Blist); print_list(Alist); cout<<endl; }

搜索更多相关主题的帖子: 链表 
2005-10-14 13:35
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
大家努力!!!

楼主。我很不明白你。你明明用c++写的。为什么申请空间的时候用malloc。而不用new。如果用c++语言。那你最好不要用结构体了。用类。 类比结构体安全。而且功能强大过结构体。可以说完全取代结构体。还有就是你程序风格不好。行与行之间的位置没处理。 不过我想你的英语应该学的很好。我从你程序中可以看出来。这点我就比不上你了。我英语差。写出来的程序没你那么好。下面是我帮你改的。你上机运行一下。 #include"stdio.h" #include"stdlib.h" #include<iostream> using namespace std; typedef int datatype;

typedef struct node{ datatype data; struct node *next; }lnode,*pointer;

//pointer initlist(){ //初始化链表 //pointer l=new lnode(); //l->next=NULL; //return l; //}

pointer create_list(){ //创建链表 pointer head,p,q; datatype x; head=(pointer)malloc(sizeof(lnode)); p=head; cout<<"请从小到大输入链表的元素,输入0则结束:\n"; cin>>x; while(x!=0) { q=(pointer)malloc(sizeof(lnode)); q->data=x; p->next=q; p=q; /* cout<<"请输入下一个数:\n";*/ cin>>x; } p->next=NULL; return head; }

void print_list(pointer head){ //输出链表中的元素 pointer p; p=head->next; while(p!=NULL) { cout<<p->data<<"\t"; p=p->next; } cout<<endl; }

pointer union_list(pointer p,pointer q) { if(p->next==NULL||q->next==NULL||p==NULL||q==NULL)/*如果当中有一个链表为空.直接返回*/ return 0; pointer r1,r2,ptr;/*r1是用于链表Alist,r2是用于Blist链表的*/ ptr = p; /*我先用ptr指向其头节点*/ r1 = p->next; /*r1指向Alist表的第一个数字*/ r2 = q->next; /*r2指向Blist表的第一个数字*/ ptr->next = NULL; /*我先将Alist的表头的next置空.意思也就是断开表头和元素*/ q->next =NULL; /*Blist表也一样断开表头和元素.这个时候我已经用了 r1和r2分别指向它的第一个数字。所以不会脱链*/ while(r1 != NULL && r2 != NULL)/*开始合并链表。当2表不为空就循环*/ { if(r1->data>r2->data) /*r1的元素大过r2的元素*/ { ptr->next = r2;/*将r2接到ptr后面*/ ptr = ptr->next; /*移动ptr.也就是移到刚才r2节点那里*/ r2 = r2->next; /*r2在移后一元素*/ ptr->next = NULL;/*然后置空ptr的next*/ } else if(r1->data<r2->data)/*同理*/ { ptr->next = r1; ptr = ptr->next; r1 = r1->next; ptr->next=NULL; } else /*处理当r1->data==r2->data的时候*/ { ptr->next = r1; ptr = ptr->next; r1 = r1 ->next; r2 = r2 ->next; ptr->next = NULL; } } if(r1 != NULL)/*如果r1表后的元素还没进行合并*/ ptr->next = r1; if(r2 !=NULL)/*同上理*/ ptr->next = r2; return p; }

void main() { pointer Alist,Blist; cout<<"请输入链表A的元素:\n"; Alist=create_list(); //链表A中的元素按非递减排列 print_list(Alist); cout<<"\n请输入链表B的元素:\n"; Blist=create_list(); //链表A中的元素按非递减排列 print_list(Blist); cout<<"合并后的链表:"<<endl; Alist = union_list(Alist,Blist); print_list(Alist); cout<<endl; }

图片附件: 游客没有浏览图片的权限,请 登录注册

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-10-21 08:16
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
是了。忘记告诉你了。我是用.net来做的。你将头文件#include&lt;iostream&gt;改成#include&lt;iostream.h&gt;然后你去掉using namespace std;   还有。我上面对你程序的看法随便说说的。不会介意吧

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-10-21 08:20
蓝天
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2005-9-29
收藏
得分:0 
多谢!!1
很多谢你的帮忙!!!非常感谢!!!![
2005-10-22 18:41
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
得分:0 
不用客气。我职责所在

生是编程人!!!!死是编程鬼!!!!颠峰人生!!!焚尽编程!!! 爱已严重死机!情必须重新启动!情人已和服务器断开连接!网恋也需要重新拨号!-----激情依旧
2005-10-26 19:02
快速回复:请教一个链表合并的问题!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038437 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved