链表输出函数合并,函数内合并正常,但是输出却为空

博客访问: 106011
博文数量: 94
博客积分: 2000
博客等级: 大尉
技术积分: 960
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
list链表合并(如何合并两个链表)
(1)void list::merge(list &x)
函数说明:将两个已经按相同排序方法排好序的List链表合并,合并后的List链表也是有序的。该函数将会删除list x 链表的所有元素。
&&&&&&& 调用该函数前,经常需要对要合并的链表进行排序,可以调用sort函数来实现。
&&&&&&& 当然,你也可以将无序的链表进行合并,不过合并后的链表也是无序的。
#include&iostream&#include&list&int main(void){&list&int& list1;&list1.push_back (9);&list1.push_back (3);&list1.push_front(4);
//list1排序&list1.sort();&list&int& list2(2,5);&list2.push_back (20);
//list2排序&list2.sort ();
//调用合并函数进行合并&list1.merge (list2);
&list&int&::&for(li=list1.begin();li!=list1.end();li++)&&cout&&*li&&", ";&cout&&
&if(list2.empty())
&&& cout&&"list2 is empty."&&
&return 0;}
&&&& 3,4,5,5,9,20,
&&&& list2 is empty.
记住:如果两个list都按相同的方法M排好了序,那么这两个list合并后所得的list也是有序的,而且排序方法也是M。M可以是升序,降序等等。只要你合并的list中有一个是无序的,或者两个list排序方法不同,那么合并后的list也将是无序的。另外:作为参数的list合并后,里面所以元素都被删除了。
(2)template&class Cmporder&
void list::merge(list&x,Cmporder comp)
参数说明:Cmporder comp 理解成一个排序方法就可以了。例如:升序,降序等等。
函数说明:将两个已经按相同排序方法M排好序的List链表按comp排序方法进行合并,如果M和comp排序方法相同,那么合并后的List链表也是按comp方法排序的。该函数将会删除list x 链表的所有元素。
&&&&&&& 调用该函数前,经常需要对要合并的两个list链表进行排序,可以调用sort函数来实现。
&&&&&&& 当然,你也可以将无序的链表进行合并,不过合并后的链表也是无序的。
记住:调用此函数得到的list只有在下列条件同时成立时才是有序的:
&&&&&1.被合并的两个list按相同方法M排序。
&&&& 2.调用函数时,M作为排序方法参数传进去。
& 链表1&&&&&&&链表2&&&&&&&&&&合并排序方法&&&&结果
list1无序&&list2(无论是否有序)&任取&&&&&& 合并后的list无序
list1升序&&list2(降序或者无序)&任取&&&&&&&合并后的list无序
list1升序&&list2升序&&&&&&&&&&不是升序&&& 合并后的list无序
list1升序&&list2升序&&&&&&&&&&升序&&&&&& 合并后的list升序
#include&iostream&#include&list&#include&string&#include&functional&int main(void){&list&int& list1;&list1.push_back (9);&list1.push_back (3);&list1.push_front(4);&cout&&
&//降序排序&list1.sort();&list&int& list2(2,5);&list2.push_back (20);
&//降序排序&list2.sort ();
&//排序方法less&int&(),降序。&list1.merge (list2,less&int&());
&list&int&::
&//输出3,4,5,5,9,20,&for(li=list1.begin();li!=list1.end();li++)&& cout&&*li&&", ";&cout&&
& return 0;}
最后说明一下:算法中也有实现合并功能的函数,但成员函数效率往往比相同功能的算法函数高,所以最好调用成员函数。
阅读(1548) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。第二章习题参考答案;一、判断题;1.线性表的逻辑顺序与存储顺序总是一致的;2.顺序存储的线性表可以按序号随机存取;3.顺序表的插入和删除一个数据元素,因为每次操作;4.线性表中的元素可以是各种各样的,但同一线性表;5.在线性表的顺序存储结构中,逻辑上相邻的两个元;6.在线性表的链式存储结构中,逻辑上相邻的元素在;7.线性表的链式存储结构优于顺序存储结构;8.
习题参考答案
一、 判断题
1.线性表的逻辑顺序与存储顺序总是一致的。(ERROR)
2.顺序存储的线性表可以按序号随机存取。(OK)
3.顺序表的插入和删除一个数据元素,因为每次操作平均只有近一半的元素需要移动。 (OK)
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。(OK)
5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。(ERROR)
6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。(OK)
7.线性表的链式存储结构优于顺序存储结构。(ERROR)
8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。(OK)
9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。(OK)
10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。(ERROR)
二、 单选题、 (请从下列A,B,C,D选项中选择一项)
11.线性表是( A ) 。
(A) 一个有限序列,可以为空;
(B) 一个有限序列,不能为空;
(C) 一个无限序列,可以为空;
(D) 一个无序序列,不能为空。
12.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。插入一个元素时平均要移动表中的(A)个元素。
13.线性表采用链式存储时,其地址( D ) 。
(A) 必须是连续的;
(B) 部分地址必须是连续的;
(C) 一定是不连续的;
(D) 连续与否均可以。
14.用链表表示线性表的优点是 (C )。
(A)便于随机存取
(B)花费的存储空间较顺序存储少
(C)便于插入和删除
(D)数据元素的物理顺序与逻辑顺序相同
15. 某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( D )存储方式最节省运算时间。
(C)单循环链表
(D)带头结点的双循环链表
16. 循环链表的主要优点是( D ) 。
(A)不再需要头指针了
(B)已知某个结点的位置后,能够容易找到他的直接前趋
(C)在进行插入、删除运算时,能更好的保证链表不断开
(D)从表中的任意结点出发都能扫描到整个链表
17. 下面关于线性表的叙述错误的是( B )。
(A) 线性表采用顺序存储,必须占用一片地址连续的单元;
(B) 线性表采用顺序存储,便于进行插入和删除操作;
(C) 线性表采用链式存储,不必占用一片地址连续的单元;
(D) 线性表采用链式存储,便于进行插入和删除操作;
18. 单链表中,增加一个头结点的目的是为了(C )。
(A) 使单链表至少有一个结点
(B)标识表结点中首结点的位置
(C)方便运算的实现
(D) 说明单链表是线性表的链式存储
19. 若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(D )存储方式最节省运算时间。
(A) 单链表
(B) 仅有头指针的单循环链表
(C) 双链表
(D) 仅有尾指针的单循环链表
20. 若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用( )存储方式最节省运算时间(B )。
(A) 单链表
(B) 顺序表
(C) 双链表
(D) 单循环链表
21. 一个向量(一种顺序表)第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是_______。
[第5个元素的地址=100+2*(5-1)=108]
22. 不带头结点的单链表head为空的判定条件是______。
A. head = = NULL;
B. head-&next = = NULL;
C. head-&next = =
D. head! = NULL;
23. 带头结点的单链表head为空的判定条件是______。
A. head = = NULL;
B. head-&next = = NULL;
C. head-&next = =
D. head! = NULL;
24. 在循环双链表的p所指结点之后插入s所指结点的操作是_____。
p-&right=s; s-&left=p; p-&right-&left=s; s=-&right=p-&
p-&right=s; p-&right-&left=s; s-&left=p; s-&right=p-&
s-&left=p; s-&right= p-& p-&right=s; p-&right-&left=s;
s-&left=p; s-&right=p-& p-&right-&left=s; p-&right=s;
25. 在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行______。
A. s-&next=p-& p-&next=s;
B. p-&next=s-& s-&next=p;
C. q-&next=s; s-&next=p;
D. p-&next=s; s-&next=q;
26. 从一个具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需平均比较_____个结点。(参见网上讲义:1.4.2例1_5)
C. (n-1)/2;
D. (n+1)/2;
27. 给定有n个结点的向量,建立一个有序单链表的时间复杂度_______。
D. O(nlog2n);
三、 填空题
28. 在一个长度为n的向量中的第i个元素(1≤i≤n)之前插入一个元素时,需向后移动_____个元素。
29. 在一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动_____个元素。
30.在一个单链表中p所指结点之前插入一个由指针s所指结点,可执行以下操作:
s-&next=__p-&next_____;
p-&next=s;
p-&data=___s-&data________;
s-&data=___t________;
四、算法设计题:
31. 有一个单链表(不同结点的数据域值可能相同),其头指针为head,编写一个函数计算数据域为x的结点个数。
解:本题是遍历通过该链表的每个结点,每遇到一个结点,结点个数加1,结点个数存储在变量n中。实现本题功能的函数如下:
int count (head, x)
/*本题中head 为链头指针,不含头结点*/
while (p!=NULL)
(p-&data= =x) n++;
return(n);
32. 有一个有序单链表(从小到大排序),表头指针为head,编写一个函数向该单链表中插入一个元素为x的结点,使插入后该链表仍然有序。
解:本题算法的思想是先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找出该结点的位置,最后插入该结点。实现本题功能的函数如下:
node *insertorder(head, x)
/*本题中head 为链头指针,不含头结点*/
node *s, *p, *q;
s=(node *)malloc(sizeof(node));
/* 建立一个待插入的结点*/
s-&data=x;
s-&next=NULL;
if (head= =NULL ‖ x&head-&data)
/* 若单链表为空或x小于第一个结点的data域*/
/* 则把s结点插入到表头后面*/
/*为s结点寻找插入位置,p指向待比较的结点,q指向p的前驱结点*/
while (p!=NULL && x&p-&data)
/* 若x小于p所指向的data域值*/
if (x & p-&data)
/* 将s结点插入到q和p之间*/
q-&next=s;
return(head);
33. 编写一个函数将一个头指针为a的单链表A分解成两个单链表A和B,其头指针分别为a和b,使得A链表中含有原链表A中序号为奇数的元素,而B
链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
解:其函数是将单链表A中的所有偶数序号的结点删除,并在删除时把这些结点链接起来构成单链表B。实现本题功能的函数如下:
void disa(a, b)
node *a, *b;
/*本题中a、b为链头指针,不含头结点*/
node *r, *p, *q;
while (p!=NULL && p-&next!=NULL)
/* q指向偶数序号的结点*/
p-&next=q-&
/* 将q从原A中删除掉*/
r-&next=q;
/* 将q结点链接到B链表的末尾*/
/* r总是指向B链表的最后一个结点*/
/*p指向原链表A中的奇数序号的结点*/
r-&next=NULL;
/* 将生成B链表中的最后一个结点的next域置空*/ }
34. 假设有两个已排序的单链表A和B,编写一个函数将它们合并成一个链表C而不改变其排序性。
解:这里采用链表合并的方法,设原两链表的头指针分别为p和q,每次比较p-&data和q-&data的值,把值较小的结点作为新链表的结点,这一过程直到一个链表为空为止。当一个链表为空而另一个链表不为空时,只要将不空的链表指针赋给新链表中最后一个结点的指针即可。实现本题功能的函数如下:
node *mergelink(p, q)
node *p, *q;
/*本题中p、q为链头指针,不含头结点。*/
/*但为操作方便,过程中要为链表C建立一个临时头结点。*/
node *h, *r;
h=(node *)malloc(sizeof(node));
/* 建立头结点*/
h-&next=NULL;
while (p!=NULL && q!=NULL)
if (p-&data&=q-&data)
r-&next=p;
三亿文库包含各类专业文献、外语学习资料、中学教育、幼儿教育、小学教育、文学作品欣赏、专业论文、高等教育、31Ch2习题参考答案等内容。 
 6 炔烃与二烯烃习题参考答案_财会/金融考试_资格考试/认证_教育专区。有机化学...8. (1) O CH3CH2CH2-C C-CH2CH3 + H2O HgSO4+H2SO4 CH3CH2CH2-...  CCH2CH CH2 sp sp sp3 sp2 sp2 (5) H2C C CHCH3 sp sp sp 2 2 (6) H3C COOH 3 sp sp3 sp2 第二章烷烃习题参考答案 1.解: CH3CH2CHCH2CH2...  有机化学练习(2)参考答案_农学_高等教育_教育专区。《有机化学》练习题(二) ...(或 I2+NaOH × Cl2 C 500 ° CH2=CHCH2Cl COOC2H5 CH Na COOC2H5 )...  高一化学必修2课后习题 参考答案(全)_高一理化生_理化生_高中教育_教育专区。...气体颜色逐渐变浅,量筒内壁 CH3Cl、 2Cl2、 CH CHCl3、 取代 光照 有油状...  ch5课后部分习题答案 ch6课后部分习题答案 ch7课后部分习题答案1...一、问答题 1.界面设计 编写事件过程代码 运行、调试 保存文件 2.涉及到两个...  工程化学基础(第二版)练习题参考答案 浙大版_理学_高等教育_教育专区。答案呀!...5. 名称 聚丙烯 化学式 [ CH 类型 碳链高分子 CH2 ] n CH3 聚丙烯腈 [ ...  习题及答案_工学_高等教育_教育专区。习 题 1 1...(1) CH2=CHF (2) CH2=CH(CH3)2 CH3 | (3...2014年12月大学英语四级经典参考范文 78份文档
笑...  [DI+1000H],CH MOV [BP+SI],DH MOV [BX+DI],DL 2.7 0000H, 0880H, 0081H,
NEG AX, 2.9 (1) AND AX,7FFFH 第二章习题参考答案 ...  有机化学习题2及答案_理学_高等教育_教育专区。有...(二) 及参考答案满分:100 分 题号 得分 一 考试...CH3MgBr 2) H3O+ Al(OCH(CH3)2)3 CH3COCH3 ...单项链表基本函数以及链表合并
单项链表基本函数以及链表合并
编辑:www.fx114.net
本篇文章主要介绍了"单项链表基本函数以及链表合并",主要涉及到单项链表基本函数以及链表合并方面的内容,对于单项链表基本函数以及链表合并感兴趣的同学可以参考一下。
#include &stdlib.h&
#include &stdio.h&
#define LEN sizeof(DAT)
#define TRUE 1
#define FALSE -1
#define NULL 0
typedef struct LNode{
struct LNode *
void InitList(DAT *head)//创建空表
head = (DAT *)malloc(LEN);
{printf(&\n--链表创建失败--\n&);exit(FALSE);}
head -&next = NULL;
DAT *creatList(DAT *head)//数据录入
DAT *p1,*p2;
int n = 1;
head = (DAT *)malloc(LEN);
p1 = p2 = (DAT *)malloc(LEN);
if(p1 != NULL)
printf(&\n请输入数据:\n&);
scanf(&%d&,&p1-&data);//p1需要存储数据,每一次存储都需要申请空间
head -& next = p1;//注意:本程序的头结点不存储数据,因为ClearList函数和destroyList函数无法区分实现
//所以ListTraverse输出函数也是从头结点的下一个才开始输出的!
//p2 = p1;为什么这步可以省略呢?就是因为p1,p2在申请空间的时候被赋予的地址是一致的!
printf(&\n继续录入(y/any other keys to exit)?\n&);
getchar();
scanf(&%c&,&ch);
while(ch == 'Y'||ch == 'y')
printf(&\n请输入数据:\n&);
p1 = (DAT *)malloc(LEN);
if(p1 != NULL)
scanf(&%d&,&p1-&data);
p2 -& next = p1;
printf(&\n继续录入(y/any other keys to exit)?\n&);
getchar();
scanf(&%c&,&ch);
p2 -& next = NULL;//p2作为连接新建节点的指针,如果next为空,那自然是结束了录入
printf(&\n--录入结束--\n&);
int ClearList(DAT *head) //保留头结点,其余节点数据清空
if(head == NULL)
printf(&\n--表不存在--\n&);
return FALSE;
DAT *p,*q;
p = head -&
q=p-&//用声明的另一个指针q来记录p的下一节点的位置
printf(&\n--已删除表中数据:%d--\n&,p -& data);
p=q;//结合q = p -& next,此语句的作用即是让p往后移动,从而实现逐个清空数据的目的
}//直至p为空的时候便是结束了循环,清空结束
head -& next = NULL; //数据清空之后头结点的指针域为空
return TRUE;
DAT *destroyList(DAT *head)//与清空链表函数不同,销毁需要把头结点也一同清除,清楚后将无法再录入数据
if(head == NULL)
printf(&\n--表不存在,销毁无效--\n&);
exit(FALSE);
while(head)
p = head -&
free(head);//第一次循环的时候清除了头结点
printf(&\n--链表销毁结束--\n&);
int ListLength(DAT *head)
int i = 0;
p = head -&
printf(&\n--链表长度为:%d--\n&,i);
void ListTraverse(DAT *head)//输出函数
DAT *p = head -&
DAT *q =//位序输出遍历需要
int n = 0;
int length = ListLength(head);
printf(&\n位序 | &);
for(n = 1;n &=n++)
if(q -& data &10)
printf(&%d &,n);
else if(q -& data &100)
printf(&%2d &,n);
printf(&%3d &,n);
printf(&\n------------------------------------\n&);
printf(&数据 | &);
printf(&%d &,p -& data);
printf(&\n&);
int GetElem(DAT *head,int i,int e)
int n = 1;
p = head -&
while(p && n & i )//当p不为空且初始位序小于查找位序的时候
p = p -&//指针后移,直至与查找位序相等为止推出循环
if(!p || n & i)
{printf(&\n--找不到该位序--\n&);return FALSE;}
int LocateElem(DAT *head,int e)//查找e的位序,并将其位序返回
int i = 1;
printf(&\n请输入你要查找的数据:\n&);
scanf(&%d&,&e);
p = head -&
if(p -& data == e)
printf(&\n--%d的位序为:%d--\n&,e,i);
printf(&\n--找不到该元素--\n&); return 0;
int PirrorElem(DAT *head,int cur_e,int pre_e)//查找元素的前驱
printf(&\n请输入表中数据,系统将会返回其的前驱:\n&);
scanf(&%d&,&cur_e);
if(head == NULL)
printf(&\n--表不存在--\n&);
return FALSE;
DAT *p,*q;
q = head -&//q指向第一个节点
p = q -&//p指向q的下一节点
if( q -& data == cur_e)//cur_e为第一个元素的时候,提示错误
printf(&\n--表中第一个元素是没有前驱的,无法查找--\n&);
return FALSE;
if(p -& data == cur_e)//如果p指针找到了cur_e,就用q返回前驱
pre_e = q -&
printf(&\n--%d的前驱是:%d--\n&,cur_e,pre_e);
return pre_e;
if( p -& next != NULL)
q =//p,q指针相连,q后移也会带动p的后移
else// p遍历结束达到NULL的时候即是没有找到输入的数据,提示错误
printf(&\n--表中无此数据--\n&);
return FALSE;
int NextElem(DAT *head,int cur_e,int next_e)//查找元素的后继
DAT *p,*q;
printf(&\n请输入数据,系统将会返回其的后继:\n&);
scanf(&%d&,&cur_e);
p = head -&
if( p -& data == cur_e && p -& next != NULL)//p没有下一节点的话,也就没有后继之说了
next_e = q -&
printf(&\n-%d的后继为:%d--\n&,cur_e,next_e);
return next_e;
if( p -& data != cur_e)
p =//p -& next 不为空的时候,p,q后移遍历
if( p -& next == NULL && p -& data == cur_e )//判断是否有后继
printf(&\n--末位的数据是没有后继的,无法查找--\n&);
return FALSE;
if( p -& next == NULL && p -&data != cur_e)//判断时候存在cur_e
printf(&\n--表中不存在该元素--\n&);
return FALSE;
DAT *ListInsert(DAT *head,int i,int e)//按位序i插入特定元素e
//定义结构体指针函数,用于返回结构体指针head
printf(&\n请输入插入的位序和元素\n&);
scanf(&%d%d&,&i,&e);
DAT *p =//和下面n = 0相对应,head无数据
int n = 0;
while(p != NULL && n & i-1)//找到i的前一个节点
p = p -&//循环第一次的时候p便指向了第一个节点,和n=1对应
n++;//n = 1
}//出循环时n=i-1,p也就指向了i的前一位序
if(p == NULL || n & i-1)//i过大(插入的位序的前一个如果还是空的话,那就超出了插入范围)或过小的时候报错,退出
printf(&\n--位序错误,插入失败--\n&);
q = (DAT *)malloc(LEN);//新节点空间申请
q -& data =//新节点赋值
q -& next = p-&//新节点定位(p -& next为第i个节点),将新节点与原表中第i个节点相连,即是替换了第i的位置
//如果是表尾插入的话,q -& next == NULL
p -& next =//再将新节点与前面的p节点相连,即完成了插入
printf(&\n--%d已添加到表中第%d位序--\n&,e,i);
//返回头指针,方便打印链表
DAT *ListInsert_last(DAT *head,int e)//表尾插入函数
//定义结构体指针函数,用于返回结构体指针head
int leng = ListLength(head);
DAT *p =//和下面n = 0相对应,head无数据
int n = 0;
while(p != NULL && n & leng)//找到尾节点,在尾节点的后一节点添加数据
p = p -&//循环第一次的时候p便指向了第一个节点,和n=1对应
n++;//n = 1
}//出循环时n=leng,p也就指向了表尾
if(p == NULL || n & leng)//i过大(插入的位序的前一个如果还是空的话,那就超出了插入范围)或过小的时候报错,退出
printf(&\n--位序错误,插入失败--\n&);
q = (DAT *)malloc(LEN);//新节点空间申请
q -& data =//新节点赋值
q -& next = p-&//新节点定位(p -& next为第i个节点),将新节点与原表中第i个节点相连,即是替换了第i的位置
//如果是表尾插入的话,q -& next == NULL
p -& next =//再将新节点与前面的p节点相连,即完成了插入
printf(&\n--%d已添加到表尾--\n&,e);
//返回头指针,方便打印链表
DAT *ListDelete(DAT *head,int i,int e)
printf(&\n请输入你要删除的位序:\n&);
scanf(&%d&,&i);
int n = 0;
while(p -& next != NULL && n & i - 1)//循环是为了找到要删除的节点的前驱,即p指向删除节点的上一个节点
if(p -& next == NULL || n & i -1)//i过大或过小的时候报错退出(要删除的节点不能为空)
printf(&\n--位序错误,删除失败--\n&);
q = p -&//q指向p的下一节点
p -& next = q -&//将p的下一节点绕到q的下一节点上去,完成对q节点的孤立,将q节点删除
e = q -&//用e返回被删除的节点上的数据
printf(&\n--表中第%d位序上的数据:%d已被删除--\n&,i,e);
#include &E.h&
void main()
//int i,e;
//int cur_e;
//int pre_e;
//int next_e;
//开始测试函数
//InitList(head);//创建空表
//head = creatList(head);//输入数据
//ListTraverse(head);//输出数据
//ListLength(head);//输出链表长度
//ClearList(head);//清空数据
//ListTraverse(head);//输出清空效果
//destroyList(head);
//ListTraverse(head);
//printf(&\n请输入你要查找的位序:\n&);
//scanf(&%d&,&i);
//e = GetElem(head,i,e);
//if(e != FALSE)
//printf(&\n--位序%d上的数据为:%d--\n&,i,e);
//PirrorElem(head,cur_e,pre_e);
//NextElem(head,cur_e,next_e);
//head = ListInsert(head,i,e);
//head = ListDelete(head,i,e);
//ListTraverse(head);*/
//用自建函数合并两个不同数据的链表
DAT *L1 = NULL;
DAT *L2 = NULL;
DAT *L3 = NULL;
DAT *p1 = NULL;
DAT *p2 = NULL;
DAT *p3 = NULL;
DAT *p4 = NULL;
DAT *p5 = NULL;
int n = 0;
int m = 0;
int leng1;
int leng2;
int leng3;
int i = 0,j = 0,k = 0;
InitList(L1);
InitList(L2);
L1 = creatList(L1);
ListTraverse(L1);
L2 = creatList(L1);//录入两个链表数据
ListTraverse(L2);
leng1 = ListLength(L1);
leng2 = ListLength(L2);//链表长度获取
L3 = (DAT *)malloc(sizeof(DAT));//第三链表的建立,用于存储表一和表二中不重复的数据
p3 = p4 = (DAT *)malloc(sizeof(DAT));
if(leng1 &= leng2)
for(i = 0;i & leng2;i++)
if(p2 -& next != NULL)
{p2 = p2 -&}
for(j = 0; j & leng1;j++)
if(p1 -& next != NULL)
p1 = p1 -&
else//p1 -& next ==NULL的时候
p1 = L1 -&//重置p1回到L1的第一个节点
if(p2 -& data != p1 -& data)//表三数据链表的录入
{ printf(&\n--%d--\n&,p2-&data);
printf(&\n-|%d|-\n&,p1-&data);
printf(&\nm = %d\n&,m);
if(m == leng1)//将表二的一个数对比表一中所有的数,如果都不一样则将这个数插入表三
p3 -& data = p2 -&
if(p3 -& data != NULL)
if(n == 1)
L3 -& next = p3;
p4 -& next = p3;
p3 = (DAT *)malloc(sizeof(DAT));
p4 -& next = NULL;
m = 0;//重置m
if(m &leng1)//m小于leng1说明有数重复,为了下一个数的比较可以顺利进行,标志m也要重置
//因为是很久以前的数据结构作业,源文件已经找不到了,还好QQ空间当初留有图片(下面的图片衔接上一部分)
//少了一个花括号
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:}

我要回帖

更多关于 链表析构函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信