1、单元练习1一判断题以下各题,正确的请在前面的括号打;错误的打 1数据的逻辑构造与数据元素本身的容和形式无关。2一个数据构造是由一个逻辑构造和这个逻辑构造上的一个根本运算集构成的整体。3数据元素是数据的最小单位。4数据的逻辑构造和数据的存储构造是一样的。5程序和算法原则上没有区别,所以在讨论数据构造时可以通用。6从逻辑关系上讲,数据构造主要分为线性构造和非线性构造两类。7数据的存储构造是数据的逻辑构造的存储映像。8数据的物理构造是指数据在计算机实际的存储形式。9数据的逻辑构造是依赖于计算机的。10算法是对解题方法和步骤的描述。二填空题(1) 数据有逻辑构造和 存储构造 两种构造。(2) 数据逻
2、辑构造除了集合以外,还包括:线性构造、树形构造和 图形构造 。(3) 数据构造按逻辑构造可分为两大类,它们是线性构造和非线性构造 。(4) 树形构造 和 图形构造 合称为非线性构造。(5) 在树形构造中,除了树根结点以外,其余每个结点只有1个前趋结点。(6) 在图形构造中,每个结点的前趋结点数和后续结点数可以 任意多个 。(7) 数据的存储构造又叫 物理构造 。(8) 数据的存储构造形式包括:顺序存储、链式存储、索引存储和 散列存储 。(9) 线性构造中的元素之间存在 一对一 的关系。(10) 树形构造构造中的元素之间存在 一对多 的关系,(11) 图形构造的元素之间存在 多对多 的关系。(1
3、2) 数据构造主要研究数据的逻辑构造、存储构造和 算法或运算 三个方面的容。(13) 数据构造被定义为(D,R),其中D是数据的有限集合,R是D上的 关系 的有限集合。(14) 算法是一个 有穷指令 的集合。(15) 算法效率的度量可以分为事先估算法和 事后统计法 。(16) 一个算法的时间复杂性是算法 输入规模 的函数。(17) 算法的空间复杂度是指该算法所消耗的 存储空间 ,它是该算法求解问题规模n的函数。(18) 假设一个算法中的语句频度之和为Tn=6n+3nlog2n,则算法的时间复杂度为 Onlog2n 。(19) 假设一个算法中的语句频度之和为Tn=3n+nlog2n+n2,则算法
4、的时间复杂度为 On2 。20 数据构造是一门研究非数值计算的程序设计问题中计算机的 操作对象 ,以及它们之间的关系和运算的学科。三选择题1数据构造通常是研究数据的 A 及它们之间的相互联系。 A. 存储构造和逻辑构造 B. 存储和抽象 C. 联系和抽象 D. 联系与逻辑2在逻辑上可以把数据构造分成: C 。 A. 动态构造和静态构造 B. 紧凑构造和非紧凑构造 C. 线性构造和非线性构造 D. 部构造和外部构造3数据在计算机存储器表示时,物理地址和逻辑地址一样并且是连续的,称之为 C 。 A. 存储构造 B. 逻辑构造 C. 顺序存储构造 D. 链式存储构造4非线性构造中的每个结点 D 。A
5、 无直接前趋结点B. 无直接后继结点C. 只有一个直接前趋结点和一个直接后继结点D. 可能有多个直接前趋结点和多个直接后继结点5链式存储的存储构造所占存储空间 A 。 A分两局部,一局部存放结点的值,另一局部存放表示结点间关系的指针 B只有一局部,存放结点的值 C只有一局部,存储表示结点间关系的指针 D分两局部,一局部存放结点的值,另一局部存放结点所占单元素6算法的计算量大小称为算法的 C 。 A. 现实性 B. 难度 C. 时间复杂性 D. 效率7数据的根本单位是 B 。 A. 数据构造 B. 数据元素 C. 数据项 D. 文件8每个结点只含有一个数据元素,所有存储结点相继存放在一个连续的
6、存储区里,这种存储构造称为 A 构造。 A. 顺序存储 B. 链式存储 C. 索引存储 D. 散列存储9每一个存储结点不仅含有一个数据元素,还包含一组指针,该存储方式是 B 存储方式。 A. 顺序 B. 链式C. 索引 D. 散列10以下任何两个结点之间都没有逻辑关系的是 D 。 A. 图形构造 B. 线性构造 C. 树形构造 D. 集合11在数据构造中,与所使用的计算机无关的是 C 。 A. 物理构造 B. 存储构造 C. 逻辑构造 D. 逻辑和存储构造12以下四种根本逻辑构造中,数据元素之间关系最弱的是 A 。 A. 集合 B. 线性构造 C. 树形构造 D. 图形构造13与数据元素本身的
7、形式、容、相对位置、个数无关的是数据的 A 。 A. 逻辑构造 B. 存储构造 C. 逻辑实现 D. 存储实现14每一个存储结点只含有一个数据元素,存储结点存放在连续的存储空间,另外有一组指明结点存储位置的表,该存储方式是 C 存储方式。 A. 顺序 B. 链式 C. 索引 D. 散列15算法能正确的实现预定功能的特性称为算法的 A 。 A. 正确性 B. 易读性 C. 强健性 D. 高效性16算法在发生非法操作时可以作出处理的特性称为算法的 C 。 A. 正确性 B. 易读性 C. 强健性 D. 高效性17以下时间复杂度中最坏的是 D 。 A. O1 B. O nC. Olog2n D. O
8、n218以下算法的时间复杂度是 D 。 for (i=0;in;i+) for (j=0;in;j+) cij=i+j; A. O1 B. O n C. Olog2n D. On219算法分析的两个主要方面是 A 。A. 空间复杂性和时间复杂性 B. 正确性和简明性C. 可读性和文档性 D. 数据复杂性和程序复杂性20计算机算法必须具备输入、输出和 C 。 A. 计算方法 B. 排序方法C. 解决问题的有限运算步骤 D. 程序设计方法四分析下面各程序段的时间复杂度(1) for (i=0;in;i+) for (j=0;jm;j+) Aij解: O(n*m)2 s=0; for (i=0;in
9、i+) for (j=0;jn;j+) s+=Bij; sum=s;解: O(n2)3 T=A;A=B;B=T;解:O(1)4 s1(int n) int p=1,s=0; for (i=1;i=n;i+) p*=i;s+=p; return(s);O(n)5 s2(int n)*=0;y=0;for (k=1;k=n;k+)*+;for (i=1;i=n;i+)for (j=1;j=n;j+)y+;解:O(n2)五根据二元组关系,画出对应逻辑图形的草图,指出它们属于何种数据构造。1A=D,R,其中:D=a,b,c,d,e,R= 解: a b c d e属于集合2B=D,R,其中:D=a,b
10、c,d,e,f,R=rR=, 尖括号表示结点之间关系是有向的解:baedfc属于线性构造。3F=D,R,其中:D=50,25,64,57,82,36,75,55,R=rR=,2550755736826455解:属于树构造4C=D,R,其中:D=1,2,3,4,5,6,R=rR=(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)园括号表示结点之间关系是有向的解:126345属于图构造5E=D,R,其中:D=a,b,c,d,e,f,g,h,R=rR=,解:bdfeahgc属于树构造。单元练习2一判断题以下各题,正确的请在前面的括号打;错误的打1线性表的
11、链式存储构造优于顺序存储。2链表的每个结点都恰好包含一个指针域。3在线性表的链式存储构造中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。4顺序存储方式的优点是存储密度大,插入、删除效率高。5线性链表的删除算法简单,因为当删除链中*个结点后,计算时机自动地将后续的各个单元向前移动。6顺序表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。7线性表链式存储的特点是可以用一组任意的存储单元存储表中的数据元素。8线性表采用顺序存储,必须占用一片连续的存储单元。9顺序表构造适宜于进展顺序存取,而链表适宜于进展随机存取。10插入和删除操作是数据构造中最根本的两种操作,所以这两种操作在数组
12、中也经常使用。二填空题(1) 顺序表中逻辑上相邻的元素在物理位置上必须相连。(2) 线性表中结点的集合是有限的,结点间的关系是一对一关系。(3) 顺序表相对于链表的优点是:节省存储和随机存取。(4) 链表相对于顺序表的优点是:插入、删除方便。5采用顺序存储构造的线性表叫顺序表。6顺序表中任意一个结点的时间复杂度均为O(1)。7链表相对于顺序表的优点是插入、删除方便;缺点是存储密度小。8在双链表中要删除结点*P,其时间复杂度为O(1)。9在单链表中要在结点*P之前插入一个新结点,需找到*P的直接前趋结点的地址,其查找的时间复杂度为 O(n) 。(10) 单链表中需知道头指针才能遍历整个链表。(1
13、1) 性表中第一个结点没有直接前趋,称为开场结点。(12) 在一个长度为n的顺序表中删除第i个元素,要移动 n-i 个元素。(13) 在一个长度为n的顺序表中,如果要在第i个元素前插入一个元素,要后移 n- i +1 个元素。(14) 在无头结点的单链表中,第一个结点的地址存放在头指针中,而其它结点的存储地址存放在前趋结点的指针域中。(15) 当线性表的元素总数根本稳定,且很少进展插入和删除操作,但要求以最快速度存取线性表中的元素时,应采用顺序存储构造。(16) 在线性表的链式存储中,元素之间的逻辑关系是通过指针决定的。(17) 在双向链表中,每个结点都有两个指针域,它们一个指向其前趋结点,另
14、一个指向其后继结点。(18) 对一个需要经常进展插入和删除操作的线性表,采用链式存储构造为宜。(19) 双链表中,设p是指向其中待删除的结点,则需要执行的操作为: p-prior-ne*t=p-ne*t 。(20) 在如下图的链表中,假设在指针P所在的结点之后插入数据域值为a和b的两个结点,则可用以下两个语句: S-ne*t-ne*t=P-ne*t; 和P-ne*t=S;来实现该操作。PabS三选择题1在具有n个结点的单链表中,实现 A 的操作,其算法的时间复杂度都是On。A遍历链表或求链表的第i个结点 B在地址为P的结点之后插入一个结点C删除开场结点 D删除地址为P的结点的后继结点2设a、b
15、c为三个结点,p、10、20分别代表它们的地址,则如下的存储构造称为 B 。a 10 c b 20 PA 循环链表 B 单链表 C双向循环链表 D 双向链表3单链表的存储密度 C 。 A 大于1 B 等于1 C小于1 D 不能确定4一个顺序存储的线性表,设每个结点占m个存储单元,假设第一个结点的地址为B,则第i个结点的地址为 A 。A B+(i-1)*m BB+i*m C B-i*m D B+(i+1)*m5在有n个结点的顺序表上做插入、删除结点运算的时间复杂度为 B 。AO1 BOn COn2 DOlog2n6设Llink、Rlink分别为循环双链表结点的左指针和右指针,则指针P所指的元素
16、是双循环链表L的尾元素的条件是 D 。AP= L BP-Llink= L CP= NULL DP-Rlink=L7两个指针P和Q,分别指向单链表的两个元素,P所指元素是Q所指元素前驱的条件是 B 。AP-ne*t=Q-ne*t BP-ne*t= Q CQ-ne*t= P DP= Q8用链表存储的线性表,其优点是 C 。A便于随机存取B花费的存储空间比顺序表少C便于插入和删除 D数据元素的物理顺序与逻辑顺序一样9在单链表中,增加头结点的目的是 C 。A使单链表至少有一个结点B标志表中首结点的位置C方便运算的实现 D说明该单链表是线性表的链式存储构造10下面关于线性表的表达中,错误的选项是 D 关
17、系。A顺序表必须占一片地址连续的存储单元 B顺序表可以随机存取任一元素C链表不必占用一片地址连续的存储单元 D链表可以随机存取任一元素11L是线性表,LengthListL的值是5,经DelListL,2运算后,LengthListL的值是 C 。A2 B3 C4 D512单链表的示意图如下: LABCDQ RP指向链表Q结点的前趋的指针是 B 。AL BP CQ DR13设p为指向单循环链表上*结点的指针,则*p的直接前驱 C 。A找不到 B查找时间复杂度为O1C查找时间复杂度为On D查找结点的次数约为n14等概率情况下,在有n个结点的顺序表上做插入结点运算,需平均移动结点的数目为 C 。
18、An B(n-1)/2 C n/2 D(n+1)/215在以下链表中不能从当前结点出发到其余各结点的是 C 。A双向链表 B单循环链表 C单链表 D双向循环链表16在顺序表中,只要知道 D ,就可以求出任一结点的存储地址。A基地址 B结点大小 C 向量大小 D基地址和结点大小17在双链表中做插入运算的时间复杂度为 A 。AO1 BOn COn2 DOlog2n18链表不具备的特点是 A 。A随机 B不必事先估计存储空间C插入删除时不需移动元素 D所需空间与线性表成正比19以下关于线性表的论述,不正确的为 C 。A线性表中的元素可以是数字、字符、记录等不同类型B线性顺序表中包含的元素个数不是任意
19、的C线性表中的每个结点都有且仅有一个直接前趋和一个直接后继D存在这样的线性表,即表中没有任何结点20在 B 的运算中,使用顺序表比链表好。A插入 B根据序号查找 C删除 D根据元素查找ListNode *Demo1(LinkList L,ListNode *p) / L是有头结点的单链表ListNode *q=L-ne*t;While (q & q-ne*t!=p)q=q-ne*t;if (q)return q;elseError(*p not in L); 四分析下述算法的功能1void Demo2(ListNode *p,ListNode *q) / p,*q是链表中的两个结点DataTy
20、pe temp;temp=p-data;p-data=q-data;q-data=temp;2解:1返回结点*p的直接前趋结点地址。2交换结点*p和结点*qp和q的值不变。五程序填空1线性表中的元素是无序的,并以带表头结点的单链表作存储。试写一算法,删除表中所有大于min,小于ma*的元素,试完成以下程序填空。Void delete (lklist head; datatype min, ma*) q=head-ne*t; while (p!=NULL) if (p-datadata=ma* ) q=p; p= p-ne*t ; else q-ne*t= p-ne*t ;delete (p)
21、p= q-ne*t ; 2在带头结点head的单链表的结点a之后插入新元素*,试完成以下程序填空。struct node elemtype data; node *ne*t;void lkinsert (node *head, elemtype *) node *s, *p;s= new node ;s-data= * ; p=head-ne*t;while (p!=NULL) & ( p-data!=a )_p=p-ne*t ;if (p=NULL)coutne*t=p-ne*t_;_ p-ne*t=s _;六算法设计题1写一个对单循环链表进展遍历打印每个结点的值的算法,链表中任意结点的地
22、址为P 。解:void Show(ListNode *P) ListNode *t=P; do printf(%c,t-data); t=t-rear; while (t!=P);(2) 对给定的带头结点的单链表L,编写一个删除L中值为*的结点的直接前趋结点的算法。解:void delete(ListNode *L)ListNode *p=L,*q;if(L-ne*t-data=*)printf(值为*的结点是第一个结点,没有直接前趋结点可以删除);return;For(p-ne*t-data!=*;q=p;p=p-ne*t);/ 删除指针p所指向的结点q-ne*t=p-ne*t;delete
23、 p;(3) 一个单向链表,编写一个函数从单链表中删除自第i个结点起的k个结点。解:void Del(node *head,int i,int k) node *p,*q;int j;if(i=1)for(j=1;jne*t;delete p;else p=head; for(j=1;jne*t; / p指向要删除的结点的前一个结点 for(j=1;jne*t; / q 指向要删除的结点 p-ne*t=q-ne*t; delete q;(4) 有一个单向链表不同结点的数据域值可能一样,其头指针为head,编写一个函数计算值域为*的结点个数。解:/此题是遍历单链表的每个结点,每遇到一个结点,结点
24、个数加1,结点个数存储在变量n中。实现此题功能的函数如下:int counter(head)node *head; node *p;int n=0; p=head; while(p!=NULL) if(p-data=*)n+;p=p-ne*t; return(n);5有两个循环单向链表,链头指针分别为head1和head2,编写一个函数将链表head1到链表head2,后的链表仍是循环链表。解:/此题的算法思想是:先找到两链表的尾指针,将第一个链表的尾指针与第二个链表的头结点起来,使之成为循环的。函数如下:node *link (node *head1, *head2) node *p,*q;
25、p=head1;while(p-ne*t!=head1) p=p-ne*t;q=head2;while(q-ne*t!=head2) q=q-ne*t;p-ne*t=head2;q-ne*t=head1;return (head1);单元练习3一判断题以下各题,正确的请在前面的括号打;错误的打1栈是运算受限制的线性表。2在栈空的情况下,不能作出栈操作,否则产生下溢出。3栈一定是顺序存储的线性构造。4栈的特点是后进先出。5空栈就是所有元素都为0的栈。6在C或C+语言中设顺序栈的长度为MA*LEN,则top=MA*LEN时表示队满。7链栈与顺序栈相比,其特点之一是通常不会出现栈满的情况。8一个栈的
26、输入序列为:A,B,C,D,可以得到输出序列:C,A,B,D。9递归定义就是循环定义。10将十进制数转换为二进制数是栈的典型应用之一。二填空题1在栈构造中,允许插入、删除的一端称为 栈顶 。2在顺序栈中,当栈顶指针top=-1时,表示 栈空 。3在有n个元素的栈中,进栈操作的时间复杂度为 O1。4在栈中,出栈操作的时间复杂度为: O(1) 。5表达式,求它的后缀表达式是 栈 的典型应用。 6在一个链栈中,假设栈顶指针等于NULL,则表示 栈空 。7向一个栈顶指针为top的链栈插入一个新结点*p时,应执行p-ne*t=top;和top=p;操作。8顺序栈S存储在数组 S-data0.MA*LEN
27、1中,进栈操作时要执行的语句有:S-top + 。或= S-top+19链栈LS,指向栈顶元素的指针是 LS-ne*t 。10从一个栈删除元素时,首先取出栈顶元素,然后再移动栈顶指针。11由于链栈的操作只在链表的头部进展,所以没有必要设置头结点。12顺序栈S,在对S进展进栈操作之前首先要判断栈是否满。13顺序栈S,在对S进展出栈操作之前首先要判断栈是否空。14假设存空间充足,链栈可以不定义栈满运算。15链栈LS是空的条件是 LS-ne*t=NULL 。16链栈LS的栈顶元素是链表的 首 元素。17同一栈的各元素的类型 一样 。18假设进栈的次序是A、B、C、D、E,执行三次出栈操作以后,栈顶
28、元素为 B 。19A+B/C-D*E的后缀表达式是: ABC/+DE*- 。20四个元素按A、B、C、D顺序进S栈,执行两次PopS,*运算后,*的值是 C 。三选择题1插入和删除只能在一端进展的线性表,称为( C )。 A队列 B循环队列 C栈 D循环栈 2设有编号为1,2,3,4的四辆列车,顺序进入一个栈构造的站台,以下不可能的出站顺序为 ( D ) A1234 B1243 C1324 D14233如果以链表作为栈的存储构造,则出栈操作时 B A必须判别栈是否满 B必须判别栈是否空 C必须判别栈元素类型 D队栈可不做任何判别4元素A,B,C,D依次进栈以后,栈顶元素是 D AA BB CC
29、 DD5顺序栈存储空间的实现使用 B 存储栈元素。 A链表 B数组 C循环链表 D变量6在C或C+语言中,一个顺序栈一旦被声明,其占用空间的大小 A 。 A已固定 B不固定 C可以改变 D动态变化7带头结点的链栈LS的示意图如下,栈顶元素是 A LSHABCD AA BB CC DD8链栈与顺序栈相比,有一个比拟明显的优点是 B 。A插入操作更加方便 B通常不会出现栈满的情况。C不会出现栈空的情况 D删除操作根加方便9从一个栈顶指针为top的链栈中删除一个结点时,用*保存被删除的结点,应执行以下 ( D )命令。 A*=top;top=top-ne*t; Btop=top-ne*t;*=top
30、data; C*=top-data; D*=top-data;top=top-ne*t;10在一个栈顶指针为HS的链栈中,将一个S指针所指的结点入栈,应执行以下 ( B )命令。 AHS-ne*t=S; BS-ne*t=HS-ne*t;HS-ne*t=S; CS-ne*t=HS-ne*t;HS=S; DS-ne*t=HS;HS=HS-ne*t;11四个元素按A、B、C、D顺序进S栈,执行两次PopS,*运算后,栈顶元素的值是 B 。 AA BB CC DD12元素A,B,C,D依次进栈以后,栈底元素是 A 。 AA BB CC DD13经过以下栈的运算后,再执行ReadTop(s)的值是 A
31、 。 InitStack(s) 初始化栈;Push(s,a);Push(s,b); Pop(s)Aa Bb C1 D014经过以下栈的运算后,*的值是 B 。 InitStack(s) 初始化栈;Push(s,a);Push(s,b); ReadTop(s);Pop(s,*);Aa Bb C1 D015经过以下栈的运算后,*的值是 B 。 InitStack(s) 初始化栈;Push(s,a);Pop(s,*);Push(s,b);Pop(s,*);Aa Bb C1 D016经过以下栈的运算后,SEmpty(s)的值是 C 。 InitStack(s) 初始化栈; Push(s,a); Pus
32、h(s,b);Pop(s,*); Pop(s,*);Aa Bb C1 D017向顺序栈中压入元素时, B 。A 先存入元素,后移动栈顶指针 B先移动栈顶指针,后存入元素C谁先谁后无关紧要 D同时进展18初始化一个空间大小为5的顺序栈S后,S-top的值是 B 。 A0 B-1 C不再改变 D动态变化19一个栈的入栈次序ABCDE,则栈的不可能的输出序列是 ( C )。 AEDCBA BDECBA CDCEAB DABCDE20设有一个顺序栈S,元素A,B,C,D,E,F,依次进栈,如果六个元素出栈的顺序是B,D,C,F,E,A,则栈的容量至少应是 ( A )。 A3 B4 C5 D 6四应用题
33、1设有一个栈,元素进栈的次序为:A,B,C,D,E,用I表示进栈操作,O表示出栈操作,写出以下出栈的操作序列。C,B,A,D,E A,C,B,E,D解:IIIOOOIOIOIOIIOOIIOO(2) 求后缀表达式 ABC/D解:A B C D / -A+B*C+D/E解:0 A B C * + D E / + A*(B+C)*D-E解:A B C + * D * E - (A+B)*C-E/(F+G/H)-D解:A B + C * E F G H / + / - D - 8/(5+2)-6解:8 5 2 + / 6 -六算法设计题1设用一维数组stackn表示一个堆栈,假设堆栈中每个元素需占用
34、M个数组单元M1。试写出其入栈操作的算法。试写出其出栈操作的算法。解:/用一整型变量top表示栈顶指针,top为0时表示栈为空。栈中元素从S 1开场存放元素。/入栈算法:void push (char *)if (top+M)MA*LEN-1)printf (堆栈溢出!);elseif (top= =0) top+;S top=*;elsetop=top+M;S top=*;/出栈算法: void pop (char *) if (top= =0) printf (堆栈为空栈!); else if (top= =1) *= S top; top; else *= S top; top=topM; 2设计一个算法,要求判别一个算术表达式中的圆括号配对是否正确。解:/设表达式在字符数组a 中,使