1、1算法与数据结构复习题(0910)基本要求1算法与数据结构基本概念(1)数据、数据对象和数据结构(2)抽象数据类型(3)算法的特征及评价的标准(4)数据的存储结构类型2线形结构(1)顺序表的特点及存储结构(2)链表的特点及存储结构(3)栈的特点及基本操作(4)队列的特点及基本操作(5)顺序串和链串的存储结构(6)二维数组的地址计算(7)稀疏矩阵的概念及存储结构(8)线性表的排序(插入、选择和交换)(9)线性表的查找(顺序、折半和分块)3树形结构(1)二叉树的性质及存储结构(2)二叉树的遍历(3)线索二叉树(4)树的存储结构(5)树、二叉树与森林的转化方法(6)哈夫曼树(7)二叉排序树及平衡化(
2、8)堆排序树(9)B-树4图形结构(1)图的定义及存储结构(2)图的深度优先和广度优先遍历。(3)无向图的连通性和最小生成树(4)拓扑排序(5)关键路径(6)单源最短路径5散列表(哈希表)(1)散列表的概念(2)散列表解决散列冲突的方法(开放地址法、链地址法)(3)散列表的插入和删除6算法分析与设计基础(1)分治与递归的关系(2)贪心算法的思想(3)回溯与分支限界算法的比较(4)算法时间和空间复杂度的简单分析2一、单选题1数据结构被形式地定义为(D,R) ,其中 D 是A. 算法 B. 操作的集合 C. 数据元素的集合 D. 数据关系的集合2顺序表是线性表的A. 顺序存储结构 B. 链式存储结
3、构 C. 索引存储结构 D. 散列存储结构3下列程序段 for(i=1;inext;p-next=q-next;free(q); B. p=p-next;p-next=p-next-next;free(p);C. p-next=q-next;free(p-next); D. p=p-next-next;free(p-next); 7在一个单链表中,已知*p 结点不是最后结点,若在*p 之后插入结点*s,则执行操作A. s-next=p;p-next=s; B. s-next=p-next;p-next=sC. s-next=p-next;p=s; D. p-next=s;s-next= p ;
4、8设指针 p 指向双链表的某一结点,则双链表结构的对称性可以用下面的操作来反映A. p-prior-next=p-next-next; B. p-prior-prior=p-next-prior;C. p-prior-next=p- next-prior; D. p-next-next= p-prior-prior;9如果以链栈为存储结构,则出栈操作时A必须判栈满 B必须判别栈空 C. 判别栈中元素类型 D. 不必作任何判别10设有一个顺序栈,6 个元素 1、2 、3、4、5、6 依次入栈,如果 6 个元素出栈的顺序是 2、3、4、6、5、1,则栈的容量至少应该是A2 B3 C. 5 D. 6
5、11设一个栈的输入序列为 A,B,C,D,则借助一个栈所得到的输出序列不可能是AA,B,C,D BD,C,B,A C. A,C,D,B D. D,A,B,C12循环队列 AOm-1存放其元素值,用 front 和 rear 分别表示队头及队尾,则循环队列满的条件是A (Q.rear+1)m=Q.front BQ.rear=Q.front+1CQ.rear+l=Q.front DQ.real=Q.front13循环队列 A0 m1存放其元素值,用 front 和 rear 分别表示指向队头及队尾元素的指针,则当前队列中的元素数是A(rear-front+1+m)m B(rear-front+1)
6、 C(rear-front+m)m +1 D(rear-front+1+m)m 14稀疏矩阵一般的压缩存储方法有两种,它们是用A二维数组和三维数组 B三元组和散列表C 三元组和十字链表 D哈希表和十字链表15对矩阵压缩存储是为了A.方便运算 B.节省空间 C.方便存储 D.提高运算速度16 二维数组 A 的每个元素是由 6 个字符组成的串,其行下标 i=0,l,8,列下标为 j=1,210。设每个字符占一个字节,若按行先存储,元素 A8,5的起始地址与 A 按列存储时起始地址相同的元素是AA8,5 BA3,10 CA5,8 DA0,917字符串通常采用的两种存储方式是A. 散列存储和索引存储
7、B. 索引存储和链式存储C. 顺序存储和链式存储 D. 散列存储和顺序存储18将一棵有 100 个结点的完全二叉树从根这一层开始,每一层上从左到右依次对结点进行编号,根结点的编号3为 1,则编号为 49 的结点的左孩子编号为A. 98 B. 99 C. 50 D. 4819对二叉树从 1 开始进行连续编号,要求每个结点的编号大于其左右孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号,则可采用遍历方式是A.先序 B.中序 C.后序 D.层次遍历20中序表达式 A*(B+C)(D-E+F)的后序表达式是AA*B+C/D-E+F BAB*C+D/E-FC ABC+*DE-F+/
8、DABCDEF*+/-+21有 64 个结点的完全二叉树的深度为A. 8 B. 7 C. 6 D.522某二叉树的先序序列和后序序列正好相反,则该二叉树的特点一定是A. 空或只有一个结点 B.高度等于其结点数 C. 任一结点无左孩子 D.任一结点无右孩子23下面的说法中正确的是(1)任何一棵二叉树的叶子节点在三种遍历中的相对次序不变。(2)按二叉树定义,具有三个节点的二叉树共有 6 种。A(1),(2) B(1) C(2) D(1),(2)都错24二义树在线索化后,仍不能有效求解的问题是A. 先序线索二叉树中求先序后继 B. 中序线索二叉树中求中序后继C. 中序线索二叉树中求中序前趋 D. 后
9、序线索二又树中求后序后继25无向图 G=(V E),其中 V=a,b,C,d,e,f,E=,对该图进行深度优先排序,得到的顶点序列正确的是Aa,b,e,c,d,f Ba,c,f, e,b,dCa,e,b,c,f, d Da,e,d,f, c, b26以下说法不正确的是A无向图中的极大连通子图称为连通分量B连通图的广度优先搜索中一般要采用队列来暂存刚访问过的顶点C图的深度优先搜索中一般要采用栈来暂存刚访问过的顶点D有向图的遍历不可采用广度优先搜索27拓扑排序只能用于A. 有向图 B. 有向无环图 C. 无向图 D. 有向连通图28设图 G 用邻接表存储,则拓扑排序的时间复杂度为AD(n) B O
10、(n+e) CO(nn) D0(ne)29.对有 18 个元素的有序表作二分查找,则查找 A3的比较序列的下标为A. 1,2,3 B. 9,5,2,3 C9,5,3 D. 9,4,2,330关于散列法查找说法正确的是A采用链地址解决冲突时,查找一个元素的时间是相同的B 采用链地址解决冲突时,若规定插入总是在链首,则插入任一个元素的时间是相同的C采用链地址解决冲突容易引起聚集现象D再散列不易产生聚集31散列表的平均查找长度A与处理冲突方法有关而与表的长度无关B与处理冲突方法无关而与表的长度有关C 与处理冲突方法有关而与表的长度有关D与处理冲突方法无关而与表的长度无关432设哈希表长为 14,哈希
11、函数 H(key)=key11,表中已有数据的关键字为 15,38,61,84,四个,现将关键字为 49 的结点加到表中,用二次探测再散列法解决冲突,则放入的位置是A8 B3 C5 D933对散列文件,以下说法错误的是A散列文件插入、删除方便,不需要索引区且节省存储空间B散列文件只能按关键字随机存取且存取速度快C经过多次插入、删除后,可能出现溢出桶满的情况D 散列文件顺序存取方便34在平衡二叉树中插入一个结点后引起了不平衡,设最低(最接近于叶子)的不平衡点是 A,并已知 A 的左、右孩子的平衡因子分别为-1 和 0,则应进行的平衡旋转是ALL 型 B LR 型 CRL 型 DRR 型35.在平
12、衡二叉树中插入一个结点后造成了不平衡,设离插入点最近的不平衡结点 A 的平衡因子为-2,并已知插入前 A 的左孩子的平衡因子为 0,右孩子的平衡因子为 1,则应调整以使其平衡,所作的平衡旋转是A. LL 型 B. LR 型 C. RL 型 D. RR 型36.在 n 个结点且为完全二叉树的二叉排序树中查找一个键值,其平均比较次数的数量级为A. O(n) B. O(log2n) C. O(nlog2n) D. O(n2)37下面关于 B-树和 B+树的叙述中,不正确的结论是(A )。AB -树和 B+树都能有效地支持顺序查找BB -树和 B+树都能有效地支持随机查找CB -树和 B+树都是平衡的
13、多叉树DB -树和 B+树都可用于文件索引结构38在有向图 G 的拓扑序列中,若顶点 Vi 在顶点 Vj 之前,则下列情形不可能出现的是AG 中有弧 BG 中有一条从 Vi 到 Vj 的路径CG 中没有弧 D G 中有一条从 Vj 到 Vi 的路径39一个有 n 个顶点的无向连通图,它所包含的连通分量个数最多为A0 B1 Cn Dn+l40任何一个无向连通图的最小生成树A. 只有一棵 B. 有一棵或多棵 C. 一定有多棵 D. 可能不存在41关键路径是事件结点网络中A从源点到汇点的最长路径 B从源点到汇点的最短路径C最长的回路 D最短的回路42.下图的邻接表中,从顶点V1 出发采用深度优先搜索
14、法遍历该图,则可能的顶点序列是A. V1V2V3V4V5 B. V1V2V3V5V4 C. V1V4V3V5V2 D.V1V3V4V5V2 43以下说法不正确的是A无向图中的极大连通子图称为连通分量B连通图的广度优先搜索中一般要采用队列来暂存刚访问过的顶点C图的深度优先搜索中一般要采用栈来暂存刚访问过的顶点D有向图的遍历不可采用广度优先搜索44.对记录序列(314,298, 508,123,486,145) 依次按个位和十位进行两趟基数排序之后所得结果为5A. 123,145,298,314,486 ,508 B. 508,314,123,145,486,298C. 486,314,123,1
15、45,508 ,298 D. 298,123,508,486,145,31445排序算法中,算法可能会出现下面情况:初始数据有序时,花费的时间反而最多的是A. 堆排序 B. 冒泡排序 C. 快速排序 D. SHELL 排序46对于关键字序列(12,13 ,11,18,60,15,7,18,25,100) ,用筛选法建堆,则开始结点的键值必须为A. 100 B. 12 C. 60 D. 1547下列排序算法中,某一趟结束后未必能选出一个元素放在其最终位置上的是A. 堆排序 B. 冒泡排序 C. 快速排序 D. 直接插入排序48已知数据表 A 中每个元素距其最终位置不远,则采用最节省时间的排序算法
16、是A. 堆排序 B. 希尔排序 C. 快速排序 D. 插入排序49下列排序算法中,在待排序数据已基本有序时,效率最高的排序方法是A插入 B选择 C快速 D堆50将两个各有 n 个元素的有序表归并成一个有序表,其最少的比较次数是An B2n-1 C2n Dn-1二、填空题1算法的五个重要特性包括(有穷性 ) 、确定性、可行性、输入和输出。抽象数据类型是指一个(数学模型 )以及定义在该模型上的一组操作。2在线性结构中,开始结点没有结点,最后一个元素没有(后继)结点。线性表的逻辑结构是线性结构,其所含结点的个数称为线性表的(长度) 。对一个线性表分别进行遍历和逆置运算,其最好的时间复杂度量级均为(O
17、(n)) 。3数据的逻辑结构包括线性结构、树形结构、图形结构、 (集合类型) 。从存储结构的概念上讲,顺序表是(线性表 )的顺序存储结构。若线性表中最常用的操作是取第 i 个元素和查找该元素的前驱,则采用的存储方式最能节省时间的是(顺序表) 。若最常用的操作是插入和删除第 i 个元素,则采用的存储方式最能节省时间的是(单链表 ) 。4为了便于在单链表中进行操作,常在链表中设置(头结点) 。在一个不带头结点的单链表中,在表头插入或删除与在其他位置插入或删除操作过程不同,需要修改(头指针) 。在单链表中设置头结点的作用是(便于操作),无论链表是否为空。使(头指针)均不为空。对于双向链表,在两个结点
18、之间插入一个新结点需修改的指针共有(4 个) ,单链表为(2 个) 。5已知栈的输入序列为 1,2,3 ,n,输出序列为 a1,a2,an,a2=n 的输出序列共有(n-1)种输出序列。队列的特性是先入先出,栈的特性是(后入先出) 。如果以链栈为存储结构,则出栈操作时必须判别(栈空 )。与顺序栈相比,链栈有一个明显的优势是( 不易出现栈满 )。6循环队列采用数组 data1 n来存储元素的值,并用 front 和 rear 分别作为其头尾指针。为区分队列的满和空,约定:队中能够存放的元素个数最大为(n-l) ,也即至少有一个元素空间不用,则在任意时刻,至少可以知道一个空的元素的下标是(fron
19、t) ;入队时,可用语句( rear=rear+1%n)求出新元素在数组 data 中的下标。7数组 Al10,110的每个元素占 5 个单元,将其按列优先次序存储在起始地址为 1000 的连续的内存单元中,则元素 A5,6的地址为(1270) 。8两个串相等的充要条件是,两个串的长度相等,且其所对应各个位置的(字符)也相等。稀疏矩阵一般的压缩存储方法有两种,它们是(三元组顺序表)和十字链表。9若某二叉树有 20 个叶子结点,有 30 个结点仅有一个孩子,则该二叉树的总结点数是(69) 。已知二叉树有50 个叶子结点,则该二叉树的度为 2 的结点数是(51 ) ,该二叉树的总结点数至少是(99
20、) 。一棵二叉树 L 的高度为 h,所有结点的度或为 0,或为 2,则这棵二叉树最少的结点数为( 2h-1 )。610树 t 的存储结构为二叉链表 bt,树 t 中的一个叶子结点在 bt 中满足条件(bt-lchildlchildrchildnext!=p) q=qnext;temp=pdata; pdata=qdata;qdata=temp;(3)双向链表:q=pprior; temp=qdata; qdata=pdata;pdata=temp;2内存中一片连续空间(不妨设地址从 1 到 m) ,提供给两个栈 S1 和 S2 使用,怎样分配这部分存储空间,使得对任意一个栈,仅当这部分全满时才
21、发生上溢。(为了尽量利用空间,减少溢出的可能,可采用栈顶相向,栈底分设两端的存储方式,这样,对任何一个栈,仅当整个空间全满时才会发生上溢。) 3有字符串次序为 3*-y-a/y2,利用栈,给出将次序改为 3y-*ay2/-的操作步骤。 (可用 X 代表扫描改字符串过程中顺序取一个字符进栈的操作,用 S 代表从栈中取出一个字符加入到新字符串尾的出栈操作。例如,ABC 变为7BCA 的操作步骤为 XXSXSS) 。 (操作步骤为:XSXXXSSSXXSXXSXXSSSS )4有一棵 n 个结点的树,其中所有分支结点的度均为 k,求该树中叶子结点的个数。(1)设 no为叶子结点数,n k为度为 k
22、的结点数,n 为结点总数。(2)依题意:n=n o+nk 1) n= knk+1 2)综合 1) 和 2)得: n o=n-(n-1)/k 5有一个二叉树按顺序存储结构存放在一维数组中,如下图所示:试求:(1)该树的先序遍历序列。(2)画出该树的先序线索树。(1)先序序列 A-C-E-B-D (2)先序线索树6. 已知一棵二叉树的先序序列和中序序列分别为:abdgicefhj 及 bgidaecfjh,画出该的二叉树的不带头结点的后序线索二叉树。acdgie fhjb7按顺序输入下列顶点对: (1,2)、(1,6)、(2,6)、(1,4)、(6,4)、(1,3)、(3,4)、(6,5)、(4,
23、5)、(1,5)、(3,5),(1)画出相应的邻接表。(2)写出在邻接表上,从顶点 3 开始(表下标从 0 开始)的 DFS 序列。(1)邻接表A C B E DABE DCV1V2V3 V4V5V6 23450123454540 2 30 5 1 38(2)DFS 序列 2-4-0-3-5-18. 假设通信电文使用的字符集为a,b,c,d,e,f,g,字符的哈夫曼编码依次为:0110,10,110,111,00,0111和 010。(1)画出此哈夫曼树。(2)若这些字符在电文中出现的频度分别为 3、35、13、15、20、5、9,求哈夫曼树的带权路径长度。(1)哈夫曼树0 10 1 0 1e
24、 0 1 b 0 1g 0 1 c da f ()带权路径长度WPL=4*0.03+2*0.35+3*0.13+3*0.15+2*0.20+4*0.05+3*0.09=2.539. 已知有一个 10 个顶点的无向连通图,顶点编号为 1 至 10,其边的关系集合表示为(1,2) (1,3) , (1,8) ,(2,4) , (3,9) , (3,10) , (5,7) , (6,7) , (7,8) , (8,9),试求:画出该连通图及以顶点 1 为根的深度优先生成树。(1)连通图 (2)深度优先生成树12 3 84 10 9 75 612 34 10 9875 6442203530 1 0 5
25、 910一个 AOE 网络如图所示。 vei和 vli分别表示每个事件(顶点)的最早开始时间和最迟开始时间,ej和 lj分别表示每个活动(边)的最早开始时间和最迟开始时间。试求:求这个工程的最早结束时间和关键路径。(1) 最早结束时间为 43 (2) 关键路径: 11写出 对关键字序列503,087,512,061,908,124,897,275,653,426建立一棵平衡二叉排序树的过程,并写出调整平衡时的旋转类型。503 503 087 512 RL 087 897 061 124 908 061 124 512 908 897 503 503 087 897 RR 087 897 061
26、 124 512 908 061 275 512 908 275 653 124 426 653 426 12设二叉排序树中关键字由 1 至 1000 的整数组成,现要查找关键字为 363 的结点,下述关键字序列哪一个不可能是在二叉排序树中查到的序列?说明原因。 51,250,501,390,320,340,382,363; 24,877,125,342,501,623,421,363;(1) 是;不是。(2)因为查询序列 24,877,125,342,501,623,再查 421 时,其 623 左、右两个区间502-622623624-876,都不存在,查找失败。13对下面的关键字集(30
27、,15,21,40,25,26,36,37) ,若查找表的装填因子为 0.8,采用线性探测再散列解决冲突。试求:(1)设计哈希函数;(2)画出哈希表。(1)表长: m=n/=8/0.8 =10 哈希函数: H(key)=key%7 (2) 哈希表 0 1 2 3 4 5 6 7 8 9 14设一哈希表长为 13,采用线性探测法解决冲突,哈希函数 H(key)=key%13,(1)画出在空表中依次插入关键字 25,20,36,15,41,52,29,72,67 后的哈希表。(2)求在等概率情况下,查找成功的平均查找长度。(1)哈希表(1) 100 101 102 103 104 105 106
28、107 108 109 110 111 112e 0 0 15 19 19 15 29 38l 15 0 15 27 19 27 37 38l-e -15 0 0 -8 0 -12 -8 0e 0 0 15 19 19 15 29 38l 15 0 15 27 19 27 37 38l-e -15 0 0 -8 0 -12 -8 021 15 30 36 25 40 26 371052 15 41 29 67 20 72 36 25(2)平均查找长度查找成功的平均查找长度=(5*1+3*2+1*4)/9=1.615. 对下面的关键字集35,15,21,99,25,26,36,37,01,18写
29、出快速排序的每趟结果和最终结果。第一趟 18,15,21,01,25,263536,99第二趟 01,151821,25,26第三趟 0115第四趟 2125,26第五趟 2526第六趟 3699最终结果: 01,15,18,21,25,26,35,36,9916设有 n 个无序元素,按非递减次序排序,但只想得到前面长度为 k 的部分序列,其中 nk,最好采用什么排序方法?为什么?(1)采用堆排序最合适。(2)因为当部分序列较小时,堆排序的时间复杂度近似为 O(n)。四、算法阅读题1. 设有一个由正整数组成的无序单链表,阅读下面的算法,指出该算法的功能,并在“/”后面加上必要的注释。void
30、F1(Linklist pre=p; /pre 为最小结点指针while(p) if(pdata e 0 0 15 19 19 15 29 38l 15 0 15 27 19 27 37 38l-e -15 0 0 -8 0 -12 -8 011(1) 按中序遍历二叉树,逆序建立以叶子结点为链表结点、以 L 为头指针的无头结点的单链表。 (2) (略)3假设一个仅包含二元运算符的算术表达式以二叉链表形式存储在二叉树 T 中,阅读下面的算法,指出该算法的功能,并在“/”后面加上必要的注释。int F1(BiTrec T)if(!T) return 0; if(!Tlchild Lv= F1(Tl
31、child);Rv= F1(Trchild); switch(Tdata)/(2)运算case + : V=Lv+Rv; break; case- : V=Lv-Rv; break;case*: V=Lv*Rv; break; case/: V=lv/Rv; break; /switchreturn V;/(3)返回结果/F1算法功能:后序遍历二叉树,求算术表达式的值。4假设哈希函数为 H(key),下面算法的功能是用链地址法解决冲突的哈希表的插入算法。请填空补全算法,并在“/”后面给以注释。Void F2( HashTable /if(Hi=Null) s=(Linklist)malloc(
32、sizeof(Lnode); sdata=key; snext=Hi; Hi=s; /ifelse (2)_)/while(p if(pdata=key) exit(1);else (3)_;/snext=Hi; Hi=s;/ else/else/F25下面算法的功能是实现单链表中的简单选择排序,其中 L 为链表的头结点指针,请填空补全算法,并在“/”后面给以注释。 void F2(LinkList /初始化,p 为工作指针while(p) min=p; (1)_;/ while(2)_) /if(qdatadata) min=p; q=qnext;/while(q)if( (3)_)/ te
33、mp=pdata; pdata=mindata;mindata=temp; /ifp=pnext; /while(p)/F212(1)q=pnext; q 为插入指针,min 为当前最小指针(2)q 或 q !=null 一趟选择排序(3)min 交换结点数据 6在有向图 G 中,如果 r 到 G 的每个结点都有路径可达,则称结点 r 为 G 的根结点,下面算法的功能是判断有向图 G 是否有根,若有,则打印出所有根结点的值。请填空补全算法,并在“/”后面给以注释。void F2(ALGraph G) /利用深度优先搜索,判断有向图 G 是否有根结点。int visitedmaxsige,cou
34、nt; /count 为记录结构的顶点数。for(v=0;v=1-p) *(p+1)=*p; *p=x; /插入 xfor(q= p=q;q+) (*q)+;/elsem+; /if/F1算法功能:将数据 x 插入到 D 区,插入后 D 和 S 关系不变。8. 假设哈希函数为 H(key),阅读下面的算法,指出该算法的功能,并在“/”后面加上必要的注释。void f8(HashTable /获得哈希地址if(Hi= =Null) exit(1);p=Hi;q=p; / p 为工作指针,q 为 p 前趋while(p p=pnext;/while if(!p) exit(1);if(q=Hi)
35、/(2) key 为第一结点Hipnext; free(p);/ ifelseqnext=pnext; /(3) 删除结点13free(p);/else/ f8算法的功能:链地址法解决冲突的哈希表的删除算法。五、算法设计题1. 已知 f 为单链表的表头指针,链表中存储的都是整型数据,试设计算法用直接插入排序使链表非递减有序。void InsertSort_L(Linklist LanextnextNull;while(p!=Null)r=pnext;/暂存 p 的后继。q=La;while(qnext /初始化,p 为工作指针while(p)/q 为插入指针,min 为当前最小指针14min=
36、p;q=pnext;while(q) /一趟选择排序if(qdatadata) min=p; q=qnext;/while(q)if(min)/交换temp=pdata; pdata=mindata;mindata=temp;/ifp=pnext;/while(p)/Selectsort4已知深度为 h 的二叉树采用顺序存储结构存放在数组 B12h-1中,设计一个递归算法,产生该二叉树的二叉链表结构。void CreateTree(int B2h,int j,BiTree t)/创建 t 树的二叉链表结构,j 为数组下标,初值为 1t=( BiTree ) malloc( sizeof(BiT
37、Node);tdata=Bj; /创建根结点if(2*j2h) tLchild=null;/无左子树else /递归创建左子树tLchild=CreateTree(B,2*j,tLchild);if(2*j+12h) tRchild=null;/无右子树else /递归创建右子树tRchild=CreateTree(B,2*j+1,tRchild);/ CreateTree 5设用输入广义表表示的字符串来创建二叉链表结构的二叉树,具体规定如下:广义表的表名作为树的根结点;每个结点的左子树和右子树用逗号分割,若仅有右子树,则逗号不能省略;以特殊符号$表示广义表的结尾。例如:若输入的字符串为 A(
38、B(C),D(E(,F),G)。实现用上述方法创建二叉树的算法。void CreatTree(BiTree int k,j=0,top=-1; /j 为 str 指针,top 为栈顶指针T=null; /初始化栈根指针Char ch=strj;while(ch!=$)switch(ch)case (: top +; stacktop=p; /入栈k=1; break; / k=1,为左孩子case ): top-;break; /出栈case ,: k=2; break; /k=2,为右孩子default: p=(BiTree)malloc(sizeof(BTNode);pdata=ch; p
39、lchild=prchild=Null;if(T=Null) T=p; /创建根结点elseswitch(k)case 1: stacktoplchild=p;break;case 2: stacktoprchild=p;break;15/switch/swithj+;ch=strj;/ while/creatTree6设计算法,求以邻接表为存储结构的非连通无向图 G 的连通分量个数。int count_graph(ALGraph G)/ 求以邻接表为存储结构的非连通无向图 G 的连通分量个数count=0;for(i=0;idata)if(!Tfirstchild /输出一条路径else O
40、utpath(Tfirstchild , T=Tnextsibiling; / 遍历右子树16/while/Outpath 9设计算法实现以逆邻接表为存储结构的有向图的拓扑排序(要求给出逆邻接表的存储结构定义) 。(1)存储结构定义顶点结构 表结点结构 (2) 算法设计int toposort (ALGraph G,int tpv) /以逆邻接表为存储结构的有向图的拓扑排序top=0;for(i=0;iG.vexnum;i+) for(p=G.adjlisti.firstedge;p;pnext)findoutdegree(G,outdegree); / 对各顶点求出度outdegreepad
41、jvex+; InitStack( /初始化栈for(i=0;iG.Vexnum;i+) if(outdegreei=0) Push( /出度为零的顶点入栈while(!Stack(S)Pop(printf(G.adjlisti.vextex);tpvtop+=i;for(p=G.adjlisti.firstedge;p;pnext)j=padjvex; outdegreej-;if(!outdegreej) Push( /出度为零的顶点入栈/for/whileif(topG.vexnum) return 0; /无环else /输出顶点拓扑排序序列for(i=0;j=top-1;i G.ve
42、xnum/2;i+,j-)/置逆输出temp=tpvi;tpvi=tpvj;tpvj=temp;/forreturn 1;/else/toposort10. 设计算法,判断一个以邻接表为存储结构的无向图 G 是否连通有,若连通,则返回 1,否则,返回 0。int connect(ALGraph G) /判断以邻接表为存储结构的无向图是否连通flag=1;for(i=0;iG.vexnum;i+) visitedi=0; dfs(G,visited,0); (2 分) for(i=0;iG.vexnum;i+)if(visitedi=0) flag=0; breek; return flag;/ connectvoid dfs(ALGraph G,int visited,int v)/采用深度优先遍历的算法思想visitedv=1;p=G.verv.firstarc;while(p)if(visitedpadjvex=0)dfs(G,visited,padjvex);vexdata firstin adjvex info firstarc17p=pnext;/whike/dfs