![数据结构2-线性表b)_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/11/90529f1d-c751-4c4b-988e-ba10d697404a/90529f1d-c751-4c4b-988e-ba10d697404a1.gif)
![数据结构2-线性表b)_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/11/90529f1d-c751-4c4b-988e-ba10d697404a/90529f1d-c751-4c4b-988e-ba10d697404a2.gif)
![数据结构2-线性表b)_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/11/90529f1d-c751-4c4b-988e-ba10d697404a/90529f1d-c751-4c4b-988e-ba10d697404a3.gif)
![数据结构2-线性表b)_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/11/90529f1d-c751-4c4b-988e-ba10d697404a/90529f1d-c751-4c4b-988e-ba10d697404a4.gif)
![数据结构2-线性表b)_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/11/90529f1d-c751-4c4b-988e-ba10d697404a/90529f1d-c751-4c4b-988e-ba10d697404a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构 华中科技大学计算机学院(3)- 2001-3-122.3 线性表的链式存储结构2.3.1单链表 1 单链表的结点结构: data next 前驱a(i-1) ai 后继a(i+1) 结点类型说明 例1 C语言的“结构”类型: struct node ElemType data; /data为抽象元素类型 struct node *next; /next为指针类型 ; 指向结点的指针变量head,p,q说明: struct node *head,*p,*q; 例2 用typedef定义指针类型: typedef struct Lnode ElemType data; /data为抽象元
2、素类型 struct node *next; /next为指针类型 *Linklist; 指针变量head,p,q的说明: Linklist head,p,q; 2.单链表的一般形式: (1)不带表头结点的单链表: data next head - a1 - a2 - .- an 头指针 首结点 尾结点 其中:data称为数据域,next称为指针域/链域 当 head=NULL,为空表;否则为非空表 (2)带表头结点的单链表: a.非空表: data next head - / - a1 -.- an 头指针 表头结点 首结点 尾结点 b.空表: data next head - / 头指针
3、表头结点其中:head指向表头结点, head-data不放元素, head-next指向首结点a1, 当head-next=NULL,为空表;否则为非空表。 3.单链表操作和算法举例: (1) 生成单链表。 例1 输入一列整数,以0为结束标志,生成“先进先出”单链表。 若输入:2,8,5,0,则生成: tail head - / - 2 - 8 - 5 - 0 #define NULL 0 /定义符号常量NULL#define LENG sizeof(struct Lnode) /结点所占的单元数 struct Lnode /定义结点类型 int data; /data为整型 struct
4、node *next; /next为指针类型 ;/初始化: head/输入2: headtailtail2p每次输入新元素后:生成新结点;p=malloc(结点大小); p-data=e; p-next=NULL; 添加到表尾;tail-next=p; 设置新表尾。tail=p;/headtail82输入8:p先进先出表的产生过程先进先出表的产生过程(1,2,3,4,0):headp/12340pppp头指针头指针 头结点头结点tailhead=malloc(sizeof(struct node)tail=headtailp=malloc(sizeof(struct node)tail-nex
5、t=ptail=pp=malloc(sizeof(struct node)tailtail-next=ptail=ptailtailtailtail-next=NULL; 算法:生成“先进先出”单链表(链式队列)struct Lnode *creat1( ) struct Lnode *head,*tail,*p; /变量说明 int e; head=(struct Lnode *)malloc(LENG); /生成表头结点 tail=head; /尾指针指向表头 do p=(struct Lnode *)malloc(LENG);/生成新结点 scanf(“%d”,&e); /输入一
6、个数 p-data=e; /装入输入的元素e tail-next=p; /新结点链接到表尾 tail=p; /尾指针指向新结点 while (e!=0); /不为0 tail-next=NULL; /尾结点的next置为空指针 return head; /返回头指针 例2 生成“后进先出”单链表(链式栈)。输入:2,8,5,0,生成: head - / - 0 - 5 - 8 - 2 算法:struct Lnode *creat2( ) /生成“后进先出”单链表 struct Lnode *head,*p; head=(struct Lnode *)malloc(LENG);/生成表头结点 h
7、ead-next=NULL; /置为空表 do p=(struct Lnode *)malloc(LENG);/生成新结点 scanf(“%d”,&(p-data);/输入数,送新结点的data p-next=head-next; /新结点插入表头结点之后 head-next=p; /尾指针指向新结点 while (p-data!=0); /不为0 return head; /返回头指针 /初始化: head/输入2: head2p每次输入新元素后:生成新结点; p=malloc(结点大小); p-data=e; 新结点指针指向首元素;p-next=head-next; 新结点作为首元
8、素: head-next=p;/head28输入8:p(2) 插入一个结点 例1 在递增有序单链表(0,2,5,10)中插入元素4: head - / - 0 - 2 - 5 - 10 q p f - 4 执行: f=(struct Lnode *)malloc(LENG); /生成新结点 f-data=4; /装入元素4 f-next=p; /结点5的地址送入结点4的next q-next=f; /结点4的地址送入结点2的next 变为:head- / - 0 - 2 - 4 - 5 - 10 q f p 例2 输入一列整数,以0为结束标志,生成递增有序单链表。(不包括0)/14710171
9、471017headheadp!=NULL&ep-data真假插入算法返回headheadppqp-nextpNULLqnew(f) ef-datap=NULLp=headhead=NULL假真fheadfq-nextNULLf-nextfq-nextqf-nextpf-nextfhead假假真真 空表插入; 尾部插入; 首部插入; 一般插入。e为新元素值不带头结点算法例2 生成不带头结点的递增有序单链表。(不包括0)struct Lnode struct Lnode * * creat3_1(struct Lnode creat3_1(struct Lnode * *headhead
10、,intint e) e) q=NULL q=NULL; p=headp=head; /q,p/q,p扫描扫描, ,查找插入位置查找插入位置 while (p & ep-data) /while (p & ep-data) /未扫描完未扫描完, ,且且e e大于当前结点大于当前结点 q=p q=p; p=p-nextp=p-next; /q,p /q,p后移后移, ,查下一个位置查下一个位置 f=(struct Lnode f=(struct Lnode * *)malloc)malloc(LENG)(LENG); /生成新结点生成新结点 f-data=ef-data=e; /
11、装入元素装入元素e e if (p=NULL) if (p=NULL) f-next=NULL; f-next=NULL; if (head=NULL) /(1) if (head=NULL) /(1)对空表的插入对空表的插入 head=f; head=f; else q-next=f; /(2) else q-next=f; /(2)作为最后一个结点插入作为最后一个结点插入 else if (q=NULL) /(3)else if (q=NULL) /(3)作为第一个结点插入作为第一个结点插入 f-next=p; head=f;f-next=p; head=f; else else f-ne
12、xt=p f-next=p; q-next=fq-next=f; /(4) /(4)一般情况插入新结点一般情况插入新结点 return head;return head; p!=NULL&ep-data真假插入算法返回headheadppqp-nextpNULLqnew(f) ef-dataq=NULL假真NULLf-nextfq-next 作为第一元素或首元素插入;一般插入或作为尾元素插入;e为新元素值fheadpf-nextmain()struct Lnode *head; /定义头指针head=NULL; /置为空表scanf(“%d”,&e); /输入整数while (
13、e!=0); /不为 0,未结束 head=creat3_1(head,e); /插入递增有序单链表 scanf(“%d”,&e); /输入整数 p!=NULL&ep-data真插入算法返回head-nextppqp-nextpheadq假fq-nextqf-next带头结点算法new(f) ef-data例2 生成带头结点的递增有序单链表。(不包括0)算法: void creat3_2(struct Lnode *head,int e) q=head; p=head-next;/q,p扫描,查找插入位置 while (p & ep-data) /未扫描完,且e大于当前
14、结点 q=p; p=p-next; /q,p后移,查下一个位置 f=(struct Lnode *)malloc(LENG);/生成新结点 f-data=e; /装入元素e f-next=p; q-next=f; /插入新结点main()head=(struct Lnode *)malloc(LENG);/生成表头结点head-next=NULL; /置为空表scanf(“%d”,&e); /输入整数while (e!=0); /不为 0,未结束 creat3_2(head,e); /插入递增有序单链表head scanf(“%d”,&e); /输入整数 (3) 在单链表中删除
15、一个结点例 q p data next next . - A - B - C - . 删除B执行:q-next=p-next; /A的next域=C的地址(B的next域) q p data next next . - A B - C - . 执行:free(p);/释放p所指向的结点空间 q p data next . - A C - . 算法:在带表头结点的单链表中删除元素为e的结点 struct Lnode *delet_e(struct Lnode *head, int e) /head为头指针,删除结点e struct Lnode *q,*p; q=head; p=head-next
16、; /q,p扫描 while (p & p-data!=e) /查找元素为e的结点 q=p; /记住前一个结点 p=p-next; /查找下一个结点 if (p) /有元素为e的结点 q-next=p-next; /删除该结点 free(p); /释放结点所占的空间 return head; /返回头头指针 (4) 将两个有序单链表La和Lb合并为有序单链表Lc:例: pa La - / 2 5 pb Lb - / 3 8 20 pc Lc - / 2 3 5 8 20 算法: void merge(La,Lb,Lc) struct Lnode *La,*Lb,*Lc; struct
17、Lnode *pa,*pb,*pc; pa=La-next; /pa指向表La的首结点 pb=Lb-next; /pb指向表Lb的首结点 pc=*Lc=La; /使用表La的头结点,pc为尾指针 free(Lb); /释放表Lb的头结点 while (pa & pb) /表La表Lb均有结点 if (pa-datadata) /取表La的一个结点 pc-next=pa; /插在表Lc的尾结点之后 pc=pa; /变为表Lc新的尾结点 pa=pa-next; /移向表La下一个结点 else /取表Lb的一个结点 pc-next=pb; /插在表Lc的尾结点之后 pc=pb; /变为表L
18、c新的尾结点 pb=pb-next; /移向表Lb下一个结点 if (pa) pc-next=pa; /插入表La的剩余段 else pc-next=pb; /插入表Lb的剩余段 A12(x)=1+3x5-7x12/-1A1035712 B17 (x) =6+3x3 -3x5+12x17/-1B6033-351217 papbcoefexpnnext多项式的链表表示:多项式的链表表示:/-1C70337121217 pcC(x)=A(x)+B(x)C(x)=A(x)+B(x)的算法步骤:的算法步骤:1。pa、pb分别指向首元素结点,产生C(x)的空链表,pc指向头结点;2。 pa不为空并且pb
19、不为空,重复下列操作: 2-1 pa-expn等于pb-expn (a) pa-coef+pb-expn不等于零: 产生新结点,添加到pc后, pc指向新结点。 pa、pb后移 (b) pa-coef+pb-expn等于零: pa、pb后移 2-2 pa-expn小于pb-expn:根据pa产生新结点,添加到pc后, pc指向新结点pa后移 2-3 pa-expn大于pb-expn:根据pb产生新结点,添加到pc后, pc指向新结点pb后移3。pa为空,取pb剩余结点产生新结点, pb为空,取pa剩余结点产生新结点,4.静态链表-用一维数组描述的链表例 序号 data next 0 / 1 1
20、 A 2 2 B 3 3 C 4 4 D 5 5 E 0 6 / / 7 / / head - / 1 A 2 B 3 C 4 D 5 E 0 0 1 2 3 4 5 头指针 表头结点 首结点 尾结点2.3.2 循环链表 1.一般形式 (1) 带表头结点的非空循环单链表 H - / a1 a2 . an 头指针 表头结点 首结点 尾结点 有:H-nextH, HNULL (2) 带表头结点的空循环单链表 H - / 头指针 表头结点 有:H-next=H, HNULL 2.只设尾指针的循环链表 (1)非空表 / a1 a2 . an tail 表头结点 首结点 尾结点 尾指针 有:tail指向
21、表尾结点 tail-data=an tail-next 指向表头结点 tail-next-next指向首结点 tail-next-next-data=a1 (2) 空表 / tail 表头结点 尾指针 有:tail-next=tail 例:两循环链表首尾相连。/141017head1/11520head2/141017/11520tail1tail2(1) p2=tail2-next; (2) tail2-next=tail1-next;(3) tail1-next=p2-next; (4) free(pb); 时间复杂度: O(1)p2时间复杂度: O(m+n)3.循环链表算法举例 例. 求
22、以head为头指针的循环单链表的长度, 并依次输出结点的值。 算法: int length(struct Lnode *head) int leng=0; /长度变量初值为0 struct Lnode *p; p=head-next; /p指向首结点 while (p!=head) /p未移回到表头结点 printf(“%d”,p-data);/输出 leng+; /计数 p=p-next; /p移向下一结点 return leng; /返回长度值 2.3.4 双向链表 1.双向链表的结点结构: prior data next 前驱a(i-1) ai 后继a(i+1) 结点类型定义 struc
23、t Dnode ElemType data; /data为抽象元素类型 struct Dnode *prior,*next; /prior,next为指针类型 ; 或者 typedef struct Dnode ElemType data; /data为抽象元素类型 struct Dnode *prior,*next; /prior,next为指针类型 *DLList /DLList为指针类型2.双向链表的一般形式(1)非空表 prior data next L / a1 a2 . an 表头结点 首结点 尾结点 有:L为头指针,L指向表头结点,L-next指向首结点 L-next-data=a1 L-prior指向尾结点, L-prior-data=an L-next-prior= L-prior-next=NULL(2)空表 L / 表头结点 有:L-next=L-prior=NULL3.双向循环链表(1)空表 L / 有:L-next=L-prior=L 表头结点 (2)非空表 prior data next L / a1 . an 表头结点 p 尾结点 设p指向a1, 有: p-next指向a2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临时工合作合同书
- 人力资源专员聘用合同范本
- 居间服务担保合同
- 2025年新能源汽车充电服务合同
- 事故损害赔偿合同约定2025
- 事业单位员工劳动合同详解
- 了解市场:合同反担保与担保合同的不同之处
- 个人与企业贷款保证合同样本
- 买卖合同书范本
- 临时工劳动合同实施细则
- “5E”教学模式下高中数学教学实践研究
- 急救药品知识培训内容
- 人教版初中英语单词大全七八九年级(带音标) mp3听力音频下载
- 浙江省杭州市2024-2025学年高三上学期一模英语试题(含解析无听力原文及音频)
- 2024年湖南高速铁路职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 部编版六年级下册语文第3单元习作例文+习作PPT
- 四年级上册英语试题-Module 9 Unit 1 What happened to your head--外研社(一起)(含答案)
- 子宫内膜异位症诊疗指南
- 《高级计量经济学》-上课讲义课件
- 玩转数和形课件
- 护理诊断及护理措施128条护理诊断护理措施
评论
0/150
提交评论