标题:请教一个链表合并的问题!!!!
只看楼主
蓝天
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2005-9-29
 问题点数:0 回复次数:3 
请教一个链表合并的问题!!!!

Ys06b1pS.txt (2.76 KB) 请教一个链表合并的问题!!!!

各位英雄好!小弟有一个问题要请教,请多多指点! 下面的程序是一个将两个单链表合成一个单链表的程序,其中要合并的两个单链表中的元素是按非递减排列,合并后链表也是按非递减排列; 我的程序的可以通过,而且还有结果输出,但就是结果不符,请各位高手帮忙看看其中出了什么问题,多谢! 个人QQ:455904362 E-mail: fyxeainnn@163.com #include"stdio.h" #include"stdlib.h" #include"iostream.h" #define ok 1 #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<<"please input a number:\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 find_list(pointer head,int i) //查找链表中指定位置的元素 { pointer p; p=head; int j=0; while((p->next!=NULL)&&(j<i)) { p=p->next; j++; } if(j==i) return p; else return NULL; }

void insert_list(pointer head,datatype x,int i) //在链表中插入元素 { pointer p; p=find_list(head,i-1); if(p==NULL) { cout<<"Error!\n"; } else { pointer s; s=(pointer)malloc(sizeof(lnode)); s->data=x; s->next=p->next; p->next=s; } }

datatype getelem(pointer head,datatype x,datatype &e) //将链表中的元素用E返回 { pointer p; p=head->next; int i=1; while((p!=NULL)&&(i<x)) { p=p->next; ++i; } if(!p&&i>x) cout<<"不存在第i个位置元素!\n"; return 0; e=p->data; return e; }

datatype length_list(pointer head) //求链表的长度 { int i=0; pointer p; p=head; while(p->next!=NULL) { p=p->next; i++; } return i; }

pointer combination_list(pointer A,pointer B,pointer C)//将链表A,B合成链表C,C中的元素仍按非递减排列 {

int i=1,j=1,k=0; int A_len=length_list(A); int B_len=length_list(B); int ai,bj; while((i<=A_len)&&(j<=B_len)) { getelem(A,i,ai); getelem(B,j,bj); if(ai<=bj) { insert_list(C,ai,++k); ++i; } else { insert_list(C,bj,++k); ++j; } } while(i<=A_len) { getelem(A,ai,++i); insert_list(C,ai,++k); } while(j<=B_len) { getelem(B,bj,++j); insert_list(C,bj,++k); } return C; }

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

cout<<"\n请输入链表B的元素:\n"; Blist=create_list(); //链表A中的元素按非递减排列 print_list(Blist);

Dlist=combination_list(Alist,Blist,Clist); print_list(Dlist); cout<<endl; }

搜索更多相关主题的帖子: 链表 单链 include define 
2005-09-29 20:30
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
得分:0 
我有个问题想问你,为什么你每个子函数前的状态都用point呢?

2005-10-02 17:20
fire77
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2005-9-19
得分:0 
你在插入元素时用的是头插法还是尾插法?明显出错!
是自己写的吗?有点乱哦~

2005-10-02 17:28
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
每个子函数前的状态都用pointer, 是因为在程序的最前面定义了这个类型
typedef struct node * pointer
另外,给楼主的程序提个建议, 在每次分配完空间之后都要判断空间分配是否成功,例如
l=(pointer)malloc(sizeof(lnode));
if( ! I )  exit (ERROR);
程序很容易因为空间分配不成功而出问题.
还有楼主应该把输入和输出结果发出来,这样便于判断错误发生的位置

我的征途是星辰大海
2005-10-03 12:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-29056-1-1.html




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

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