数据结构课后答案

上传人:飞*** 文档编号:5460353 上传时间:2017-08-30 格式:DOC 页数:76 大小:76.70KB
返回 下载 相关 举报
数据结构课后答案_第1页
第1页 / 共76页
数据结构课后答案_第2页
第2页 / 共76页
数据结构课后答案_第3页
第3页 / 共76页
数据结构课后答案_第4页
第4页 / 共76页
数据结构课后答案_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《数据结构课后答案》由会员分享,可在线阅读,更多相关《数据结构课后答案(76页珍藏版)》请在金锄头文库上搜索。

1、第一章 绪论一、问答题1. 什么是数据结构?2. 叙述四类基本数据结构的名称与含义。3. 叙述算法的定义与特性。4. 叙述算法的时间复杂度。5. 叙述数据类型的概念。6. 叙述线性结构与非线性结构的差别。7. 叙述面向对象程序设计语言的特点。8. 在面向对象程序设计中,类的作用是什么?9. 叙述参数传递的主要方式及特点。10. 叙述抽象数据类型的概念。二、判断题(在各题后填写“”或“” )1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。 ( )2. 算法就是程序。 ( )3. 在高级语言(如 C 或 PASCAL)中,指针类型是原子类型。 ( )三、计算下列程序段中 X=

2、X+1 的语句频度for(i=1;inext=S;(2)P-next= P-next-next;(3)P-next= S-next;(4)S-next= P-next;(5)S-next= L;(6)S-next= NULL;(7)Q= P;(8)while(P-next!=Q) P=P-next;(9)while(P-next!=NULL) P=P-next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;2.4 已知线性表 L 递增有序。试写一算法,将 X 插入到 L 的适当位置上,以保持线性表 L 的有序性。Status Insert_SqList(SqList

3、&va,int x)/把 x 插入递增有序表 va 中if(va.length+1va.listsize) return ERROR;va.length+;for(i=va.length-1;va.elemix&i=0;i-)va.elemi+1=va.elemi;va.elemi+1=x;return OK;/Insert_SqList2.5 写一算法,从顺序表中删除自第 i 个元素开始的 k 个元素。提示:注意检查 i 和 k 的合法性。(集体搬迁, “新房” 、 “旧房” )以待移动元素下标 m(“旧房号” )为中心,计算应移入位置(“新房号” ):for ( m= i1+k; mlas

4、t; m+)Lelem mk = Lelem m ;同时以待移动元素下标 m 和应移入位置 j 为中心:以应移入位置 j 为中心,计算待移动元素下标:2.6 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于 mink 且小于 maxk的元素(若表中存在这样的元素) ,分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的两个参变量,它们的值为任意的整数) 。 Status Delete_Between(Linklist &L,int mink,int maxk)/删除元素递增排列的链表 L 中值大于 mink 且小于 maxk 的所有

