数据结构(C语言)第二章

上传人:hao****an 文档编号:103598151 上传时间:2022-06-09 格式:DOC 页数:5 大小:25.01KB
收藏 版权申诉 举报 下载
数据结构(C语言)第二章_第1页
第1页 / 共5页
数据结构(C语言)第二章_第2页
第2页 / 共5页
数据结构(C语言)第二章_第3页
第3页 / 共5页
资源描述:

《数据结构(C语言)第二章》由会员分享,可在线阅读,更多相关《数据结构(C语言)第二章(5页珍藏版)》请在装配图网上搜索。

1、第二章 线性表(参考答案)在以下习题解答中,假定使用如下类型定义:(1)顺序存储结构:#define MAXSIZE 1024typedef int ElemType;/ 实际上,ElemType可以是任意类型 typedef struct ElemType dataMAXSIZE;int last; / last表示终端结点在向量中的位置 sequenlist;(2)链式存储结构(单链表)typedef struct nodeElemType data; struct node *next; linklist;(3)链式存储结构(双链表)typedef struct nodeElemType

2、data;struct node *prior,*next;dlinklist;(4)静态链表typedef structElemType data;int next;node;node saMAXSIZE;2.1 头指针:指向链表的指针。因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。如:链表的头指针是la,往往简称为“链表la”。头结点:为了链表操作统一,在链表第一元素结点(称为首元结点,或首结点)之前增加的一个结点,该结点称为头结点,其数据域不无实际意义(当然,也可以存储链表长度,这只是副产品),其指针域指向头结点。这样在插入和删除中头结

3、点不变。开始结点:即上面所讲第一个元素的结点。2.2 只设尾指针的单循环链表,从尾指针出发能访问链表上的任何结点。23 void insert(ElemType A,int elenum,ElemType x)/ 向量A目前有elenum个元素,且递增有序,本算法将x插入到向量A中,并保持向量的递增有序。 int i=0,j; while (ielenum & Ai=i;j-) Aj+1=Aj;/ 向后移动元素 Ai=x; / 插入元素 / 算法结束24 void rightrotate(ElemType A,int n,k)/ 以向量作存储结构,本算法将向量中的n个元素循环右移k位,且只用一

4、个辅助空间。 int num=0; / 计数,最终应等于n int start=0; / 记录开始位置(下标) while (numn) temp=Astart; /暂存起点元素值,temp与向量中元素类型相同 empty=start; /保存空位置下标 next=(start-K+n) %n; / 计算下一右移元素的下标 while (next !=start) Aempty=Anext;/ 右移 num+; / 右移元素数加1 empty=next; next=(next-K+n) %n; / 计算新右移元素的下标 Aempty=temp; / 把一轮右移中最后一个元素放到合适位置 num

5、+; start+; / 起点增1,若numn则开始下一轮右移。 / 算法结束 算法二 算法思想:先将左面n-k个元素逆置,接着将右面k个元素逆置,最后再将这n个元素逆置。void rightrotate(ElemType A,int n,k)/ 以向量作存储结构,本算法将向量中的n个元素循环右移k位,且只用一个辅助空间。 ElemType temp; for(i=0;i(n-k)/2;i+) /左面n-k个元素逆置 temp=Ai; Ai=An-k-1-i; An-k-1-i=temp; for(i=1;i=k;i+) /右面k个元素逆置 temp=An-k-i; An-k-i=An-i;

