数据结构习题集.doc
《数据结构习题集.doc》由会员分享,可在线阅读,更多相关《数据结构习题集.doc(142页珍藏版)》请在三一办公上搜索。
1、数据结构习题集第一章 绪论16 试写一算法,自大至小依次输出顺序读入的三个整数X,Y和Z的值。 17 已知k阶裴波那契序列的定义为f0=0, f1=0, , fk-2=0,fk-1=1;fn=fn-1 + fn-2 + + fn-k, n=k,k+1, 试编写求k阶裴波那契序列的第m项值的函数算法,k和m均以值调用的形式在函数参数表中出现。 18 假设有A,B,C,D,E五个高等院校进行田径对抗赛,各院校的单项成绩均已存入计算机,并构成一张表,表中每一行的形式为编写算法,处理上述表格,以统计各院校的男、女总分和团体总分,并输出。项目名称性 别校 名成 绩得 分 19 试编写算法,计算i!2i的
2、值并存入数组a 0.arrsize-1的第i-1个分量中(I=1,2,n)。假设计算机中允许的最大值为maxint,则当narrsize或对某个k(1kn)使k!2kmaxint时,应按出错处理。注意选择你认为较好的出错处理方法。20 试编写算法求一元多项式的值Pn(x)=aixi的值Pn(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度。注意选择你认为较好的输入和输出方法。本题的输入为ai(I=0,1,n),x0和n,输出为Pn(x0)。第二章 线性表 本章算法设计题涉及的顺序表和线性链表的类型定义如下:#define LIST_INIT_SIZE 100#define LIST
3、INCREMENT 10typedef structElemttpe *elem; / 存储空间地址int length; /当前长度int listsize; /当前分配的存储容SqList; /顺序表类型typedef struct LnodeElemType data;Struct Lnode *next;Lnode,*LinkList; /线性链表类型2.10 指出以下算法中的错误和低效(即费时)之处,并将它改写为一个既正确又高效的算法。Status DeleteK(SqList&a,int i,int k) /本过程从顺序结构的线性表a中删除第i个元素起的k个元素if (i1ka .
4、length)return INFEASIBLE; /参数不合法else for(count=1;count=i+1;j-) a.elemj-1=a.elemj;a. length-;return OK;/DeleteK 2。11 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺序表的 适当位置上,以保持该表的有序性。 2。12 设A=(a1,am)和B=(b1,bn)均为顺序表,A/和B/分别为A和B中除去最大共同前缀后的子表(例如,A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为(x,y,y,z),在两表中除去最大共同前缀后的子表分
5、别为A/=(x,z)和B/=(y,x,x,z)。若A/=B/=空表,则A =B;若A/=空表,而B/空表,或者两者均不为空表,且A/的首元小于B/的首元,则A B;否则A B。试写一个比较A,B大小的算法(请注意:在算法中,不要破坏表A和B,并且,也不一定先求得A/和B才进行比较)。 2。13 试写一算法在带头结点得单链表结构上实现线性表操作LOCATE(L,X). 2。14 试写一算法在带头结点得单链表结构上实现线性表操作LENGTH(L). 2。15 已知指针ha和hb分别指向两个单链表得有结点,并且已知两个链表得长度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表的首元结点
6、连在另一个表的最后一个之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。请分析你的算法的时间复杂度。 2。16 已知指针la和lb分别指向两个无头接点单链表中的首元接点,下列算法是从表la中删除自第I个偶,将元素起共len个元素后,将它们插入到表lb中第I个元素之前。试问此算法是否真确?若有错,则请改正之。Staus DeleteAndInsertSub (LinkedList la, LinkedList lb,int i,int j,int len)if(i0j0len0) return INFEASIBLE;P=la;k=l;While(knext;k
7、+;q=p;while (knext;k+;s=lb;k=1;while(knext;k+;s-next=p; q-next=s-next;return OK;/DeleteAndInsertSub217 试写一算法,在无头结点的动态单链表上实现线性表操作INSERT(L,i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。218 同2.17题要求。试写一算法,实现线性表操作DELETE(L,i)。219 已知线性表中的元素以递增有序排列,并以单链表作存储结构。试写以高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删结点空间,并分析你的
8、算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。 220 同2.19题条件,试写一高效的算法,删除表中相同的多值元素(使得操作后得线性表中得所有元素得值均不相同),同时释放被删结点空间,并分析你得算法得时间复杂度。2.21试写一算法,实现顺序表的就地拟置,即利用原表的存储空间将线性表(a1,a2,an)逆置为(an,an-1,a1).2.22 试写一算法,对单链表实现就地逆置。2.23 设线性表A=(a1,a2,am),B=(b1,b2,bn),试写一个按下列规则合并A,B为线性表C的算法,即使得 C=(a1,b1,am,bm,bm+1
9、,,bn) 当mn时 ;或者 C=(a1,b1,an,bn,an+1,,bm) 当mn时.线性表A,B和C均以单链表作存储结构,且C表利用表A和表B中的结点空间构成,注意:单链表的长度值m和n均未显示存储。2.24 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表.2.25 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集
10、,且C中的元素也依值递增有序排列,试对顺序表编写求C的算法。2.26 要求同2.25题,是对单链表编写求C的算法。2.27 对2.25题的条件作以下两点修改,对顺序表重新编写求得表C的算法。 假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同; 利用表A的空间存放表C.2.28 对2.25题的条件作以下两点修改, 对顺序表重新编写求得表C的算法.假设在同一表(A或B)中可能存在值相同的元素,但要求新生成的表C中的元素值各不相同; 利用原表(A表或B表)中的结点构造C,并释放A表中的无用结点。2.29 已知A,B和C为三个递增有序的线性表,现要求对A表作如下操作:
11、删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法,并分析你的算法时间复杂度(注意:题中没有特别指明同一表中的元素值各不相同)。2.30 要求同2.29题,试写对单链表的编写算法,请释放A表中的无用结点。2.31 假设某个单向链表的长度大于1,且表中既无结点也无头指针。已知s为指向链表中的某个节点的指针,试编写算法在链表中删除指针s所指接点的前驱结点。2.32 已知有一个单项循环链表,其每个结点中含三个域:pre,data,和next,其中data为数据域,next为指向后继结点的指针域,pre业为指针域,但它的值为空(NULL).是编写算法将此单项循环链表改为双向循
12、环链表,即使pre成为指向前驱结点的指针域。2.33 已知有一个线性链表表示的线性表中含有三类字符的数据元素,(如字母字符,数据字符和其他字符),试编写算法将该线性表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。 在2.34至2.36题中,“异或指针双向链表”类型XorLinkedList和指针异或函数XorP定义为: Typedef struct XorNode char data ; struct NorNode LRPtr; XorNode,*XorPointer; Typedef struct /无头结点的异或指针双向链表 XorPointer Left, Righ
13、t; /分别指向链表的左端和右端 XorLinkedList; XorPointer XorP(XorPointer p, XorPointer q); /指针异或函数XorP返回指针p和q的异或(XOR)值2.34 假设在算法描述语言中引入指针的二元运算“异或”(用“”表示),若a和b为指针,则ab的运算结果仍为原指针类型,且 a(ab)=(aa)b=b (ab)b=a(bb)=a 则可利用一个指针域来实现双向链表L。链表中的每个结点只含两个域:data域和LRPtr域,其中LRPtr域存放该结点的左邻和右邻的结点指针(不存放在NULL)的异或。若设指针L.Left指向链表中的最左结点,L.
14、Right指向链表中的最右结点,则可实现从左向右或从右向左遍历此双向链表的操作。试写一算法,按任一方向依次输出链表中的各元素值。2.35 采用2.34题所述的存储结构,写出在第i个结点的算法。2.36 采用2.34题所述的存储结构,写出删除第i个结点的算法。2.37 设一带结点的双向循环链表表示的线性表L=(a1,a2,an).试写一个时间复杂度为O(n)的算法,将L改造为(a1,a3,an,a4,a2)。2.38 设有一个双向循环列表,每个结点中除了有pre,data,next三个域外,还增设了一个访问频度freq。在链表被启用之前,频度域freq的值均初始化为零,而每当用链表进行一次LOC
15、ATE(L,x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域freq的值便增一,同时调整链表中结点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的结点总是靠近表头结点。试编写符合以上要求的LOCATE操作算法。 在2.39至2.40题中,稀疏多项式采用的顺序存储结构SqPoly定义为 typedef struct int coef; int exp PolyTerm; typedef struct PolyTerm *data; int last; SqPoly;2.39 已知多项式Pn(X)=c1xe1+c2xe2+cmxem,其中n=emem-1e10,
16、ci0(i=1,2,m),m1.试采用存储量同多项式项数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0为给定值),并分析你的算法的时间复杂度。2.40 采用2.39题给定的条件和存储结构,编写求P(x)=Pn1(x)-Pn2(x)的算法,将结果多项式存放在新辟的空间中,并分析你的算法的时间复杂度。 在2.41至2.42题中,稀疏多项式采用的循环链表存储结构LinkedPoly定义为 typedef struct PolyNode PolyTerm data; Struct PolyNode *next; PolyNode,* PolyLink;Typedef PolyLink Link
17、edPoly;2.41 试以循环链表作稀疏多项式的存储结构,编写求其导函数的算法 ,要求利用原多项式中的结点空间存放其导函数(多项式),同时释放所有的无用(被删)结点。2.42 试编写算法,将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间构成这两个链表。第三章 栈和队列3.15 假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别为设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i
18、为0或者1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为参变)或函数设计这些操作算法各有什么优缺点。3.16 假设如题3.1所述火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软席车厢都被调整到硬席车厢之前。3.17 试写一个算法,识别依次读入的一个以为结束符的字符序列是否为形如序列1&序列2模式的字符序列。其中序列1和序列2中都不含字符&,且序列2是序列1的逆序列。例如,a+b&b+a是属该模式的字符序列,而13&3-1则不是。3.18 试写一个判别表达式中开、闭括号是否
19、配对出现的算法。3.19 假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”、方括号“”和“”和花括号“”和“”,且这三种括号可按任意的次序嵌套使用(如:())。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。3.20 假设以二维数组g(1.m,1.n)表示一个图像区域,gi,j表示该区域中点(i,j)所具颜色,其值为从0到k的整数。试编写算法置换点(i0,j0)所在区域的颜色。约定和(i0,j0)同色的上下左右的邻结点为同色区域的点。3.21假设表达式为单字母变量和双目四则运算符构成。试写一算法,降一个通常书写形式且书写正确地表达式转换
20、为逆波兰式。3.22如题3.21的假设条件,试写一算法,对以逆波兰式表示的表达式求值。3.23如题3.21的假设条件,试写一算法,判断给定的非空后缀表达式是否为正确的逆波兰式(即后缀表达式)。如果是,则将它转化为波兰式(即前缀表达式)。3.24 试编写如下定义的 递归算法,并根据算法画出求g(5,2)时栈的变化过程。 3.25 试写出求递归函数 F(n)的递归算法,并消除递归:3.26 求解平方根 A的迭代函数定义如下:其中,P是A的近似平方根,e是结果允许误差。试写出相应的递归算法,并消除递归。3.27 以知Aackerman函数的定义如下:(1) 写出递归算法;(2) 写出非递归算法;(3
21、) 根据非递归算法,画出求akm(2,1)时栈的变化过程。3.28 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队列和出队列的算法。3.29 如果希望循环队列的元素都能得到利用,则需设置一个标域tag,并以tag的值为0或1来区分,尾指针和头指针相同时的队列状态是“空”的还是“满”。试编写与此结构相应的入队列和出队列的算法,并从时间和空间角度讨论设标志和不设标志这两种方法的使用范围(如当循环队列容量较小而队列中每个元素占的空间较多时,哪一种方法较好)。330 假设将循环队列定义为:以域变量rear和length分别指示循环队列
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题集

链接地址:https://www.31ppt.com/p-2396583.html