5、元素p=L;while(p-next-datanext; /p 是最后一个不大于 mink的元素if(p-next) /如果还有比 mink 更大的元素q=p-next;while(q-datanext; /q 是第一个不小于 maxk 的元素p-next=q;/Delete_Between2.7 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2., an)逆置为( an, an-1,., a1) 。(1) 以一维数组作存储结构,设线性表存于 a(1:arrsize)的前elenum 个分量中。(2) 以单链表作存储结构。方法 1:在原头结点后重新头插一

6、遍方法 2:可设三个同步移动的指针 p, q, r,将 q 的后继 r 改为 p2.8 假设两个按元素值递增有序排列的线性表 A 和 B,均以单链表作为存储结构,请编写算法,将 A 表和 B 表归并成一个按元素值递减有序的排列的线性表 C,并要求利用原表(即 A 表和 B 表的)结点空间存放表 C.提示:参 P.28 例 2-1void merge(LinkList A; LinkList B; LinkList *C) pa=A next; pb=B next; *C=A; (*C)next=NULL;while ( pa!=NULL & pb!=NULL ) if ( pa data da

7、ta ) smaller=pa; pa=panext; smallernext = (*C)next; /* 头插法 */(*C)next = smaller;else smaller=pb; pb=pb next; smallernext = (*C)next;(*C)next = smaller;while ( pa!=NULL) smaller=pa; pa=panext; smallernext = (*C)next;(*C)next = smaller;while ( pb!=NULL) smaller=pb; pb=pbnext; smallernext = (*C)next;(*

8、C)next = smaller;LinkList merge(LinkList A; LinkList B) LinkList C;pa=A next; pb=B next; C=A; Cnext=NULL;return C;while(pa|pb)if(pa-datadata|!pb)pc=pa;q=pa-next;pa-next=pre;pa=q; /将 A 的元素插入新表 elsepc=pb;q=pb-next;pb-next=pre;pb=q; /将 B 的元素插入新表pre=pc;C=A;A-next=pc; /构造新表头/reverse_merge分析:本算法的思想是,按从小到大

9、的顺序依次把 A 和 B 的元素插入新表的头部 pc 处, 最后处理 A 或 B 的剩余元素.2.9 假设有一个循环链表的长度大于 1,且表中既无头结点也无头指针。已知 s 为指向链表某个结点的指针,试编写算法在链表中删除指针 s 所指结点的前趋结点。提示:设指针 p 指向 s 结点的前趋的前趋,则 p 与 s 有何关系?Status Delete_Pre(CiLNode *s)/删除单循环链表中结点 s 的直接前驱p=s;while(p-next-next!=s) p=p-next; /找到 s 的前驱的前驱 pp-next=s;return OK;/Delete_Pre2.10 已知有单链

10、表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符) ,试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。Status LinkList_Divide(LinkList &L,CiList &A,CiList &B,CiList &C)/把单链表 L 的元素按类型分为三个循环链表.CiList 为带头结点的单循环链表类型.s=L-next;A=(CiList*)malloc(sizeof(CiLNode);p=A;B=(CiList*)malloc(sizeof(CiLNode);q=B;

11、C=(CiList*)malloc(sizeof(CiLNode);r=C; /建立头结点while(s)if(isalphabet(s-data)p-next=s;p=s;else if(isdigit(s-data) q-next=s;q=s;elser-next=s;r=s;/whilep-next=A;q-next=B;r-next=C; /完成循环链表/LinkList_Divide2.11 设线性表 A=(a1, a2,am),B=(b1, b2,bn),试写一个按下列规则合并 A、B 为线性表 C 的算法,使得:C= (a1, b1,am, bm, bm+1, ,bn) 当 mn

12、 时;或者 C= (a1, b1,an, bn, an+1, ,am) 当 mn 时。线性表 A、B 、C 均以单链表作为存储结构,且 C 表利用 A 表和 B 表中的结点空间构成。注意:单链表的长度值 m 和 n 均未显式存储。提示:void merge(LinkList A; LinkList B; LinkList *C)或:LinkList merge(LinkList A; LinkList B)void merge1(LinkList &A,LinkList &B,LinkList &C)/把链表 A 和 B 合并为C,A 和 B 的元素间隔排列, 且使用原存储空间p=A-next

13、;q=B-next;C=A;while(p&q)s=p-next;p-next=q; /将 B 的元素插入if(s)t=q-next;q-next=s; /如 A 非空,将 A 的元素插入p=s;q=t;/while/merge12.12 将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间来构成这两个链表。提示:注明用头指针还是尾指针。void Divide_LinkedPoly(LinkedPoly &L,&A,&B)/把循环链表存储的稀疏多项式 L 拆成只含奇次项的 A 和只含偶次项的 Bp=L-next; A=(Poly

14、Node*)malloc(sizeof(PolyNode);B=(PolyNode*)malloc(sizeof(PolyNode);pa=A;pb=B;while(p!=L)if(p-data.exp!=2*(p-data.exp/2)pa-next=p;pa=p;elsepb-next=p;pb=p;p=p-next;/whilepa-next=A;pb-next=B; /Divide_LinkedPoly2.13 建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的 data 域存放一个二进制位。并在此链表上实现对二进制数加 1 的运算 。提示:可将低位放在前面。2.14 设多项式 P(x)采用课本中所述链接方法存储。写一算法,对给定的 x 值,求 P(x)的值。提示:float PolyValue(Polylist p; float x) 第三章 栈和队列1. 按图 3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: 如进站的车厢序列为 123,则可能得到的出站车厢序列是什么?如进站的车厢序列为 123456,能否得到 435612 和 135426 的出站序列,并说明原因。 (即写出以“S”表示进栈、以 “X”表示出栈的栈操作序列) 。【解答】(1)可能得到的出站车厢序列是: 123、132 、213、231、321 。(2)不能得到

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 企业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号