1、1第二章 线性表二、填空题1.为了便于讨论,有时将含 n(n=0)个结点的线性结构表示成(a 1,a 2,an),其中每个 ai代表一个结点。a 1称为起始结点,a n称为终端结点,i 称为 ai在线性表中的位置或序号。对任意一对相邻结点 ai、a i1 (1=1)个内存单元,其中,b 是顺序表的第一个存储结点的第一个单元的内存地址,那么,第 i 个结点 ai的存储地址为 b+(i-1)Xk。10.以下为顺序表的插入运算,分析算法,请在_处填上正确的语句。Void insert_sqlist(sqlist L,datatype x,int i)/*将 X 插入到顺序表 L 的第 i-1 个位置
2、*/ if( L.last = maxsize) error(“表满”);if(iL.last+1)error(“非法位置”);for(j=L.last;j=i;j-)L.dataj=l.dataj-1;L.datai-1=x;L.last=L.last+1;11.对于顺序表的插入算法 insert_sqlist 来说,若以结点移动为标准操作,则插入算法的最坏时间复杂性为_n_,量级是_O(n)_。插入算法的平均时间复杂性为 n/2,平均时间复杂性量级是 O(n)。12.以下为顺序表的删除运算,分析算法,请在_处填上正确的语句。void delete_sqlist(sqlist L,int i
3、) /*删除顺序表 L 中的第 i-1 个位置上的结点*/if(iL.last)error(“非法位置”) ;for(j=i+1;j=L.last;j+)_L.dataj-2=L.dataj-1_;L.last=L.last-1;13.对于顺序表的删除算法 delete_sqlist 来说,若以结点移动为标准操作,最坏情况时间复杂性及其量级分别是_n-1_和_O(n)_,其平均时间复杂性及其量级分别为_(n-1)/2_和_O(n)_。14.以下为顺序表的定位运算,分析算法,请在_处填上正确的语句。int locate_sqlist(sqlist L,datatype X) /*在顺序表 L 中
4、查找第一值等于 X 的结点。若找到回传该结点序号;否则回传 0*/_;while(iL.last)if(_i=1 inext=NULL;return(t);24.以下为求单链表表长的运算,分析算法,请在 _处填上正确的语句。int length_lklist(lklist head) /*求表 head 的长度*/p=head;j=0;while(p-next!=NULL)p=p-next;j+;return(j); /*回传表长*/25.以下为单链表按序号查找的运算,分析算法,请在_处填上正确的语句。pointer find_lklist(lklist head,int i) p=head;
5、j=0;while(p-next!=NULL) j+; if(i=j) return(p);else return(NULL);26.以下为单链表的定位运算,分析算法,请在_处填上正确的语句。int locate_lklist(lklist head,datatype x)/*求表 head 中第一个值等于 x 的结点的序号。不存在这种结点时结果为 0*/ p=head;j=0;while(p-next!=NULL)j+;if (p-data=x) return(j);else return(0);27.以下为单链表的删除运算,分析算法,请在_处填上正确的语句。void delete_lkli
6、st(lklist head,int i) p=find_lklist(head,i-1);if(p!=NULL)p-next=p-next;free(q);else error(“不存在第 i 个结点”)28.以下为单链表的插入运算,分析算法,请在_处填上正确的语句。void insert_lklist(lklist head,datatype x,int i)/*在表 head 的第 i 个位置上插入一个以 x 为值的新结点*/ p=find_lklist(head,i-1);if(p=NULL)error(“不存在第 i 个位置”);else s=malloc(size);s-data=
7、x;s-next=p-next;p-next=s;29.以下为单链表的建表算法,分析算法,请在_处填上正确的语句。lklist create_lklist1()/*通过调用 initiate_lklist 和 insert_lklist 算法实现的建表算法。假定$是结束标志*/ ininiate_lklist(head);i=1;scanf(“%f”,while(x!=$)insert_lklist(head,x,i);i+;scanf(“%f”,return(head);该建表算法的时间复杂性约等于 n(n-1)/2,其量级为 O(n2)。30.以下为单链表的建表算法,分析算法,请在_处填上
8、正确的语句。lklist create_lklist2() /*直接实现的建表算法。*/ head=malloc(size);p=head;scanf(“%f”,while(x!=$) q=malloc(size);q-data=x;p-next=q;p=q;scanf(“%f”,p-next=NULL;return(head);此算法的量级为 O(n)。31除单链表之外,线性表的链式存储结构还有单项循环链表和双向循环链表等。32循环链表与单链表的区别仅仅在于其尾结点的链域值不是 NULL,而是一个指向头结点的指针。33在单链表中若在每个结点中增加一个指针域,所含指针指向前驱结点,这样构成的链
9、表中有两个方向不同的链,称为双链表。34C 语言规定,字符串常量按字符数组处理,它的值在程序的执行过程中是不能改变的。而串变量与其他变量不一样,不能由赋值语句对其赋值。35含零个字符的串称为空串,用表示。其他串称为非空串。任何串中所含字符的个数称为该串的长度。36当且仅当两个串的长度相等并且各个对应位置上的字符都相同_时,这两个串相等。一个串中任意个连续字符组成的序列称为该串的子串,该串称为它所有子串的主串。37串的顺序存储有两种方法:一种是每个单元只存一个字符,称为非紧缩格式,另一种是每个单元存放多个字符,称为紧缩格式。38通常将链串中每个存储结点所存储的字符个数称为结点大小。当结点大小大于
10、 1 时,链串的最后一个结点的各个数据域不一定总能全被字符占满,此时,应在这些未用的数据域里补上不属于字符集的特殊符号。三、单向选择题31对于线性表基本运算,以下结果是正确的是 ( 2 )初始化 INITIATE(L),引用型运算,其作用是建立一个空表 L=. 求表长 LENGTH(L),引用型运算,其结果是线性表 L 的长度读表元 GET(L,i), 引用型运算。若 1data 是一个数据元素,p-next 的值是一个指针11.单链表的一个存储结点包含 ( 4 )数据域或指针域指针域或链域指针域和链域数据域和链域12.对于单链表表示法,以下说法错误的是 ( 3 )数据域用于存储线性表的一个数
11、据元素指针域或链域用于存放一个指向本结点所含数据元素的直接后继所在结点的指针所有数据通过指针的链接而组织成单链表NULL 称为空指针,它不指向任何结点,只起标志作用13.对于单链表表示法,以下说法错误的是 ( 5 )指向链表的第一个结点的指针,称为头指针单链表的每一个结点都被一个指针所指任何结点只能通过指向它的指针才能引用终端结点的指针域就为 NULL尾指针变量具标识单链表的作用,故常用尾指针变量来命名单链表14有时为了叙述方便,可以对一些概念进行简称,以下说法错误的是 ( 4 )将“指针型变量”简称为“指针”将“头指针变量”称为“头指针”将“修改某指针型变量的值”称为“修改某指针”将“p 中
12、指针所指结点”称为“P 值”15设指针 P 指向双链表的某一结点,则双链表结构的对称性可用( 3 )式来刻画p-prior-next-=p-next-nextp-prior-prior-=p-next-priorp-prior-next-=p-next-priorp-next-next=p-prior-prior16.以下说法错误的是 ( 1 ) 对循环链表来说,从表中任一结点出发都能通过前后操作而扫描整个循环链表对单链表来说,只有从头结点开始才能扫描表中全部结点双链表的特点是找结点的前趋和后继都很容易对双链表来说,结点*P 的存储位置既存放在其前趋结点的后继指针域中,也存放在它的后继结点的前
13、趋指针域中。17在循环链表中,将头指针改设为尾指针(rear)后,其头结点和尾结点的存储位置分别是 ( 2 )real 和 rear-next-nextrear-next 和 real4rear-next-next 和 rearrear 和 rear-next18.以下说错误的是 ( 3 ) 对于线性表来说,定位运算在顺序表和单链表上的量级均为 O(n)读表元运算在顺序表上只需常数时间 O(1)便可实现,因此顺序表是一种随机存取结构在链表上实现读表元运算的平均时间复杂性为 O(1)链入、摘除操作在链表上的实现可在 O(1)时间内完成链入、摘除操作在顺序表上的实现,平均时间复杂性为 O(n)19
14、在串的基本运算中,属于加工型运算的有 ( 4 )EQAL(S,T) LENGTH(S)CONCAT(S,T) REPLACE(S,T,R) INDEX(S,T)20. 在串的基本运算中,属于引用型运算的有 ( 4 )ASSIGN(S,T) INSERT(S1,i,S2)DELETE(S,i,j) SUBSTR(S,i,j) REPLACE(S,T,R)21循环链表主要优点是 ( 4 )不再需要头指针了已知某个结点的位置后,能够容易找到它的直接前趋在进行插入、删除运算时,能更好地保证链表不断开从表中任一结点出发都能扫描到整个链表22,每种数据结构都具备三个基本操作:插入、删除和查找,这种说法 (
15、 2 )正确 错误23以下说法错误的是 ( 2 )数据的物理结构是指数据在计算机内实际的存储形式算法和程序没有区别,所以在数据结构中二者是通用的对链表进行插人和删除操作时,不必移动结点双链表中至多只有一个结点的后继指针为空24以下说法正确的是 3线性结构的基本特征是:每个结点有且仅有一个直接前趋和一个直接后继线性表的各种基本运算在顺序存储结构上的实现均比在链式存储结构上的实现效率要低在线性表的顺序存储结构中,插人和删除元素时,移动元素的个数与该元素位置有关顺序存储的线性表的插人和删除操作不需要付出很大的代价,因为平均每次操只有近一半的元素需要移动25以下说法错误的是 ( 4 )求表长、定位这二
16、种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低顺序存储的线性表可以随机存取由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活线性表的链式存储结构优于顺序存储结构26以下说法错误的是 (2 )线性表的元素可以是各种各样的,逻辑上相邻的元素在物理位置上不一定相邻在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上不一定相邻在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素27以下说法正确的是( 3 )在单链表中,任何两个元素的存储位置之间都有固定的联系,因为可以从头结点进行查找任何
17、一个元素在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构顺序存储结构属于静态结构,链式结构属于动态结构顺序存储方式只能用于存储线性结构28.以下说法正确的是( 4 )顺序存储方式的优点是存储密度大、且插入、删除运算效率高链表的每个结点中都恰好包含一个指针线性表的顺序存储结构优于链式存储结构顺序存储结构属于静态结构,链式结构属于动态结构29.下面关于线性表的叙述正确的是( 1 )线性表采用顺序存储,必须占用一片连续的存储单元线性表采用顺序存储,便于进行插人和删除操作线性表采用链接存储,不必占用一片连续的存储单元线性表采用链接存储,不便于插人和删除操作30.线
18、性表 L=(a1,a2,.,ai,.,an),下列说法正确的是( 4 )每个元素都有一个直接前驱和直接后继线性表中至少要有一个元素表中诸元素的排列顺序必须是由小到大或由大到小的除第一个元素和最后一个元素外其余每个元素都有一个且仅有一个直接前驱和直接后继31.线性表的逻辑顺序与存储顺序总是一致的,这种说法( 2 )正确 不正确32.设 p,q 是指针,若 p=q,则*p=*q ,这种说法( 2 ) 正确 不正确33.线性表若采用链表存储结构时,要求内存中可用存储单元的地址( 4 )必需是联系的 部分地址必须是连续的一定是不连续的 连续不连续都可以34.设 REAR 是指向非空带头结点的循环单链表
19、的尾指针,则删除表首结点的操作可表示为( 4 )p=rear; rear=rear-next;rear=rear-next; free(rear);free(p)rear=rear-next-next; p=rear-next-next;free(rear); rear-next-next=p-next;free(p); 535. 单链表中,增加头结点的目的是为了 ( 3 )使单链表至少有一个结点 标示表结点中首结点的位置方便运算的实现 说明单链表是线性表的链式存储实现36 线性结构中的一个结点代表一个数据元素,通常要求同一线性结构的所有结点所代表的数据元素具有相同的特性,这意味着 3 每个结
20、点所代表的数据元素都一样。 每个结点所代表的数据元素包含的数据项的个数要相等 不仅数据元素包含的数据项的个数要相同,而且对应数据项的类型要一致 结点所代表的数据元素有同一特点37带头结点的单链表 Head 为空的判定条件是 2Head=Null Head-next=NULL Head-next=Head38.非空的单循环链表 L 的尾结点*P,满足 3P-next=NULL P=NULL P-next=L P=L.39.双向链表结点结构如下:LLink data RLink其中:LLink 是指向前驱结点的指针域:data 是存放数据元素的数据域;Rlink 是指向后继结点的指针域。下面给出的
21、算法段是要把一个新结点*Q 作为非空双向链表中的结点*p 的前驱,插入到此双向链表中。不能正确完成要求的算法段是 2Q-LLink=P-LLink; P-LLink=Q;Q-Rlink=P; Q-Rlink=P;P-LLink=Q; P-LLink-Rlink=Q;P-LLink-Rlink=Q; Q-LLink=P-LLink;Q-LLink=P-LLink;Q-Rlink=P;P-LLink-Rlink=Q;P-LLink=Q;40.若某线性表中最常用的操作是取第 i 个元素和找第 i 个元素的前趋元素,则采用( 1 )存储方式最节省时间。顺序表 单链表 双链表 单循环链表41串是任意有限
22、个 4符号构成的集合 符号构成的序列字符构成的集合 字符构成的序列第三、四章练习题3.1 设将整数 1,2,3,4 依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:(1)若入、出栈次序为 Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈的数字序列为何(这里 Push(i)表示 i 进栈,Pop( )表示出栈)? (2) 能否得到出栈序列 1423 和 1432?并说明为什么不能得到或者如何得到。 (3)请分析 1,2 ,3 ,4 的 24 种排列中,哪些序列是可以通过相应的入出栈操
23、作得到的。 答:(1)出栈序列为:1324(2)不能得到 1423 序列。因为要得到 14 的出栈序列,则应做 Push(1),Pop(),Push(2),Push (3),Push(4),Pop()。这样,3 在栈顶,2 在栈底,所以不能得到 23 的出栈序列。能得到 1432 的出栈序列。具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。(3)在 1,2 ,3 ,4 的 24 种排列中,可通过相应入出栈操作得到的序列是:1234,1243,1324,1342,1432,2134,2143,2314,2341,243
24、1,3214,3241,3421,4321不能得到的序列是:1423,2413,3124,3142,3412,4123,4132,4213,4231,43123.2 链栈中为何不设置头结点? 答: 链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。3.3 设长度为 n 的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何? 若只设尾指针呢? 答:当只设头指针时,出队的时间为 1,而入队的时间需要 n,因为每次入队均需从头指针开始查找,找到最后一个元素时方可进行入队操作。若只设尾指针
25、,则出入队时间均为 1。因为是循环链表,尾指针所指的下一个元素就是头指针所指元素,所以出队时不需要遍历整个队列。3.4 指出下述程序段的功能是什么? (1) void Demo1(SeqStack *S)int i; arr64 ; n=0 ;while ( StackEmpty(S) arrn+=Pop(S);6for (i=0, i=1)层上至多有_2 i-1_个结点。5.深度为 k(k=1)的二叉树至多有 2k-1 个结点。6.对任何二叉树,若度为 2 的节点数为 n2,则叶子数 n0=n2+1 。7.满二叉树上各层的节点数已达到了二叉树可以容纳的最大值。满二叉树也是完全二叉树,但反之不
26、然。8.具有 n 个结点的完全二叉树的深度为 floor(log2n)+1。9.如果将一棵有 n 个结点的完全二叉树按层编号,则对任一编号为 i(1n,则结点 X 无左孩子且无右孩子;否则,X 的左孩子 LCHILD(X)的编号为 2i。( 3) 若 2i+1n,则结点 X 无右孩子;否则,X 的右孩子 RCHILD(X)的编号为 2i+1。10.二叉树通常有顺序存储结构和链式存储结构两类存储结构。11.每个二叉链表的访问只能从根结点的指针,该指针具有标识二叉链表的作用。12.对二叉链表的访问只能从根指针开始,若二叉树为空,则 root=NULL.13.二叉链表中每个存储结点的每个指针域必须有
27、一个值,这个值或者是指向该结点的一个孩子的指针,或者是空指针 NULL。14.具有 n 个结点的二叉树中,一共有 2n 个指针域,其中只有 n-1 个用来指向结点的左右孩子,其余的 n+1 个指针域为 NULL。15二叉树有不同的链式存储结构,其中最常用的是二叉链表与三叉链表。16可通过在非完全二叉树的“残缺”位置上增设“虚结点”将其转化为完全二叉树。17以下程序段采用先根遍历方法求二叉树的叶子数,请在横线处填充适当的语句。Void countleaf(bitreptr t,int *count)/*根指针为 t,假定叶子数 count 的初值为 0*/if(t!=NULL)if(t-lchi
28、ld=NULL)countleaf(t-lchild,countleaf(l-rchile,count);18一棵二叉树由根、左子树和右子树三部分组成,因此对二叉树的遍历也可相应地分解成_访问根结点,遍历左子树,遍历右子树三项“子任务” 。19若以 D、L、R 分别表示二叉树的三项子任务,限定“先左后右” ,这样可能的次序有:DLR ,LDR,LRD 三种,按这三种次序进行的遍历分别称为前序遍历,中序遍历,后序遍历。20树的主要遍历方法有_先根遍历,后根遍历,层次遍历等三种。21判定树的每个非终端结点包含一个条件,对应于一次比较或判断,每个终端结点对应一种分类结果。22设定 T 是一判定树,其
29、终端结点为 n1,,n k。每个终端结点 ni 对应的百分为 pi(通常将 pi称为 n1的权) 。再假定 ni的祖先数为li,这样,按 T 进行分类的平均比较次数为 WPL(T) 。23根据文字说明,请在以下横线处填充适当的语句。采用静态链表作存储结构,设置一个大小为 2n-1 的数组,令数组每个元素由四个域组成:wt 是结点的权值;lchild、rchild 分别为结点的左、右孩子指针;parent 是结点的双亲在数组中的下标。其数组元素类型定义如下:typedef structfloat wt /*权值*/int parent,lchild rchild; /*指针域*/node;typ
30、edef node hftree2*n-1;在这种存储结构上的哈夫曼算法可描述如下:void Huffman(int k,float Wk,hftree T) /*求给定权值 W 的哈夫曼树 T*/int i,j,x,y;float m,n;for(i=0;ilchildlchild;否则,当 A-rchildrchild。利用中根遍历方法查找结点*A 的直接后继:当 A-lchildrchildrchildrchild;否则,A-rchildlchild;17已知一棵二叉树的前根序列和中根序列分别为 ABDGHECFIJ 及 GDHBEACIJF,请画出这棵二叉树。本题的解题过程如下:由前根
31、序列各 A 是二叉树的根结点;由中根序列知 GDHBE 是 A 的左子树中的结点,CIJF 是 A 的右子树中的结点。由前根序列知 B 是 A 的左子树的根结点;由中根序列知 GDH 是 B 的左子树中的结点,E 是 B 的右子树中的结点。由前根序列知 D 是 B 的左子树的根结点;由中根序列知 G 是 B 的左子树中的结点,H 是 B 的右子树中的结点由前根序列知 C 是 A 的右子树的根结点;由中根序列知 IJF 是 C 的右子树13中的结点(C 的左子树为空) 。由前根序列知 F 是 C 的右子树的根结点;由中根序列知 IJ 是 F 的左子树中的结点, (F 的右子树为空) 。由前根序列
32、知 I 是 F 的左子树的根结点;由中根序列知 J 是 F 的右子树中的结点, (F 的左子树为空) 。完整的二叉树如图简答题 17 所示。18设某密码电文由 8 个字母组成,每个字母在电文中的出现频率分别是 7,19,2,6,32,3,21,10,试为这 8 个字母设计相应的哈夫曼编码。第一步,先以给定的权值构造出哈夫曼树,如图简答题 18 所示。第二步,假没规定哈夫曼树上所有的左指针用 0 表示,所有的右指针用 1 表示。第三步,从根开始沿每一条通向叶子的路径上的数字,这些数字就是对应叶子结点所代表的字母的哈夫曼编码。8 个字母所应的哈夫曼编码为:147-0010 19-102-00000
33、 6-000132-01 3-0000121-11 10-001119有一二叉树如图 19-1 所示,试画出它的顺序存储结构示意图。20将图简答 20-1 所示森林转换为二叉树。第七章 图一、 填空题1.设 x,y 是图 G 中的两顶点,则(x,y)与(y,x)被认为_边,但与是_的两条弧。2.若顶点的偶对是有序的,此图为_图,有序偶对用_括号括起来;若顶点偶对是无序的,此图为_图,无序偶对用_括号括起来。3.设 x,yV,若E,则表示有向图 G 中从 x 到 y 的一条_,x 称为_点,y 称为_点。若(x,y)E,则在无向图 G 中 x 和 y 间有一条_。4.在无向图中,若顶点 x 与
34、y 间有边(x,y) ,则 x 与 y 互称_,边(x,y)称为与顶点 x 和 y_。5.一个具有 n 个顶点的完全无向图的边数为_。一个具有 n 个顶点的完全有向图的弧度数为_。6.图的边或弧附带的数值叫_。每条边或弧都带权的图称为_或_。7.无向图中的顶点 V 的度是_,记为_。若 G 是一个有向图,则把以顶点 V 为终点的弧的数目称为 V 的_,记为_;把以顶点 V 为始点的弧的数目称为 V 的_,称为_。有向图中顶点 V 的度定义为 D(V)=_。8.路径长度定义为_。第一个顶点和最后一个顶点相同的路径称为_或_。序列中顶点不重复出现的路径称为_。除了第一个顶点和最后一个顶点外,其余顶
35、点不重复的回路,称为_或_。9.在无向图中,如果从顶点 v 到顶点 v有路径,则称 v 和 v是_的。如果对于图中的任意两个顶点 vi,vjV,且 vi和 vj都是连通的,则称 G 为_。10.连通分量是无向图中的_连通子图。11.一个连通图的生成树是含有该连通图的全部顶点的一个_。12.若连通图 G 的顶点个数为 n,则 G 的生成树的边数为_。如果 G 的一个子图 G的边数_,则 G中一定有环。相反,如果 G的边数_,则 G一定不连通。13.无向图的邻接矩阵是一个_矩阵,有向图的邻接矩阵不一定是_矩阵。14.对于无向图的邻接矩阵,顶点 vi 的度是_。对于有向图的邻接矩阵,顶点 vi 的出
36、度 OD(vi)为_,顶点 vi 的入度 ID(vi)是_。15.图的存储结构主要有_和_两种。16.邻接表表示法是借助_来反映顶点间的邻接关系,所以称这个单链表为邻接表。17.对无向图,若它有 n 顶点 e 条边,则其邻接表中需要_个结点。其中,_个结点构成邻接表,_个结点构成顶点表。18.对有向图,若它有 n 顶点 e 条边,则其邻接表中需要_个结点。其中,_个结点构成邻接表,_个结点构成顶点表。19.在邻接表上,无向图中顶点 vi 的度恰为_。对有向图,顶点 vi 的出度是_。为了求入度,必须遍历整个邻接表,在所有单链表中,其邻接点域的值为_的结点的个数是顶点 vi 的入度。20.遍历图
37、的基本方法有_优先搜索和_优先搜索两种。21.以下是图的深度优先算法,请在_处填充适当的语句。Dfs(GraphTp g,int v) ArcNodeTp *p;printf(“%d”,v);visitedv=1;p=_;while(p!=NULL)if(!_) Dfs(g,p-adjvex);p=_;22.以下是图的广度优先搜索算法,请在_处填充适当的语句。Bfs(GraphTp g,int v)QueptrTp Q;ArcNodeTp *p;InitQueue(printf(“%d”,v);15visitedv=1;_while(!EmptyQueue(Q)_;p=g.adjlistv.f
38、irstarc;while(p!=NULL)if(!visitedp-adjvex)printf(“%d”,p-adjvex);visited-adjvex=1;EnQueue(_;23.深度优先搜索遍历类似于树的_遍历,它所用到的数据结构是_;广度优先搜索遍历类似于树的_遍历,它所用到的数据结构是_。24.任何连通图的连通分量只有一个,即_。25.对具有 n 个顶点的图其生成树有且仅有_条边,即生成树是图的边数_的连通图。26.一个图的_的表示法是惟一的,而_表示法是不惟一的。27.对无向图,其邻接矩阵是一个关于_对称的矩阵。28.在有向图的邻接矩阵上,由第 i 行可得到第_个结点的出度,而
39、由第 j 列可得到第_个结点的入度。29._的有向图,其全部顶点有可能排成一个拓扑序列。30.一个有向图 G 中若有弧,、和,则在图 G 的拓扑序列中,顶点 Vi、V j和 Vk的相对位置为_。二、 单项选择题1.设有无向图 G=(V,E)和 G=(V,E ),如 G为 G 的生成树,则下面不正确的说法是( )G为 G 的子图 G为 G 的连通分量 G为 G 的极小连通子图且 V=V G是 G 的无环子图2.任何一个带权的无向连通图的最小生成树( )只有一棵 有一棵或多棵 一定有多棵 可能不存在3.设图 G 采用邻接表存储,则拓扑排序算法的时间复杂度为( )O(n) O(n+e) O(n*n)
40、 O(n*e)4.含 n 个顶点的连通图中的任意一条简单路径,其长度不可能超过 ( )1 n/2 n-1 n5一有向图 G 的邻接表存储结构如图单项选择 5 所示。现按深度优先遍历算法,从顶点 V1 出发,所得到的顶点序列是 ( )V 1,V3, V2 ,V4, V5 V 1, V3, V4, V2, V5 V 1,V2, V3, V4, V5 V 1, V3, V4, V5 , V26.在无向图中,所有顶点的度数之和是所有边数的( )倍。0.5 1 2 4 7.在有向图中,所有顶点的入度之和是所有顶点出度之和的( )倍。 ( )0.5 1 2 4 8在图的邻接表存储结构上执行深度优先搜索遍历
41、类似于二叉树上的 ( )先根遍历 中根遍历 后根遍历 按层次遍历9在图的邻接表存储结构上执行广度优先搜索遍历类似于二叉树上的 ( ) 先根遍历 中根遍历 后根遍历 按层次遍历10判断一个有向图是否存在回路,除了可以利用拓扑排序方法,还可以利用 ( )求关键路径方法求最短路径的 Dijkstra 方法广度优先遍历方法深度优先遍历方法11在图单项选择中,从顶点 V1 出发,按广度优先遍历图的顶点序列是 ( )V 1 V3 V5 V4 V2 V6 V7 V 1 V2 V4 V7 V6 V5 V3 V 1 V5 V3 V4 V2 V7 V6 V 1 V4 V7 V2 V6 V5 V312.在图单项选择
42、中,从顶点 V1 出发,广度遍历图的顶点序列是 ( )V 1 V5 V3 V4 V2 V6 V7 V 1 V5 V3 V4 V2 V7 V6 V 1 V7 V2 V6 V4 V5 V3 V 1 V2 V4 V7 V6 V5 V3 13.设有 6 个结点的无向图,该图至少应有( )条边能确保是一个连通图。 ( ) 5 6 7 814.以下说法正确的是 ( )连通图的生成树,是该连通图的一个极小连通子图。无向图的邻接矩阵是对称的,有向图的邻接矩阵一定是不对称的。任何一个有向图,其全部顶点可以排成一个拓扑序列。有回路的图不能进行拓扑排序。15 以下说法错误的是 ( )用相邻矩阵法存储一个图时,在不考
43、虑压缩存储的情况下,所占用的存储空间大小只与图中结点个数有关,而与图的边数无关。邻接表法只能用于有向图的存储,而相邻矩阵法对于有向图和无向图的存储都适用。16存储无向图的相邻矩阵是对称的,因此只要存储相邻矩阵的下(或上)三角部分就可以了用相邻矩阵 A 表示图,判定任意两个结点 Vi 和 Vj 之间是否有长度为 m 的路径相连,则只要检查 A 的第 i 行第 j 列的元素是否为 0 即可。16以下说法正确的是 ( )连通分量是无向图中的极小连通子图。强连通分量是有向图中的极大强连通子图。在一个有向图的拓扑序列中,若顶点 a 在顶点 b 之前,则图中必有一条弧。对有向图 G,如果从任意顶点出发进行
44、一次深度优先或广度优先搜索能访问到每个顶点,则该图一定是完全图。四、简答及应用1 简述图的邻接矩阵表示的类型定义2 简述图的邻接表的类型定义。3 给出无向图简答题 3 中 g1 的邻接矩阵和邻接表。4分别给出图简答题 3 中 g2 的邻接矩阵、邻接表和逆邻接表。5分别给出图简答题 3 中 g3 从 v5 出发按深度优先搜索和广度优先搜索算法遍历得到的顶点序列。6求出图简答题 6-1 的连通分量。7求出带权图简答题 7-1 的最小生成树8写出有向图简答题 8-1 的拓扑排序序列。9给出网图简答题 9-1 的邻接矩阵表示。10已知连通网的邻接矩阵如下,试画出它所表示的连通网及该连通网的最小生成树。11对于图简答题 11-1 从其邻接表中回答下列问题:(1) 图中有多少条弧?(2) 图中是否存在从 i 到 j 的弧?(3) 如何求顶点 i 的出度?1712图简答题 11-1 所示为一有向图,请给出该图的下述要求:(1) 每个顶点的入/出度。(2) 邻接矩阵。(3) 邻接