版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、在内存的表示一、在内存的表示 loc(ai) = loc(a1)+(i-1)* *len 顺序表的访问是顺序表的访问是 随机的。随机的。思考:算法的选择及效率思考:算法的选择及效率(1)每次删除)每次删除1个元素,做个元素,做k次次(2)一次将)一次将k个元素全部删除个元素全部删除已知顺序存储的线性表已知顺序存储的线性表 la la 和和 lb lb 中元素依值中元素依值 递增有序排列,归并这两个线性表得到一个新递增有序排列,归并这两个线性表得到一个新 的线性表的线性表 lc , lc lc , lc 中的元素也依值递增有序中的元素也依值递增有序 排列的。排列的。分析:分析: (1 1)
2、将将lala表和表和lblb表中的较小值归并至表中的较小值归并至lclc表中表中 (2 2) 当其中某个表结束后,将另一个表的剩余当其中某个表结束后,将另一个表的剩余部分归并至部分归并至lclc表中表中 void merge(sqlist lb, sqlist la, sqlist &lc)void merge(sqlist lb, sqlist la, sqlist &lc) / /将两个有序表将两个有序表lala和和lblb,归并为一个新的有序表,归并为一个新的有序表lclc i=1,j=1,k=0; i=1,j=1,k=0; /初始化初始化 if (la.length +
3、 lb.length=listsize) if (la.length + lb.length=listsize) lc.length = la.length + lb.length lc.length = la.length + lb.length while (i=la.length & j=lb.length) while (i=la.length & j=lb.length) / / 归并归并 if (la.vi=lb.vj) lc.v+k=la.vi+;if (la.vi=lb.vj) lc.v+k=la.vi+; else lc.v+k=lb.vj+; else lc
4、.v+k=lb.vj+; / / 将将lala表和表和lblb表中的较小值归并至表中的较小值归并至lclc表中表中 while (i=la.length) lc.v+k=la.vi+;while (i=la.length) lc.v+k=la.vi+; / /将将lala表的剩余部分归并至表的剩余部分归并至lclc表中表中 while (j=lwhile (j=lb.length) lc.v+k=lb.vj+;.length) lc.v+k=lb.vj+; / /或或 将将lblb表的剩余部分归并至表的剩余部分归并至lclc表中表中 例例2.1.4 2.1.4 已知线性表存于已知线性表存于a1
5、.MAXSIZEa1.MAXSIZE中的前中的前n n个分量个分量 中,写一算法删除表中所有值为中,写一算法删除表中所有值为0 0的元素(将非的元素(将非 0 0元素移到前面来),各元素间的相对位置不变。元素移到前面来),各元素间的相对位置不变。void alg4( int a, int &n ) /删除所有值为删除所有值为0的元素的元素 i=1; while(i=n)&(ai!=0) i=i+1; / 找到第找到第1个值为个值为0的结点的结点 for (j=i+1; jn) error( 参数错参数错 ); else for (i=1;i=k; i+) for(j=1;j0)
6、 j=1; for(i=2;i=n;i+) k=1; while(k=0)个元素的有限集。每个元素的类型是相同个元素的有限集。每个元素的类型是相同的,元素之间的位置关系是一维的,元素之间的位置关系是一维(线性线性)的。的。二、二、线性表存储结构线性表存储结构 1. 顺序存储顺序存储 2. 链式存储链式存储三、线性表的操作三、线性表的操作 插入、删除插入、删除、 定位、查找、排序定位、查找、排序 等等2.2 线性链表2.2.1 2.2.1 单向链表单向链表一、在内存的表示一、在内存的表示 (a,b,c,d)a,b,c,d) 在在b,cb,c之间插入之间插入x:x:(a,b,x,c,d)(a,b,
7、x,c,d)思考:比较顺序表与链表的不同。思考:比较顺序表与链表的不同。提示:从下面提示:从下面3 3个方面考虑个方面考虑(1 1)数据的逻辑顺序与物理顺序)数据的逻辑顺序与物理顺序(2 2)数据的存取(访问)数据的存取(访问)(3 3)数据的插入和删除操作)数据的插入和删除操作二、链表的表示二、链表的表示三算法设计三算法设计(一)(一)定位算法设计定位算法设计 1.1.功能功能 在链表中查找(定位于)第在链表中查找(定位于)第i i个结点,若存在,个结点,若存在,则返回该结点的地址,否则,返回空(则返回该结点的地址,否则,返回空(NULLNULL)。)。 2.2.算法思想算法思想 从头结点开
8、始,逐个查找(从头结点开始,逐个查找(后移)后移)并计数,直到并计数,直到第第i i个止。个止。3. 3. 算法设计算法设计node node * *loc(node loc(node * *head, int i) head, int i) /head: /head:带头结点的单链表的头指针,该算法定位于链表中的第带头结点的单链表的头指针,该算法定位于链表中的第i i个结点个结点 node node * *p=head;p=head; /指针初始化指针初始化, p, p指向头结点指向头结点 j=0; j=0; / j/ j为计数器,初值为为计数器,初值为0 0 while (p!=NULL)
9、&(ji) while (p!=NULL)&(jnext; j+; p=p-next; j+; /p/p后移,后移,j j计数计数, p, p移至第移至第i i个结点止个结点止。 return (p); return (p); / p/ p指向第指向第i i个结点(返回第个结点(返回第i i个结点的地址)个结点的地址) 4 4算法分析:算法分析: 定位定位(loc)(loc)算法的执行时间与查找位置算法的执行时间与查找位置i i有关。有关。要找到第要找到第i i个位置,指针个位置,指针p p就后移就后移i i次。次。 设设i,i=1,.,ni,i=1,.,n处是等概率的,则指针
10、处是等概率的,则指针p p后移:后移: (1+2+(1+2+(n-1n-1)+n+n)/n = n/2/n = n/2次。次。 所以,算法的时间复杂度为所以,算法的时间复杂度为 O O(n n)。)。 (二)插入算法设计(二)插入算法设计1. .功能:在线性表第功能:在线性表第i i处插入其数值为处插入其数值为x x新结点新结点q q。 2.2.算法思想:算法思想:(1 1) 找到第找到第i-1i-1个结点(个结点(p p指向第指向第i-1i-1个结点);个结点);(2 2) 在在p p结点之后插入新结点结点之后插入新结点q q。(二)插入算法设计(二)插入算法设计1. .功能:在线性表第功能
11、:在线性表第i i处插入其数值为处插入其数值为x x新结点新结点q q 。 2.2.算法思想:算法思想:(1 1) 找到第找到第i-1i-1个结点(个结点(p p指向第指向第i-1i-1个结点);个结点);(2 2) 在在p p结点之后插入新结点结点之后插入新结点q q。3.3.算法设计算法设计void void ins(node ins(node * *head,int i, node head,int i, node * *q)q) /head:/head:带头结点的单链表的头指针带头结点的单链表的头指针 / / 该算法在第该算法在第i i个结点后面插入其数值为个结点后面插入其数值为x x
12、新结点新结点 node node * *p=loc(head,i-1);p=loc(head,i-1); / / 令令 p p 指向第指向第i-1i-1个结点个结点 if (p!=NULL)if (p!=NULL) q-next=p-next; p-next=qq-next=p-next; p-next=q; ; / /完成插入完成插入 (三)(三)删除算法设计删除算法设计 1. .功能:删除链表中第功能:删除链表中第i i个结点。个结点。 2.2.算法思想:算法思想: (1 1) 找到第找到第i-1i-1个结点个结点 ( p( p指向第指向第i-1i-1个结点个结点 ) );(2 2) 删除
13、删除p p的后继结点(的后继结点(q q)。)。3.3.算法设计算法设计void del (LinkList head, int i, datatype &e) /head:带头结点的单链表的头指针带头结点的单链表的头指针 node *p=head; j=0; /指针初始化指针初始化,j为计数器为计数器 while (p-next!=NULL & jnext; j+; / 找第找第i-1个结点个结点 if ( p-next!=NULL & j=i-1 ) q=p-next; /q指向指向p的后继结点的后继结点(即第即第i个结点)个结点) p-next=q-next; /
14、删除第删除第i个结点个结点 delete q;/ 释放释放q结点结点 四、链表算法设计示例四、链表算法设计示例例2.2.1 已知线性表中的元素按值递增排列已知线性表中的元素按值递增排列, 并以单链表作存储并以单链表作存储 结构。写一高效算法结构。写一高效算法, 删除表中所有值大于删除表中所有值大于min且小于且小于 max的结点(若表中存在这样的结点)。的结点(若表中存在这样的结点)。算法设计算法设计 :void del_1 (LinkList h, int min, int max) / h:带头结点的单链表的头指针带头结点的单链表的头指针 LinkList q=h,p=h-next; /初
15、值初值 while (p!=NULL & p-datanext; / p指向其值指向其值min的结点的结点, q是是p的前趋结点的前趋结点 while (p!=NULL & p-datanext; / 删除所有的其值删除所有的其值min并且并且next=p; / del_1例2.2.2 以链表作存储结构以链表作存储结构, 实现线性表就地逆置实现线性表就地逆置 的算的算 法法, 即将线性表即将线性表: (a1,a2,.an)=(an,.,a2,a1)分析分析:(1)取出原链表取出原链表(a1,.,an)中的一结点中的一结点; (2)插入到新链表插入到新链表(an,.,a1序序)的
16、表头处的表头处; (3) 重复重复(1)和和(2)步步, 直到原链表空止。直到原链表空止。void reverse (node *h) /h:带头结点的单链表的头指针带头结点的单链表的头指针 node *s, *p=h-next; /p指向第指向第1个元素结点个元素结点 h-next=NULL; / 将将h用作新链表作头指针用作新链表作头指针 while (p!=NULL) s=p; p=p-next; / 将将s结点从原链中删除结点从原链中删除 s-next=h-next; h-next=s; / 将将s插入新链首部插入新链首部 例2.2.3 设有两个按元素值递增有序排列的线性表设有两个按元
17、素值递增有序排列的线性表 A A和和B,B,均以单链表作存储结构均以单链表作存储结构, , 写一算法写一算法 将将A A表和表和B B表归并成一个按元素值递增有序表归并成一个按元素值递增有序 排列线性表排列线性表C C。分析分析:(1 1)当)当A A表和表和B B表都不空时表都不空时, , 进行比较进行比较, , 将较小数将较小数 链入链入C C表表尾表表尾, ,以保证其递增性以保证其递增性; ; (2) (2) 若某一链表空若某一链表空, , 将另一链表接在将另一链表接在C C表之后表之后 算法设计:算法设计:void void ( LinkList ha,LinkList hb, Lin
18、kList hc)( LinkList ha,LinkList hb, LinkList hc) / ha,hb,hc / ha,hb,hc分别为分别为A A、B B、C C链表的头指针,均带头结点。链表的头指针,均带头结点。 / / 该算法将有序表该算法将有序表A A和和B B,归并为一个新的有序表,归并为一个新的有序表C C pa=ha-next; pb=hb-next; pa=ha-next; pb=hb-next; hc=ha; rc=hc; hc=ha; rc=hc;/ hc/ hc、rc:rc:归并后链表的头指针、尾指针归并后链表的头指针、尾指针 while (pa!=NULL &
19、amp; pb!=NULL) while (pa!=NULL & pb!=NULL) if (pa-datadata) if (pa-datadata) rc-next=pa; rc=pa; pa=pa-next; rc-next=pa; rc=pa; pa=pa-next; else else rc-next=pb; rc=pb; pb=pb-next; rc-next=pb; rc=pb; pb=pb-next; / (1) / (1) 当当A A表和表和B B表都不空时表都不空时, ,将具较小值的结点链入将具较小值的结点链入C C表表尾表表尾 if (pa!=NULL) rc-n
20、ext=pa; else rc-next=pb;if (pa!=NULL) rc-next=pa; else rc-next=pb; / (2) / (2) 若某一链表空若某一链表空, , 将另一链表接在将另一链表接在C C表之后表之后 2.2.2 循环链表例例2.2.42.2.4 循环链表(循环链表(n1n1)中即无头结点也无头指针,写一算法)中即无头结点也无头指针,写一算法 删除删除p p结点的前趋结点。结点的前趋结点。viod del-pre(node *p) node *r=p; while ( r-next-next != p ) r=r-next; / r后移后移,到到r-next
21、-next != p 止止 r-next=p; / 删除删除r的后继的后继 将删除将删除p的前驱结点的问题,看的前驱结点的问题,看成是删除成是删除r的后继结点的问题。的后继结点的问题。 例例 2.2.5 2.2.5 约瑟夫环问题约瑟夫环问题 设有设有n个人站成一圈,每个人有不同的编号个人站成一圈,每个人有不同的编号i(1in),从编号为),从编号为1的的人开始按顺时针方向人开始按顺时针方向“1,2,3,m”循环报数,数到循环报数,数到m的人出列。然后从出列者的人出列。然后从出列者的下一个人重新开始报数,数到的下一个人重新开始报数,数到m的人又出列的人又出列., 如此重复进行,直到如此重复进行,
22、直到n个人个人都出列为止。都出列为止。 当当m=4, n=8时时 , 出列顺序为出列顺序为 :48521376算法设计:算法设计:void josephus_2 (LinkList r, int m, int n) /r:(不带头结点的)单向循环链表的尾指针 LinkList p=r; /p:指向尾指针 for (i=1;i=n; +i) for (j=1;jnext; / p后移m-1次,定位于m-1处(要退席的人之前) q=p-next; /q定位于m人(要退席的人) printf(“%d”,q-data); /第m人报数 p-next=q-next; /第m人退席,删除第m人 2.3.4
23、 双向链表 在双向链表中,每个结点都有两个指针域,用在双向链表中,每个结点都有两个指针域,用于存放前驱结点地址和后继结点地址。于存放前驱结点地址和后继结点地址。 与单链表相比,双向链表可以进行两个方向的与单链表相比,双向链表可以进行两个方向的查找。查找。 一、结点的数据结构一、结点的数据结构二、双向链表的表示双向链表的表示 struct dnode datatype data; / 数值域数值域 struct dnode *prior, * next; / 指针域指针域 ;typedef struct dnode dnode; 三、双向链表的特点双向链表的特点 p-next-prior = p
24、 = p-prior-next四、插入四、插入 在在p结点(第结点(第i个结点)之前插入新结点:个结点)之前插入新结点: s-prior=p-prior; p-prior-next=s; s-next=p; p-prior=s; 六、删除六、删除 删除第删除第i个结点(结点个结点(结点p ):): p-prior-next=p-next; p-next-prior=p-prior; 例例2.2.6 已知单向循环链表表示的线性表中含有三个域已知单向循环链表表示的线性表中含有三个域: pre、data和和next, 其中其中 data为数据域为数据域,next为指为指 针域针域,其值为后继其值为后
25、继, pre也是指针域也是指针域, 其值为其值为NULL。 写一算法写一算法, 将此链改为双向链表。将此链改为双向链表。设计思想:设计思想: 检查链表中的每一结点检查链表中的每一结点, 若其若其pre为空为空, 则将它指则将它指 向其前趋结点。向其前趋结点。 void cre_dulink( dnode *dh) / dh:双向链表的头指针双向链表的头指针 dnode *p=dh; while (p-next-pre=NULL) p-next-pre=p; p=p-next; 例例2.2.7 写出双向链表倒置的算法。写出双向链表倒置的算法。 分析:分析:p从从next方向,方向,q从从prio
26、r方向逐一对两个结点方向逐一对两个结点的数据进行交换,直至的数据进行交换,直至p=q或或p-prior=q止。止。 void ds0216(dnode * dh) /dh:指向双向循环链表的头结点指向双向循环链表的头结点 dnode *q=dh-prior, *p=dh-next; / q沿前趋指针方向沿前趋指针方向,p沿后继指针方向沿后继指针方向 while (p!=q & p-prior!=q) q-datap-datat; p=p-next; q=q-prior ; 2.3 链表的应用链表的应用多项式相加多项式相加1一元多项式的表示一元多项式的表示 Pn(x)=P1Xe1+P2Xe2+.+PmXem二二. 存储结构存储结构 - 链表链表 struct poly int index; / 指数指数 int coef; /系数系数 struct poly *next; ; typedef struct poly polynode ;三三. 多项式相加多项式相加 A(x) = 1 - 10 x6 + 2x8 +7x14 B(x)= - x4 + 10 x6 - 3x10 + 8x14 +
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年统编版七年级历史下册阶段测试试卷含答案
- 2025年粤教沪科版七年级物理下册阶段测试试卷
- 二零二五版泥浆外运承包服务合同(含环保验收标准)4篇
- 二零二五版门卫值班人员节假日值班合同4篇
- 塔吊工地施工环保监测合同20252篇
- 二零二五年度影视配音拍摄合同范本3篇
- 二零二五版智能门窗系统研发与市场推广服务合同2篇
- 二零二五年度美团外卖外卖配送服务区域规划及调整合同4篇
- 二零二五版牛肉连锁超市配送服务合同样本4篇
- 临时教学辅助人员聘用合同2024校版版
- 2024年甘肃省武威市、嘉峪关市、临夏州中考英语真题
- DL-T573-2021电力变压器检修导则
- 绘本《图书馆狮子》原文
- 安全使用公共WiFi网络的方法
- 2023年管理学原理考试题库附答案
- 【可行性报告】2023年电动自行车相关项目可行性研究报告
- 欧洲食品与饮料行业数据与趋势
- 放疗科室规章制度(二篇)
- 中高职贯通培养三二分段(中职阶段)新能源汽车检测与维修专业课程体系
- 浙江省安全员C证考试题库及答案(推荐)
- 目视讲义.的知识
评论
0/150
提交评论