




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课后习题参考答案第一章 绪论1.3 (1) O(n)(2) (2) O(n)(3) (3) O(n)(4) (4) O(n1/2)(5) (5) 执行程序段的过程中,x,y 值变化如下:循环次数 x y0(初始) 91 1001 92 1002 93 100 9 100 10010 101 10011 91 9912 92 100 20 101 9921 91 98 30 101 9831 91 97到 y=0 时,要执行 10*100 次,可记为 O(10*y)=O(n)1.5 2100 , (2/3)n , log2n , n1/2 , n3/2 , (3/2)n , nlog2n , 2 n , n! , n n第二章 线性表(参考答案)在以下习题解答中,假定使用如下类型定义:(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 data;struct node *prior,*next;dlinklist;(4)静态链表typedef structElemType data;int next;node;node saMAXSIZE;2.1 头指针:指向链表的指针。因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。如:链表的头指针是 la,往往简称为“链表 la”。头结点:为了链表操作统一,在链表第一元素结点(称为首元结点,或首结点)之前增加的一个结点,该结点称为头结点,其数据域不无实际意义(当然,也可以存储链表长度,这只是副产品) ,其指针域指向头结点。这样在插入和删除中头结点不变。开始结点:即上面所讲第一个元素的结点。2.2 只设尾指针的单循环链表,从尾指针出发能访问链表上的任何结点。23 void insert(ElemType A,int elenum,ElemType x)/ 向量 A 目前有 elenum 个元素,且递增有序,本算法将 x 插入到向量 A 中,并保持向量的递增有序。 int i=0,j; while (i=i;j-) Aj+1=Aj;/ 向后移动元素 Ai=x; / 插入元素 / 算法结束24 void rightrotate(ElemType A,int n,k)/ 以向量作存储结构,本算法将向量中的 n 个元素循环右移 k 位,且只用一个辅助空间。 int num=0; / 计数,最终应等于 n int start=0; / 记录开始位置(下标) while (numnext, *pre=L,*s;/ p 为工作指针,指向当前元素,pre 为前驱指针,指向当前元素的前驱 s=(linklist *)malloc(sizeof(linklist);/申请空间,不判断溢出s-data=x;while (p / 查找插入位置 pre-next=s; s-next=p; / 插入元素 / 算法结束 26void invert(linklist *L)/ 本算法将带头结点的单链表 L 逆置。 /算法思想是先将头结点从表上摘下,然后从第一个元素结点开始,依次前插入以 L 为头结点的链表中。 linklist *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); / 算法结束(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,*r;/ pa,pb 为工作指针,分别指向 A 表和 B 表的当前元素,r 为当前逆置/元素的后继指针, 使逆置元素的表避免断开。 /算法思想是边合并边逆置,使递增有序的单链表合并为递减有序的单链表。 C-next=null;/头结点摘下,指针域置空。算法中头指针 C 始终不变 while (pa / 保留后继结点的指针 pa-next=C-next; / 逆置 C-next=pa; pa=r; / 恢复待逆置结点的指针 else / 将 B 表中元素合并且逆置 r=pb-next; / 保留后继结点的指针 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 表头结点 / 算法结束 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 是带头结点的的单链表,其数据元素是字符字母、字符、数字字符、其他字符。本算法/将 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; / 准备循环链表的头结点 while(p) r=p-next; / 用以记住后继结点 if (p-data=a A-next=p; / 将字母字符插入 A 表 else if (p-data=0 B-next=p; / 将数字字符插入 B 表 else p-next=C-next; C-next=p;/ 将其它符号插入 C 表 p=r; / 恢复后继结点的指针 /while / 算法结束 211void locate(dlinklist *L)/ L 是带头结点的按访问频度递减的双向链表,本算法先查找数据 x,/ 查找成功时结点的访问频度域增 1,最后将该结点按频度递减插入链表中适当位置。 linklist *p=L-next,*q;/p 为工作指针,指向 L 表的当前元素,q 为 p 的前驱,用于查找插入位置。while (p / 查找值为 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 p-next=q-next; q-next-prior=p;/ 将 p 结点插入 p-prior=q; q-next=p; / 算法结束 第三章 栈和队列(参考答案)/ 从数据结构角度看,栈和队列是操作受限的线性结构,其顺序存储结构 / 和链式存储结构的定义与线性表相同,请参考教材,这里不再重复。3.1 1 2 3 4 2 1 3 4 3 2 1 4 4 3 2 11 2 4 3 2 1 4 3 3 2 4 1 1 3 2 4 2 3 1 4 3 4 2 11 3 4 2 2 3 4 1 1 4 3 2 2 4 3 1 设入栈序列元素数为 n,则可能的出栈序列数为 C2nn=(1/n+1)*(2n!/(n!)2)3.2 证明:由 jpk 说明 pj在 pk之后出栈,即 pj被 pk 压在下面,后进先出。由以上两条,不可能存在 inext;while (idata); p=p-next; if (n % 2 !=0) p=p-next;/ 奇数个结点时跳过中心结点 while (p if (p=null) printf(“链表中心对称”);else printf(“链表不是中心对称”); / 算法结束 3.4int match()/从键盘读入算术表达式,本算法判断圆括号是否正确配对(init s;/初始化栈 sscanf(“%c”,while (ch!=#) /#是表达式输入结束符号switch (ch) case (: push(s,ch); break;case ): if (empty(s) printf(“括号不配对”); exit(0);pop(s);if (!empty(s) printf(“括号不配对”); else printf(“括号配对”); / 算法结束 3.5typedef struct / 两栈共享一向量空间 ElemType vm; / 栈可用空间 0m-1 int top2 / 栈顶指针twostack;int push(twostack *s,int i, ElemType x)/ 两栈共享向量空间,i 是 0 或 1,表示两个栈,x 是进栈元素,/ 本算法是入栈操作 if (abs(s-top0 - s-top1)=1) return(0);/ 栈满 else switch (i)case 0: s-v+(s-top)=x; break;case 1: s-v-(s-top)=x; break;default: printf(“栈编号输入错误”); return(0);return(1); / 入栈成功 / 算法结束 ElemType pop(twostack *s,int i)/ 两栈共享向量空间,i 是 0 或 1,表示两个栈,本算法是退栈操作 ElemType x;if (i!=0 / 栈编号错误 else switch (i)case 0: if(s-top0=-1) return(0);/栈空else x=s-vs-top-;break;case 1: if(s-top1=m) return(0);/栈空else x=s-vs-top+; break;default: printf(“栈编号输入错误”);return(0);return(x); / 退栈成功 / 算法结束 ElemType top (twostack *s,int i)/ 两栈共享向量空间,i 是 0 或 1,表示两个栈,本算法是取栈顶元素操作 ElemType x;switch (i)case 0: if(s-top0=-1) return(0);/栈空else x=s-vs-top; break;case 1: if(s-top1=m) return(0);/栈空else x=s-vs-top; break;default: printf(“栈编号输入错误”);return(0);return(x); / 取栈顶元素成功 / 算法结束 36void Ackerman(int m,int n)/ Ackerman 函数的递归算法 if (m=0) return(n+1);else if (m!=0 else return(Ackerman(m-1,Ackerman(m,n-1) / 算法结束 37(1) linklist *init(linklist *q)/ q 是以带头结点的循环链表表示的队列的尾指针,本算法将队列置空 q=(linklist *)malloc(sizeof(linklist);/申请空间,不判断空间溢出q-next=q;return (q); / 算法结束 (2) linklist *enqueue(linklist *q,ElemType x)/ q 是以带头结点的循环链表表示的队列的尾指针,本算法将元素 x 入队 s=(linklist *)malloc(sizeof(linklist);/申请空间,不判断空间溢出s-next=q-next; / 将元素结点 s 入队列 q-next=s;q=s; / 修改队尾指针 return (q); / 算法结束 (3) linklist *delqueue(linklist *q)/q 是以带头结点的循环链表表示的队列的尾指针,这是出队算法 if (q=q-next) return (null); / 判断队列是否为空 else linklist *s=q-next-next; / s 指向出队元素 if (s=q) q=q-next; / 若队列中只一个元素,置空队列else q-next-next=s-next;/ 修改队头元素指针 free (s); / 释放出队结点 return (q); / 算法结束。算法并未返回出队元素 3.8 typedef structElemType datam;/ 循环队列占 m 个存储单元 int front,rear; / front 和 rear 为队头元素和队尾元素的指针 / 约定 front 指向队头元素的前一位置,rear 指向队尾元素 sequeue; int queuelength(sequeue *cq)/ cq 为循环队列,本算法计算其长度 return (cq-rear - cq-front + m) % m; / 算法结束 3.9 typedef structElemType sequm;/ 循环队列占 m 个存储单元 int rear,quelen; / rear 指向队尾元素,quelen 为元素个数sequeue;(1) int empty(sequeue *cq)/ cq 为循环队列,本算法判断队列是否为空 return (cq-quelen=0 ? 1: 0); / 算法结束 (2) sequeue *enqueue(sequeue *cq,ElemType x)/ cq 是如上定义的循环队列,本算法将元素 x 入队if (cq-quelen=m) return(0); / 队满 else cq-rear=(cq-rear+1) % m; / 计算插入元素位置 cq-sequcq-rear=x; / 将元素 x 入队列 cq-quelen+; / 修改队列长度 return (cq); / 算法结束 ElemType delqueue(sequeue *cq)/ cq 是以如上定义的循环队列,本算法是出队算法,且返回出队元素 if (cq-quelen=0) return(0); / 队空 else int front=(cq-rear - cq-quelen + 1+m) % m;/ 出队元素位置 cq-quelen-; / 修改队列长度 return (cq-sequfront); / 返回队头元素 / 算法结束第四章 串 (参考答案)在以下习题解答中,假定使用如下类型定义:#define MAXSIZE 1024typedef struct char dataMAXSIZE;int curlen; / curlen 表示终端结点在向量中的位置 seqstring;typedef struct nodechar data;struct node *next ;linkstring;4.2 int index(string s,t)/s,t 是字符串,本算法求子串 t 在主串 s 中的第一次出现,若 s 串中包含 t 串,返回其/第一个字符在 s 中的位置,否则返回 0m=length(s); n=length(t);i=1;while(inext; q=Y-next; pre=p;while (p / 取 X 中的字符 while (q / 和 Y 中字符比较 if (!q) return(ch); / 找到 Y 中没有的字符 else pre=p-next; / 上一字符在 Y 中存在,p=pre; / 取 X 中下一字符。 q=Y-next; / 再从 Y 的第一个字符开始比较return(null); / X 中字符在 Y 中均存在 / 算法结束 4.6 int strcmp(seqstring *S, se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 孕期离婚协议模板定制与婚姻财产分割指导合同
- 离婚房产归女方协议书:女方权益保障范本
- 离婚协议书范本:无子女双方协议书
- 石家庄市二手房买卖交易合同终止后权益保障协议
- 离婚协议6865I版:财产分割及债务处理细则
- 城市综合体物业管理与能源采购合同
- 食品企业生产信息保密及食品安全责任合同
- 班组级安全培训内容模板课件
- 小班教学水果课件
- 2025年病理生理学乳腺组织病理变化模拟考试卷答案及解析
- 不交社保劳动合同模板
- 2024年云南省中考数学试题(含答案)
- GB 14102.1-2024防火卷帘第1部分:通用技术条件
- 越野跑策划方案
- 《光学含沙量测量仪率定规范》
- 高考日语应用文写作失物招领寻物启事课件
- 产值计算方案
- 冬季抢工措施方案
- 运用PDCA循环降低急诊科医护人员职业暴露发生率
- 充电桩施工组织设计
- 静脉治疗护理技术操作标准2023
评论
0/150
提交评论