《数据结构与算法》课后习题答案教学教材.pdf
《《数据结构与算法》课后习题答案教学教材.pdf》由会员分享,可在线阅读,更多相关《《数据结构与算法》课后习题答案教学教材.pdf(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 数据结构与算法课后习题答案精品文档2.3课后习题解答2.3.2判断题1 .线性表的逻辑顺序与存储顺序总是一致的。(X)2.顺序存储的线性表可以按序号随机存取。(J)3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。(X)4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此属于同一数据对象。(J)5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定相邻。(X)6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。(J)7.线性表的链式存储结构优于顺序存储结构。(义)8.在线性表的顺序存储结
2、构中,插入和删除时移动元素的个数与该元素的位置有关。(J)9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。(V)10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。(X)11.静态链表既有顺序存储的优点,又有动态链表的优点。所以它存取表中第i 个元素的时间与i 无关。(X)12.线性表的特点是每个元素都有一个前驱和一个后继。(X)2.3.3算法设计题1.设线性表存放在向量Aarrsize的前elenum个分量中,且递增有序。试写一算法,将 x 插入到线性表的适当位置上,以保持线性表的有序性,并且分析算法的时间复杂度。【提示】直接
3、用题目中所给定的数据结构(顺序存储的思想是用物理上的相邻表示逻辑上的相邻,不一定将向量和表示线性表长度的变量封装成一个结构体),因为是顺序存储,分配的存储空间是固定大小的,所以首先确定是否还有存储空间,若有,则根据原线性表中元素的有序性,来确定插入元素的插入位置,后面的元素为它让出位置,(也可以从高下标端开始一边比较,一边移位)然后插入x,最后修改表示表长的变量。int insert(datatype A,int*elenum,datatype x)/*设 elenum为表的最大下标*/if(*elenum=arrsize-l)return 0;法插入*/else i=*elenum;whil
4、e(i=0&Aix)移动*/Ai+l=Ai;i;/*表已满,无/*边找位置边收集于网络,如有侵权请联系管理员删除精品文档Ai+l=x;/*找到的位置是插入位的下一位*/(*elenum)+;return 1;/*插入成功*/时间复杂度为0(n)。2.已知一顺序表A,其元素值非递减有序排列,编写一个算法删除顺序表中多余的值相同的元素。【提示】对顺序表A,从第一个元素开始,查找其后与之值相同的所有元素,将它们删除;再对第二个元素做同样处理,依此类推。void delete(Seqlist*A)i=0;while(ilast)/*将 第 i 个元素以后与其值相同的元素删除k=i+l;while(kl
5、ast&A-datai=A-datak)k+;/*使 k 指 向第个与Ai不同的元素*/n=k-i-l;for(j=k;jlast;j+)A-dataj-n=A-dataj;A-last=A-last-n;i+;/*n 表示要删除元素的个数*/*删除多余元素*/3.写一个算法,从一个给定的顺序表A 中删除值在xy(xdatai是否介于x 和 y 之间,若是,并不立即删除,而是用n记录删除时应前移元素的位移量;若不是,则将A-data用向前移动n位。n用来记录当前已删除元素的个数。void delete(Seqlist*A,int x,int y)i=0;n=0;while(ilast)if(A
6、-datai=x&A-datafidatai介于 x 和 y 之间,n 自增*/else A-datai-n=A-datai;i+;/*否则向前移动A-datai*/A-last-=n;收集于网络,如有侵权请联系管理员删除精品文档4.线性表中有n 个元素,每个元素是一个字符,现存于向量Rn中,试写一算法,使 R 中的字符按字母字符、数字字符和其它字符的顺序排列。要求利用原来的存储空间,元素移动次数最小。【提示】对线性表进行两次扫描,第一次将所有的字母放在前面,第二次将所有的数字放在字母之后,其它字符之前。int fch(char c)/*判断c是 否 字 母*/if(c=,a,&c=,A,&c
7、=0&c=9)return(1);else return(0);)void process(char Rn)low=0;high=n-1;while(lowhigh)/*将 字 母 放 在 前 面*/while(loww+;while(lowhigh&!fch(Rhigh)high;if(lowhigh)k=Rlow;Rlow=Rhigh;Rhigh=k;)low=low+l;high=n-l;while(lowhigh)/*将 数 字 放 在 字 母 后 面,其 它 字 符 前 面*/while(lowhigh&fnum(Rlow)low+;while(lowhigh&!fnum(Rhigh
8、)high;if(lowhigh)k=Rlow;Rlow=Rhighl;Rhigh=k;5.线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前m 个元素和后n 个元素进行整体互换。即将线性表:(ai,a2,.,am,bi,bs,.,bn)改变为:(b i,b 2,,b n,a i,a 2,,a m)【提示】比较m 和 n 的大小,若 m n,则将表中元素依次前移m 次;否则,将表中元素依次后移n次。收集于网络,如有侵权请联系管理员删除精品文档void process(Seqlist*L,int m,int n)if(m=n)fbr(i=l;idata0;for(k=1;kla
9、st;k+)L-datak-l=L-datafk;L-dataL-last=x;else for(i=l;idataL-last;for(k=L-last-l;k=0;k-)L-datak+l=L-datak;L-dataO=x;6.已知带头结点的单链表L 中的结点是按整数值递增排列的,试写一算法,将值为x的结点插入到表L 中,使得L 仍然递增有序,并且分析算法的时间复杂度。LinkList insert(LinkList L,int x)P=L;while(p-next&xp-next-data)p=p-next;s=(LNode*)malloc(sizeof(LNode);s-data=x
10、;s-next=p-next;p-next=s;return(L);/*将结点插入到链表中*/7.假设有两个已排序(递增)的单链表A和B,个链表C而不改变其排序性。LinkList Combine(LinkList A,LinkList B)C=A;rc=C;pa=A-next;pb=B-next;free(B);while(pa&pb)if(pa-datadata)rc-next=pa;rc=pa;pa=pa-next;/*寻找插入位置*/*申请结点空间*/*填装结点*/编写算法将它们合并成一/*pa指向表A的第一个结点*/*pb指向表B的第一一个结点*/*释放B的头结点*/*将pa、pb所
11、指向结点中,值较小的一个插入到链表C的表尾*/elserc-next=pb;rc=pb;收集于网络,如有侵权请联系管理员删除精品文档pb=pb-next;)if(pa)rc-next=pa;else rc-next=pb;/*将链表A或B中 剩 余 的 部 分 链 接 到 链 表c的 表 尾 号return(C);)8.假设长度大于1的循环单链表中,既无头结点也无头指针,p为指向该链表中某一结点的指针,编写算法删除该结点的前驱结点。【提示】利用循环单链表的特点,通过s指针可循环找到其前驱结点p及p的前驱结点q,然后可删除结点*p。viod delepre(LNode*s)LNode*p,*q;
12、p=s;while(p-next!=s)q=p;p=p-next;)q-next=s;free(p);)9.已知两个单链表A和B分别表示两个集合,其元素递增排列,编写算法求出A和B的交集C,要求C同样以元素递增的单链表形式存储。【提示】交集指的是两个单链表的元素值相同的结点的集合,为了操作方便,先让单链表C带有一个头结点,最后将其删除掉。算法中指针p用来指向A中的当前结点,指针q用来指向B中的当前结点,将其值进行比较,两者相等时,属于交集中的一个元素,两者不等时,将其较小者跳过,继续后面的比较。LinkList Intersect(LinkList A,LinkList B)LNode*q,*
13、p,*r,*s;LinkList C;C=(LNode*)malloc(sizeof(LNode);C-next=NULL;r=C;P=A;q=B;while(p&q)if(p-datadata)p=p-next;else if(p-data=q-data)s=(LNode*)malloc(sizeof(LNode);s-data=p-data;r-next=s;s;p=p-next;q=q-next;收集于网络,如有侵权请联系管理员删除精品文档else q=q-next;r-next=NULL;C=C-next;return C;)1 0.设有一个双向链表,每个结点中除有prior、data
14、和 next域外,还有一个访问频度freq域,在链表被起用之前,该域的值初始化为零。每当在链表进行一次Locata(L,x)运算后,令值为x 的结点中的freq域 增 1,并调整表中结点的次序,使其按访问频度的非递增序列排列,以便使频繁访问的结点总是靠近表头。试写一个满足上述要求的Locata(L,x)算法。【提示】在定位操作的同时,需要调整链表中结点的次序:每次进行定位操作后,要查看所查找结点的freq域,将其同前面结点的freq域进行比较,同时进行结点次序的调整。typedef struct dnodedatatype data;int freq;struct DLnode*prior,*
15、next;DLnode,*DLinkList;DlinkList Locate(DLinkList L,datatype x)p=Lnext;while(p&p-data!=x)p=p-next;它*/if(!p)return(NULL);*/p-freq+;/*查找值为X的结点,使p指向/*若查找失败,返回空指针/*修改p的freq域while(p-prior!=L&p-prior-freqfreq)/*调整结点的次序*/k=pprior-data;p-prior-data=p-data;p-data=k;k=p-prior-freq;p-prior-freq=p-freq;p-freq=k
16、;p=p-prior;)retum(p);/*返回找到的结点的地址*/3.3课后习题解答#3.3.1 选择题1.向一个栈顶指针为Top的链栈中插入一个p 所指结点时,其操作步骤为(C)。A.Top-next=p;B.p-next=Top-next;Top-next=p;收集于网络,如有侵权请联系管理员删除精品文档C.p-next=Top;Top=p;D.p-next=Top;Top=Top-next;2.对于栈操作数据的原则是(B)。A.先 进 先 出 B.后 进 先 出 C.后进后出 D.不分顺序3.若已知一个栈的入栈序列是1,2,3,其输出序列为pi,p2,p3,,PN,若 PN是 n,则
17、pi是(D)oA.i B.n-i C.n-i+1 D.不确定4.表达式a*(bc)+d 的后缀表达式是(B)。A.abcd*-+B.abc-*d+C.abc*-d+D.+-*abcd5.采 用 顺 序 存 储 的 两 个 栈 共 享 空 间 topi代表第i 个栈(i=l,2)的栈顶,栈 1的底在S l,栈 2 的底在Sm,则栈满的条件是(B)oA.top2-topl|=0 B.topl+l=top2C.topl+topf2=m D.topl=top26.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是(C)。A.edcba B.decba C.dceab D.abcde7.在一
18、个链队列中,若 f,r分别为队首、队尾指针,则插入s所指结点的操作为(B)oA.f-next=r;f=s;B.r-next=s;r=s;C.s-next=r;r=s;D.s-next=f;f=s;8.用不带头结点的单链表存储队列时,在进行删除运算时(D)。A.仅修改头指针 B.仅修改尾指针C.头、尾指针都要修改 D.头、尾指针可能都要修改9.递归过程或函数调用时,处理参数及返回地址,要用一种称为(C)的数据结构。A.队列 B.静态链表 C.栈 D.顺序表10.栈和队都是(C)。A.顺序存储的线性结构 B.链式存储的非线性结构C.限制存取点的线性结构 D.限制存取点的非线性结构3.3.2判断题1
19、.栈和队列的存储,既可以采用顺序存储结构,又可以采用链式存储结构。(J)2.任何一个递归过程都可以转换成非递归过程。(J)3.若输入序列为123,4,5,6,则通过一个栈可以输出序列325,6,4,1。(V)4.通常使用队列来处理函数的调用。(X)5.循环队列通常用指针来实现队列的头尾相接。(X)3.3.3简答题1.循环队列的优点是什么?如何判别它的空和满?循环队列的优点是能够克服“假溢满”现象。设有循环队列s q,队满的判别条件为:(sq-rear+l)%maxsize=sq-front;或 sq-num=maxsize o队空的判别条件为:sq-rear=sq-fronto收集于网络,如有
20、侵权请联系管理员删除精品文档2.栈和队列数据结构各有什么特点,什么情况下用到栈,什么情况下用到队列?栈和队列都是操作受限的线性表,栈的运算规则 是“后进先出”,队列的运算规则是“先进先出”。栈的应用如数制转换、递归算法的实现等,队列的应用如树的层次遍历等。3.什么是递归?递归程序有什么优缺点?一个函数在结束本函数之前,直接或间接调用函数自身,称为递归。例如,函数f 在执行中,又调用函数f 自身,这称为直接递归;若函数f 在执行中,调用函数g,而 g在执行中,又调用函数f,这称为间接递归。在实际应用中,多为直接递归,也常简称为递归。递归程序的优点是程序结构简单、清晰,易证明其正确性。缺点是执行中
21、占内存空间较多,运行效率低。4.设有编号为1,2,3,4的四辆车,顺序进入一个栈式结构的站台,试写出这四辆车开出车站的所有可能的顺序(每辆车可能入站,可能不入站,时间也可能不等)。1234,1243,1324,1342,1432,213,2143,2314,2341,2431,3214,3241,3421,43214.3课后习题解答#4.3.1 选择题1.下面关于串的叙述错误的是(C)。A.串是字符的有限序列B.串既可以采用顺序存储,也可以采用链式存储C.空串是由空格构成的串D.模式匹配是串的一种重要运算2.串的长度是指(B)。A.串中所含不同字母的个数 B.串中所含字符的个数C.串中所含不同
22、字符的个数 D.串中所含非空格字符的个数3.已知串S=a a a b,其 Next数组值为(D)。A.0123 B.1123 C.1231 D.12114.二维数组M 的成员是6 个字符(每个字符占一个存储单元)组成的串,行下标i 的范围从0 到 8,列下标j 的范围从1到 1 0,则存放M 至少需要(D)个字节;M 的第8 列和第5 行共占(A)个字节;若M 按行优先方式存储,元素 M的起始地址与当M 按列优先方式存储时的(C)元素的起始地址一致。(1)A.90 B.180 C.240 D.540(2)A.108 B.114 C.54 D.60(3)A.M85 B.M310 C.D.M095
23、.数组A 中,每个元素的存储占3个单元,行下标i 从 1到 8,列下标j从 1至 U 10,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元个数是(C),若该数组按行存放,元素A85的起始地址是(C),若该数组按列存放,元素A85的起始地址是(C)。(1)A.80 B.100 C.240 D.270(2)A.SA+141 B.SA+144 C.SA+222 D.SA+225收集于网络,如有侵权请联系管理员删除精品文档(3)A.SA+141 B.SA+180 C.SA+117 D.SA+2256.稀疏矩阵采用压缩存储,一般有(C)两种方法。A.二维数组和三维数组 B.三元组和散列C.
24、三元组表和十字链表 D.散列和十字链表4.3.2判断题1.串相等是指两个串的长度相等。(X)2.KMP算法的特点是在模式匹配时指示主串的指针不会变小。(J)3.稀疏矩阵压缩存储后,必会失去随机存取功能。(J)4.数组是线性结构的一种推广,因此与线性表一样,可以对它进行插入,删除等操作。(义)5.若采用三元组存储稀疏矩阵,把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算。(X)6.若一个广义表的表头为空表,则此广义表亦为空表。(X)7.所谓取广义表的表尾就是返回广义表中最后一个元素。(X)4.3.3简答题1.KMP算法较朴素的模式匹配算法有哪些改进?KMP算法主要优点是主串指针不回溯。
25、当主串很大不能一次读入内存且经常发生部分匹配时,KMP算法的优点更为突出。2.设字符串 S=aabaabaabaac,P=aabaac。(1)给出S和 P 的next值和nextval值;(2)若 S 作主串,P 作模式串,试给出利用KMP算法的匹配过程。【解答】(1)S 的 next 与 nextval 值分另U 为 012123456789 和 002002002009,p 的next 与 nextval 值分别为 012123 和 002003。(2)利用BF算法的匹配过程:利用KMP算法的匹配过程:第一趟匹配:aabaabaabaac 第一趟匹配:aabaabaabaacaabaac(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构与算法 数据结构 算法 课后 习题 答案 教学 教材
限制150内