第1章绪论
习题
1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。
3.简述逻辑结构的四种基本关系并画出它们的关系图。
4.存储结构由哪两种基本的存储方法实现
5.选择题
(1)在数据结构中,从逻辑上可以把数据结构分成()。
A.动态结构和静态结构 B.紧凑结构和非紧凑结构
C.线性结构和非线性结构 D.内部结构和外部结构
(2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。
A.存储结构 B.存储实现
C.逻辑结构 D.运算实现
(3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。
A.数据具有同一特点
B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致
C.每个数据元素都一样
D.数据元素所包含的数据项的个数要相等
(4)以下说法正确的是()。
A.数据元素是数据的最小单位
B.数据项是数据的基本单位
C.数据结构是带有结构的各数据项的集合
D.一些表面上很不相同的数据可以有相同的逻辑结构
(5)以下与数据的存储结构无关的术语是()。
A.顺序队列 B. 链表 C.有序表 D. 链栈
(6)以下数据结构中,()是非线性数据结构
A.树 B.字符串 C.队 D.栈
6.试分析下面各程序段的时间复杂度。
(1)x=90; y=100;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
(2)for (i=0; i for (j=0; j a[i][j]=0; (3)s=0; for i=0; i for(j=0; j s+=B[i][j]; sum=s; (4)i=1; while(i<=n) i=i*3; (5)x=0; for(i=1; i for (j=1; j<=n-i; j++) x++; (6)x=n; n108 C63.5 C1 C-1 C1 Cext=s; (*s).next=(*p).next; C.s->next=p->next; p->next=s->next; D.s->next=p->next; p->next=s; (14) 在双向链表存储结构中,删除p所指的结点时须修改指针()。 A.p->next->prior=p->prior; p->prior->next=p->next; B.p->next=p->next->next; p->next->prior=p; C.p->prior->next=p; p->prior=p->prior->prior; D.p->prior=p->next->next; p->next=p->prior->prior; (15) 在双向循环链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是()。 A.p->next=q; q->prior=p; p->next->prior=q; q->next=q; B.p->next=q; p->next->prior=q; q->prior=p; q->next=p->next; C.q->prior=p; q->next=p->next; p->next->prior=q; p->next=q; D.q->prior=p; q->next=p->next; p->next=q; p->next->prior=q; 2.算法设计题 (1)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。 void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ pa=La->next; pb=Lb->next; Lc=pc=La; 3 C想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。 A.x=top->data;top=top->link; B.top=top->link;x=top->link; C.x=top;top=top->link; D.x=top->link; (5)设有一个递归算法如下 int fact(int n) { 3 C0 C线性表的链式存储结构 D. 栈 (11)用链接方式存储的队列,在进行删除运算时()。 A. 仅修改头指针 B. 仅修改尾指针 C. 头、尾指针都要修改 D. 头、尾指针可能都要修改 (12)循环队列存储在数组A[0..m]中,则入队时的操作为()。 A. rear=rear+1 B. rear=(rear+1)%(m-1) C. rear=(rear+1)%m D. rear=(rear+1)%(m+1) (13)最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是()。 A. (rear+1)%n==front B. rear==front C.rear+1==front D. (rear-l)%n==front (14)栈和队列的共同点是()。 A. 都是先进先出 B. 都是先进后出 C. 只允许在端点处插入和删除元素 D. 没有共同点 (15)一个递归算法必须包括()。 A. 递归部分 B. 终止条件和递归部分 C. 迭代部分 D. 终止条件和迭代部分 (2)回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈) 根据提示,算法可设计为: 0’9’0’9’ 0’0’9’0’0’9’0’IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIOOIOO ②通过对①的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。 ①A和D是合法序列,B和C 是非法序列。 ②设被判定的操作序列已存入一维数组A中。 int Judge(char A[]) 0’0’M-1]实现循环队列,其中M是队列长度。设队头指针 front和队尾指 针rear,约定front指向队头元素的前一位置,rear指向队尾元素。定义front=rear时为 队空,(rear+1)%m=front 为队满。约定队头端入队向下标小的方向发展,队尾端入队向下 标大的方向发展。 (1)#define M 队列可能达到的最大长度 typedef struct { elemtp data[M]; int front,rear; } cycqueue; (2)elemtp delqueue ( cycqueue Q) 012121111212 C010102101 C100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。 A.808 B.818 C.1010 D.1020 (7)设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址 为()。 A.BA+141 B.BA+180 C.BA+222 D.BA+225 (8)设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元 素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。 A.13 B.33 C.18 D.40 (9)若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定a ij(i A.i*(i-1)/2+j B.j*(j-1)/2+i C.i*(i+1)/2+j D.j*(j+1)/2+i (10)A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是()。 A.i(i-1)/2+j B.j(j-1)/2+i C.i(j-i)/2+1 D.j(i-1)/2+1(11)设二维数组A[1.. m,1.. n](即m行n列)按行存储在数组B[1.. m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为()。 A.(i-1)*n+j B.(i-1)*n+j-1 C.i*(j-1) D.j*m+i-1 (12)数组A[0..4,-1..-3,5..7]中含有元素的个数()。 A.55 B.45 C.36 D.16 (13)广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为()。 A.(g) B.(d) C.c D.d (14)广义表((a,b,c,d))的表头是(),表尾是()。 A.a B.( ) C.(a,b,c,d) D.(b,c,d) (15)设广义表L=((a,b,c)),则L的长度和深度分别为()。 A.1和1 B.1和3 C.1和2 D.2和3 (1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。 模式串t的next和nextval值如下: (2)设目标为t=“abcaabbabcabaacbacba”,模式为p=“abcabaa” ①计算模式p的naxtval函数值; ②不写出算法,只画出利用KMP算法进行模式匹配时每一趟的匹配过程。 ① p的nextval函数值为0110132。(p的next函数值为0111232)。 ②利用KMP(改进的nextval)算法,每趟匹配过程如下: 第一趟匹配: abcaabbabcabaacbacba abcab(i=5,j=5) 第二趟匹配: abcaabbabcabaacbacba abc(i=7,j=3) 第三趟匹配: abcaabbabcabaacbacba a(i=7,j=1) 第四趟匹配: abcaabbabcabaac bacba (成功) abcabaa(i=15,j=8) (3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求: ①存放该数组所需多少单元 ②存放数组第4列所有元素至少需多少单元 ③数组按行存放时,元素A[7,4]的起始地址是多少 ④数组按列存放时,元素A[4,7]的起始地址是多少 每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。 (1)242 (2)22 (3)s+182 (4)s+142 (4)请将香蕉banana用工具 H( )—Head( ),T( )—Tail( )从L中取出。 L=(apple,(orange,(strawberry,(banana)),peach),pear) H(H(T(H(T(H(T(L))))))) (5)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。 void Count() 是字符串输入结束标志 {InvertStore(A); A[i++] = ch;0’0’0’m, 1..n] 含有m*n 个整数。 ①写一个算法判断a中所有元素是否互不相同输出相关信息(yes/no); ②试分析算法的时间复杂度。 [题目分析]判断二维数组中元素是否互不相同,只有逐个比较,找到一对相等的元素,就可结论为不是互不相同。如何达到每个元素同其它元素比较一次且只一次在当前行,每个元素要同本行后面的元素比较一次(下面第一个循环控制变量p的for循环),然后同第i+1行及以后各行元素比较一次,这就是循环控制变量k和p的二层for循环。 int JudgEqual(ing a[m][n],int m,n) [算法讨论]对数组中元素各比较一次,比较次数为n。最佳情况(已排好,正数在前,负数在后)不发生交换,最差情况(负数均在正数前面)发生n/2次交换。用类c编写,数组界偶是0..n-1。空间复杂度为O(1). 第5章树和二叉树 1.选择题 (1)把一棵树转换为二叉树后,这棵二叉树的形态是()。 A.唯一的B.有多种 C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子 (2)由3 个结点可以构造出多少种不同的二叉树() A.2 B.3 C.4 D.5 (3)一棵完全二叉树上有1001个结点,其中叶子结点的个数是()。 A.250 B. 500 C.254 D.501 (4)一个具有1025个结点的二叉树的高h为()。 A.11 B.10 C.11至1025之间 D.10至1024之间(5)深度为h的满m叉树的第k层有()个结点。(1= A.m k-1 B.m k-1 C.m h-1 D.m h-1 (6)利用二叉链表存储树,则根结点的右指针是()。 A.指向最左孩子 B.指向最右孩子 C.空 D.非空 (7)对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用()遍历实现编号。 A.先序 B. 中序 C. 后序 D. 从根开始按层次遍历 (8)若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用()遍历方法最合适。 A.前序 B.中序 C.后序 D.按层次 (9)在下列存储形式中,()不是树的存储形式 A.双亲表示法 B.孩子链表表示法 C.孩子兄弟表示法D.顺序存储表示法(10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()。 A.所有的结点均无左孩子B.所有的结点均无右孩子 C.只有一个叶子结点 D.是任意一棵二叉树 (11)某二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。 A.空或只有一个结点 B.任一结点无左子树 C.高度等于其结点数 D.任一结点无右子树 (12)若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为()。 A.X的双亲 B.X的右子树中最左的结点 C.X的左子树中最右结点 D.X的左子树中最右叶结点 (13)引入二叉线索树的目的是()。 A.加快查找结点的前驱或后继的速度 B.为了能在二叉树中方便的进行插入与删除C.为了能方便的找到双亲 D.使二叉树的遍历结果唯一 (14)线索二叉树是一种()结构。 A.逻辑 B.逻辑和存储 C.物理 D.线性 (15)设F 是一个森林,B 是由F 变换得的二叉树。若F 中有n 个非终端结点,则B 中右指针域为空的结点有( )个。 A . n-1 B .n C . n+1 D . n+2 2.应用题 (1)试找出满足下列条件的二叉树 ① 先序序列与后序序列相同 ②中序序列与后序序列相同 ③ 先序序列与中序序列相同 ④中序序列与层次遍历序列相同 先序遍历二叉树的顺序是“根—左子树—右子树”,中序遍历“左子树—根—右子树”,后序遍历顺序是:“左子树—右子树―根",根据以上原则,本题解答如下: (1) 若先序序列与后序序列相同,则或为空树,或为只有根结点的二叉树 (2) 若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树. (3) 若先序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树. (4) 若中序序列与层次遍历序列相同,则或为空树,或为任一结点至多只有右子树的二叉树 (2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C ①画出这棵二叉树。 ②画出这棵二叉树的后序线索树。 ③将这棵二叉树转换成对应的树(或森林)。 (1) (2) (3) 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为,,,,,,,。 ① 试为这 8个字母设计赫夫曼编码。 ② 试设计另一种由二进制表示的等长编码方案。 ③ 对于上述实例,比较两种方案的优缺点。 解:方案1;哈夫曼编码 先将概率放大100倍,以方便构造哈夫曼树。 w={7,19,2,6,32,3,21,10},按哈夫曼规则:【[(2,3),6], (7,10)】, ……19, 21, 32 (100) A B F D (C E H G (40)(60) 19 21 32 (28) (17)(11) 7 10 6 (5) 2 3 方案比较: 结论:哈夫曼编码优于等长二进制编码 (4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。 初态: 终态 3.算法设计题 以二叉链表作为二叉树的存储结构,编写以下算法: (1)统计二叉树的叶结点个数。 int LeafNodeCount(BiTree T) { i f(T==NULL) return 0; c;} 1 C1 C8 C 队列 C. 树 D .图 (9)用邻接表表示图进行深度优先遍历时,通常借助( )来实现算法。 A .栈 B. 队列 C. 树 D .图 (10)深度优先遍历类似于二叉树的( )。 A .先序遍历 B .中序遍历 C .后序遍历 D .层次遍历 (11)广度优先遍历类似于二叉树的( )。 A .先序遍历 B .中序遍历 C .后序遍历 D .层次遍历 (12)图的BFS 生成树的树高比DFS 生成树的树高( )。 A .小 B .相等 C .小或相等 D .大或相等 (13)已知图的邻接矩阵如图所示,则从顶点0出发按深度优先遍历的结果是( )。 图 邻接矩阵 A .0 2 4 3 1 5 6 B .0 1 3 6 5 4 2 C .0 1 3 4 2 5 6 D .0 3 6 1 5 4 2 ???? ??? ?? ? ? ???????????010 001 1 101 1000010 1101011 001 1001 0001100 10011011110 (14)已知图的邻接表如图所示,则从顶点0出发按广度优先遍历的结果是(),按深度优先遍历的结果是()。 A.0 1 3 2 B.0 2 3 1 C.0 3 2 1 D.0 1 2 3 图邻接表 (15)下面()方法可以判断出一个有向图是否有环。 A.深度优先遍历B.拓扑排序 C.求最短路径 D.求关键路径 2.应用题 (1)已知如图所示的有向图,请给出: ①每个顶点的入度和出度; ②邻接矩阵; ③邻接表; ④逆邻接表。 图有向图 (2)已知如图所示的无向网,请给出: ① 邻接矩阵; ② 邻接表; ③ 最小生成树 a → b 4→ c 3 b →a 4→ c 5→ d 5 → e 9^ c →a 3→b 5→d 5 →h 5^ d →b 5→c 5→ e 7 → f 6→ g 5→ h 4^ e →b 9→d 7→f 3 ^ f →d 6→e 3→g 2 ^ g →d 5→f 2→h 6 ^ h → c 5 → d 4 → g 6 ^ (3)已知图的邻接矩阵如所示。试分别画出自顶点1出发进行遍历所得的深度优先生成树和广度优先生成树。 图 无向网 ??? ?? ?? ???????????????????∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞6456252363794567555553955434 (4)有向网如图所示,试用迪杰斯特拉算法求出从顶点a 到其他各顶点间的最短路径,完成表。 D 终点 i=1 i=2 i=3 i=4 i=5 i=6 b 15 (a,b) 15 (a,b) 15 (a,b) 15 (a,b) 15 (a,b) 15 (a,b) c 2 (a,c) d 12 (a,d) 12 (a,d) 11 (a,c,f,d ) 11 (a,c,f,d) e ∞ 10 (a,c,e ) 10 (a,c,e) f ∞ 6 (a,c,f ) g ∞ ∞ 16 (a,c,f,g ) 16 (a,c,f,g) 14 (a,c,f,d,g) S 终点集 {a,c} {a,c,f } {a,c,f,e } {a,c,f,e,d } {a,c,f,e,d,g } {a,c,f,e,d,g, b} (5)试对图所示的AOE-网: ① 求这个工程最早可能在什么时间结束; ② 求每个活动的最早开始时间和最 图 邻接矩阵 图 有向网 迟开始时间; ③确定哪些活动是关键活动 图 AOE-网 【解答】按拓扑有序的顺序计算各个顶点的最早可能开始时间Ve和最迟允许开始时间Vl。然后再计算各个活动的最早可能开始时间e和最迟允许开始时间l,根据l - e= 0 来确定关键活动,从而确定关键路径。 1 2 3 4 5 6 此工程最早完成时间为43。关键路径为<1, 3><3, 2><2, 5><5, 6> 3.算法设计题 (1)分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作: ①增添一个新顶点v,InsertVex(G, v); ②删除顶点v及其相关的边,DeleteVex(G, v); ③增加一条边 ④删除一条边 dj) { [j].adj=1; ++; } return OK; }dj=0; ; return OK; }Status Delete_Arc(MGraph &G,char v,char w)dj) { [j].adj=0; ; } return OK; }余算法请自行写出. Status Insert_Arc(ALGraph &G,char v,char w)7.3.77.3.8irstarc;p;p=p->nextarc) { k=p->adjvex; if(!visited[k]&&exist_path(k,j)) return 1;irstarc;p;p=p->nextarc,level--) { level++; k=p->adjvex; if(!visited[k]&&exist_path(k,j)) return 1;irstarc;p;p=p->nextarc) { l=p->adjvex; if(!visited[l]) if(exist_path_len(G,l,j,k-1)) return 1; 2 C4 C3 C 50 30 100 60 80 8 20 35 40 ey==3) k--;ey==1) ey==2) if (i<=j) { temp=r[k];r[k]=r[j];r[j]=temp; j++;} j-1]作为红色,r[j..k-1]为白色,r[k..n]为兰色。从j=1开始查看,若r[j]为白色,则j=j+1;若r[j]为红色,则交换r[j]与r[i],且j=j+1,i=i+1;若r[j]为兰色,则交换r[j]与r[k];k=k-1。算法进行到j>k 为止。 算法片段如下: int i=1,j=1,k=n; while (j<=k) if (r[j]==1) n]中。若查找成功,则输出该记录在r 数组中的位置及其值,否则显示“not find ”信息。请简要说明算法思想并编写算法。 [题目分析]把待查记录看作枢轴,先由后向前依次比较,若小于枢轴,则从前向后,直到查找成功返回其位置或失败返回0为止。