6、An-i=temp; for(i=0;inext, *pre=L,*s;/ p为工作指针,指向当前元素,pre为前驱指针,指向当前元素的前驱 s=(linklist *)malloc(sizeof(linklist);/申请空间,不判断溢出s-data=x; while (p & p-datanext; / 查找插入位置 pre-next=s; s-next=p; / 插入元素 / 算法结束 26void invert(linklist *L)/ 本算法将带头结点的单链表L逆置。 /算法思想是先将头结点从表上摘下,然后从第一个元素结点开始,依次前插入以L为头结点的链表中。 linklist *

7、p=L-next,*s;/ p为工作指针,指向当前元素,s为p的后继指针 L-next=null;/头结点摘下,指针域置空。算法中头指针L始终不变 while (p) s=p-next; / 保留后继结点的指针 p-next=L-next; / 逆置 L-next=p; p=s; / 将p指向下个待逆置结点 / 算法结束 27(1) int length1(linklist *L)/ 本算法计算带头结点的单链表L的长度 linklist *p=L-next; int i=0;/ p为工作指针,指向当前元素,i 表示链表的长度 while (p) i+; p=p-next; return(i);

8、 / 算法结束(2) int length1(node saMAXSIZE)/ 本算法计算静态链表s中元素的个数。 int p=sa0.next, i=0;/ p为工作指针,指向当前元素,i 表示元素的个数,静态链指针等于-1时链表结束 while (p!=-1) i+; p=sap.next; return(i); / 算法结束 28void union_invert(linklist *A,*B,*C)/ A和B是两个带头结点的递增有序的单链表,本算法将两表合并成 / 一个带头结点的递减有序单链表C,利用原表空间。 linklist *pa=A-next,*pb=B-next,*C=A,*

9、r;/ pa,pb为工作指针,分别指向A表和B表的当前元素,r为当前逆置/元素的后继指针, 使逆置元素的表避免断开。 /算法思想是边合并边逆置,使递增有序的单链表合并为递减有序的单链表。 C-next=null;/头结点摘下,指针域置空。算法中头指针C始终不变 while (pa & pb) / 两表均不空时作 if (pa-datadata) / 将A表中元素合并且逆置 r=pa-next; / 保留后继结点的指针 pa-next=C-next; / 逆置 C-next=pa; pa=r; / 恢复待逆置结点的指针 else / 将B表中元素合并且逆置 r=pb-next; / 保留后继结点

10、的指针 pb-next=C-next; / 逆置 C-next=pb; pb=r; / 恢复待逆置结点的指针 / 以下while (pa)和while (pb)语句,只执行一个 while (pa) / 将A表中剩余元素逆置 r=pa-next; / 保留后继结点的指针 pa-next=C-next; / 逆置 C-next=pa; pa=r; / 恢复待逆置结点的指针 while (pb) / 将B表中剩余元素逆置 r=pb-next; / 保留后继结点的指针 pb-next=C-next; / 逆置 C-next=pb; pb=r; / 恢复待逆置结点的指针 free(B);/释放B表头结

11、点 / 算法结束 29 void deleteprior(linklist *L)/ 长度大于1的单循环链表,既无头结点,也无头指针,本算法删除*s 的前驱结点 linklist *p=s-next,*pre=s; / p为工作指针,指向当前元素,/ pre为前驱指针,指向当前元素*p的前驱 while (p-next!=s) pre=p; p=p-next; / 查找*s的前驱 pre-next=s; free(p); / 删除元素 / 算法结束 210void one_to_three(linklist *A,*B,*C)/ A是带头结点的的单链表,其数据元素是字符字母、字符、数字字符、其

12、他字符。本算法/将A表分成 / 三个带头结点的循环单链表A、B和C,分别含有字母、数字和其它符号的同一类字符,利用原表空间。 linklist *p=A-next,r;/ p为工作指针,指向A表的当前元素,r为当前元素的后继指针,使表避免断开。 /算法思想是取出当前元素,根据是字母、数字或其它符号,分别插入相应表中。 B=(linklist *)malloc(sizeof(linklist);/申请空间,不判断溢出 B-next=null; / 准备循环链表的头结点 C=(linklist *)malloc(sizeof(linklist);/申请空间,不判断溢出 C-next=null; /

13、 准备循环链表的头结点 while(p) r=p-next; / 用以记住后继结点 if (p-data=a&p-datadata=A& p-data next=A-next; A-next=p; / 将字母字符插入A表 else if (p-data=0&p-datanext=B-next; B-next=p; / 将数字字符插入B 表 else p-next=C-next; C-next=p;/ 将其它符号插入C 表 p=r; / 恢复后继结点的指针 /while / 算法结束 211void locate(dlinklist *L)/ L是带头结点的按访问频度递减的双向链表,本算法先查找

14、数据x,/ 查找成功时结点的访问频度域增1,最后将该结点按频度递减插入链表中适当位置。 linklist *p=L-next,*q;/p为工作指针,指向L表的当前元素,q为p的前驱,用于查找插入位置。 while (p & p-data !=x) p=p-next; / 查找值为x的结点。 if (!p) return (“不存在值为x的结点”); else p-freq+; / 令元素值为x的结点的freq域加1 。 p-next-prir=p-prior; / 将p结点从链表上摘下。 p-prior-next=p-next;q=p-prior; / 以下查找p结点的插入位置 while (q !=L & q-freqprior; p-next=q-next; q-next-prior=p;/ 将p结点插入 p-prior=q; q-next=p; / 算法结束

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!