数据结构期末复习练习题

数据结构期末复习练习题
数据结构期末复习练习题

数据结构期末复习练习题

第一章绪论

一、单选题

1. 一个数组元素a[i]与__A__的表示等价。

A、 *(a+i)

B、 a+i

C、 *a+i

D、 &a+i

2. 对于两个函数,若函数名相同,但只是____C____不同则不是重载函数。

A、参数类型

B、参数个数

C、函数类型

3. 若需要利用形参直接访问实参,则应把量形参变说明为__ _B___参数

A、指针

B、引用

C、值

4. 下面程序段的时间复杂度为____C____。

for(int i=0; i

for(int j=0; j

a[i][j]=i*j;

A、 O(m2)

B、 O(n2)

C、 O(m*n)

D、 O(m+n)

5. 执行下面程序段时,执行S语句的次数为___D_____。

for(int i=1; i<=n; i++)

for(int j=1; j<=i; j++)

S;

A、 n2

B、 n2/2

C、 n(n+1)

D、 n(n+1)/2

6. 下面算法的时间复杂度为____B_____。

int f( unsigned int n ) {

if ( n==0 || n==1 ) return 1; else return n*f(n-1);

}

A、 O(1)

B、 O(n)

C、 O(n2)

D、 O(n!)

二、填空题

1. 数据的逻辑结构被分为集合结构、线性结构、树型结构、图形结构_四种。

2. 数据的存储结构被分为 _顺序、链接、索引、散列四种。

3. 在线性结构、树形结构和图形结构中,前驱和后继结点之间分别存在着__ 1:1、1:N、M:N ___的联系。

4. 一种抽象数据类型包括数据定义、操作声明_两个部分。

5. 当一个形参类型的长度较大时,应最好说明为__引用形参 ( 或指针形参 )_______,以节省参数值的传输时间和存储参数的空间。

6. 当需要用一个形参访问对应的实参时,则该形参应说明为___引用类型 ( 或指针类型_______。

7. 在函数中对引用形参的修改就是对相应___实参_____的修改,对___值_________形参的修改只局限在该函数的内部,不会反映到对应的实参上。

8. 当需要进行标准I/O操作时,则应在程序文件中包含___ iostream.h _____________头文件,当需要进行文件I/O操作时,则应在程序文件中包含____ fstream.h ____________头文件。

9. 在包含有______ stdlib.h __________头文件的程序文件中,使用____ rand( ) %21

____________能够产生出0~20之间的一个随机整数。

10. 一个数组a所占有的存储空间的大小即数组长度为__ sizeof(a)__________,下标为i的元素a[i]的存储地址为____ a+i*sizeof(a[0])______,或者为___ a+i ___。

11. 函数重载要求______参数类型、数量 _或___次序_________有所不同。

12. 对于双目操作符,其重载函数带有_____2_____个参数,其中至少有一个为_____用户自定义_______的类型。

13. 若对象ra和rb中至少有一个是属于用户定义的类型,则执行ra==rb时,需要调用_____= =_____重载函数,该函数的第一个参数应与____ra______的类型相同,第二个参数应与______rb____的类型相同。

14. 从一维数组a[n]中顺序查找出一个最大值元素的时间复杂度为__ O(n) ____,输出一个二维数组b[m][n]中所有元素值的时间复杂度为__ O(m*n)_ ___。

15. 在下面程序段中,s=s+p语句的执行次数为__n______,p*=j语句的执行次数为____ n(n+1)/2___,该程序段的时间复杂度为__O(n2)_______。

int i=0,s=0;

while(++i<=n) {

int p=1;

for(int j=1;j<=i;j++) p*=j;

s=s+p;

}

16. 一个算法的时间复杂度为(3n2+2n log2n+4n-7)/(5n),其数量级表示为___ O(n)

_____。

第二章线性表

一、单选题

1.在一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤n+1)之前插入一个新元素时,需要从后向前依次后移B个元素。

A、n-i

B、n-i+1

C、n-i-1

D、i

2.在一个长度为n的顺序存储线性表中,删除第i个元素(1≤i≤n+1)时,需要从前向后依次前移A个元素。

A、n-i

B、n-i+1

C、n-i-1

D、i

3.在一个长度为n的线性表中顺序查找值为x的元素时,查找时的平均查找长度(即x同元素的平均比较次数,假定查找每个元素的概率都相等)为C。

A、n

B、n/2

C、(n+1)/2

D、(n-1)/2

4.在一个单链表HL中,若要向表头插入一个由指针p指向的结点,则执行B。

A、HL = p; p->next = HL;

B、p->next = HL; HL = p;

C、p->next = HL; p = HL;

D、p->next = HL->next; HL->next = p;

5.在一个单链表HL中,若要在指针q所指的结点的后面插入一个由指针p所指的结点,则执行D。

A、q->next = p->next ; p->next = q;

B 、p->next = q->next; q = p;

C 、q->next = p->next; p->next = q;

D 、p->next = q->next ; q->next = p;

6.在一个单链表HL 中,若要删除由指针q 所指向结点的后继结点,则执行 C 。

A 、p = q->next ; p->next = q->next;

B 、p = q->next ; q->next = p;

C 、p = q->next ; q->next = p->next;

D 、q->next = q->next->next; q->next = q;

二、填空题

1.在线性表的单链接存储结构中,每个结点包含有两个域,一个叫 数据 域,另一个叫 指针 域。

2.在下面数组a 中链接存储着一个线性表,表头指针为a[0].next ,则该线性表为 。

3.对于一个长度为n 的顺序存储的线性表,在表头插入元素的时间复杂度为 ,在表尾插入元素的时间复杂度为 。

4.对于一个长度为n 的单链接存储的线性表,在表头插入元素的时间复杂度为 ,在表尾插入元素的时间复杂度为 。

5.在线性表的顺序存储中,若一个元素的下标为i ,则它的前驱元素的下标为 ,后继元素的下标为 。

6.在线性表的单链接存储中,若一个元素所在结点的地址为p ,则其后继结点的地址为 ,若假定p 为一个数组a 中的下标,则其后继结点的下标为 。

7.在循环单链表中,最后一个结点的指针指向 结点。

8.在双向链表中每个结点包含有两个指针域,一个指向其 结点,另一个指向其 结点。

9.在循环双向链表中表头结点的左指针域指向 结点,最后一个结点的右指针域指向 结点。

10.在以HL 为表头指针的带表头附加结点的单链表和循环单链表中,链表为空的条件分别为 和 。

三、应用题

1.在下面的每个程序段中,假定线性表La 的类型为List ,元素类型ElemType 为int ,并假定每个程序段是连续执行的,试写出每个程序段执行后所得到的线性表La 。

(1) InitList(La);

int a[]={48,26,57,34,62,79};

for(i=0; i<6; i++) InsertFront(La,a[i]);

TraverseList(La);

(2) InitList(La);

a data next

for(i=0; i<6; i++) Insert(La,a[i]);

TraverseList(La);

(3) ClearList(La);

for(i=0; i<6; i++) InsertRear(La,a[i]);

Delete(La, a[5]);

Sort(La);

Insert(La,a[5]/2);

TraverseList(La);

2.写出下面函数被调用执行后,得到的以HL为表头指针的单链表中的数据元素序列。

void AA(LNode * & HL)

{

InitList(HL);

InsertRear(HL,30);

InsertRear(HL,50);

int a[5] = {15,8,9,26,12};

for ( int i=0; i<5; i++ ) InsertFront(HL,a[i]);

}

3.对于List类型的线性表,编写出下列每个算法。

(1) 从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补,若线性表为空则显示出错信息并退出运行。

(2) 从线性表中删除第i个元素并由函数返回。

(3) 向线性表中第i个元素位置插入一个元素。

(4) 从线性表中删除具有给定值x的所有元素。

4.对于结点类型为LNode的单链表,编写出下列每个算法。

(1) 删除单链表中的第i个结点。

(2) 在有序单链表中插入一个元素x的结点。

(3) 从单链表中查找出所有元素的最大值,该值由函数返回,若单链表为空,则显示出错信息并停止运行。

(4)统计出单链表中结点的值等于给定值x的结点数。

第三章稀疏矩阵和广义表

一、单选题

1. 在稀疏矩阵的带行指针向量的链接存储中,每个行单链表中的结点都具有相同的___A____。

A、行号

B、列号

C、元素值

D、地址

2. 设一个广义表中结点的个数为n,则求广义表深度算法的时间复杂度为___B____。

A、O(1)

B、O(n)

C、O(n2)

D、O(log2n)

二、填空题

1. 在一个稀疏矩阵中,每个非零元素所对应的三元组包括该元素的________、________和________三项。

2. 在稀疏矩阵所对应的三元组线性表中,每个三元组元素按________为主序、________为辅序的次序排列。

3. 在初始化一个稀疏矩阵的函数定义中,矩阵形参应说明为________参数。

4. 在稀疏矩阵的顺序存储中,利用一个数组来存储非零元素,该数组的长度应________对应三元组线性表的长度。

5.在稀疏矩阵的带行指针向量的链接存储中,每个结点包含有________个域,在相应的十字链接存储中,每个结点包含有________个域。

6.在稀疏矩阵的十字链接存储中,每个结点的down指针域指向________相同的下一个结点,right指针域指向________相同的下一个结点。

7.一个广义表中的元素分为________元素和________元素两类。

8.一个广义表的深度等于________嵌套的最大层数。

9.在广义表的存储结构中,每个结点均包含有________个域。

10.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为________域和________域。

11.若把整个广义表也看为一个表结点,则该结点的tag域的值为________,next域的值为________。

三、应用题

1. 已知一个稀疏矩阵如下图所示:

0 4 0 0 0 0 0

0 0 0 -3 0 0 1

8 0 0 0 0 0 0

0 0 0 5 0 0 0

0 -7 0 0 0 2 0

0 0 0 6 0 0 0

具有6行×7列的一个稀疏矩阵

(1)写出它的三元组线性表;

(2) 给出它的顺序存储表示;

(3) 给出它的转置矩阵的三元组线性表和顺序存储表示;

2. 画出下列每个广义表的带表头附加结点的链接存储结构图并分别计算出它们的长度和深度。

(1) A=(())

(2) B=(a,b,c)

(3) C=(a,(b,(c)))

(4) D=((a,b),(c,d))

(5) E=(a,(b,(c,d)),(e))

(6) F=((a,(b,(),c),((d),e)))

第四章栈和队列

一、单选题

1.栈的插入与删除操作在 A 进行。

A、栈顶

B、栈底

C、任意位置

D、指定位置

2.当利用大小为N的一维数组顺序存储一个栈时,假定用top==N表示栈空,则向这个栈插入一个元素时,首先应执行 B 语句修改top指针。

A、top++

B、top--

C、top=0

D、top

3.若让元素1,2,3依次进栈,则出栈次序不可能出现 C 种情况。

A、3,2,1

B、2,1,3

C、3,1,2

D、1,3,2

4.在一个循环顺序队列中,队首指针指向队首元素的 A 位置。

A、前一个

B、后一个

C、当前

D、后面

5.当利用大小为N的一维数组顺序存储一个循环队列时,该队列的最大长度为 B 。

A、N-2

B、N-1

C、N

D、N+1

6.从一个循环顺序队列删除元素时,首先需要 B 。

A、前移一位队首指针

B、后移一位队首指针

C、取出队首指针所指位置上的元素

D、取出队尾指针所指位置上的元素

7.假定一个循环顺序队列的队首和队尾指针分别为f和r,则判断队空的条件是 D 。

A、f+1==r

B、r+1==f

C、f==0

D、f==r

8.假定一个链队的队首和队尾指针分别为front和rear,则判断队空的条件是 D 。

A、front==rear

B、front!=NULL

C、rear!=NULL

D、front==NULL

二、填空题

1.队列的插入操作在进行,删除操作在进行。

2.栈又称为表,队列又称为表。

3.向一个顺序栈插入一个元素时,首先使后移一个位置,然后把待插入元素到这个位置上。

4.从一个栈中删除元素时,首先取出,然后再前移一位。

5.在一个循环顺序队列Q中,判断队空的条件为,判断队满的条件为。

6.在一个顺序栈中,若栈顶指针等于,则为空栈;若栈顶指针等于,则为满栈。

7.在一个链栈中,若栈顶指针等于NULL,则为;在一个链队中,若队首指针与队尾指针的值相同,则表示该队列为或该队列为。

8.向一个链栈插入一个新结点时,首先把栈顶指针的值赋给,然后把新结点的存储位置赋给。

9.从一个链栈中删除一个结点时,需要把栈顶结点的值赋给。

10.向一个顺序队列插入元素时,需要首先移动,然后再向所指位置新插入的元素。

11、当用长度为N的一维数组顺序存储一个栈时,假定用top==N表示栈空,则表示栈满的条件为。

12.向一个栈顶指针为HS的链栈中插入一个新结点*P果,应执行和

操作。

13.从一个栈顶指针为HS的非空链栈中删除结点并不需要返回栈顶结点的值和回收结点时,应执行操作。

14.假定front和rear分别为一个链队的队首和队尾指针,则该链队中只有一个结点

的条件为。

15. 中缀算术表达式3+4/(25-(6+15))*8 所对应的后缀算术表达式为。

16. 后缀算术表达式24 8 + 3 * 4 10 7 - * / 所对应的中缀算术表达式为,其值为。

三、应用题

执行下面函数调用后得到的输出结果是什么?

void AF(Queue & Q)

{

InitQueue(Q);

int a[4] = { 5,8,12,15 };

for ( int i=0; i<4; i++ ) QInse rt(Q,a[i]);

QInsert(Q,QDelete(Q));

QInsert(Q,30);

QInsert(Q,QDelete(Q)+10);

while ( ! QueueEmpty(Q) ) cout <

}

四、编程题

裴波那契(Fibonacci)数列的定义为:它的第1项和第2项均为1,以后各项为其前两项之和。若裴波那契数列中的第n项用Fib(n)表示,则计算公式为:

? 1 (n=1或2)

Fib(n)=?

? Fib(n-1)+Fib(n-2) (n>=2)

试编写出计算Fib(n)的递归算法和非递归算法,并分析它们的时间复杂度和空间复杂度。

第五章树和二叉树

一、填空题

1.对于一棵具有n个结点的树,该树中所有结点的度数之和为______。

2. 假定一棵三叉树的结点个数为50,则它的最小深度为________,最大深度为_______。 3.在一棵三叉树中,度为3的结点数有2个,度为2的结点数有1个,度为1的结点数为2个,那么度为0的结点数有________个。

4.一棵深度为5的满二叉树中的结点数为________个,一棵深度为3的满三叉树中的结点数为________个。

5.假定一棵树的广义表表示为A(B(C,D(E,F,G),H(I,J))),则树中所含的结点数为________个,树的深度为________,树的度为________。

6.假定一棵树的广义表表示为A(B(C,D(E,F,G),H(I,J))),则度为3、2、1、0的结点数分别为______、______、______和______个。

7. 假定一棵树的广义表表示为A(B(C,D(E,F,G),H(I,J))),则结点H的双亲结点为________,孩子结点为___________。

8.在一棵二叉树中,假定双分支结点数为5个,单分支结点数为6个,则叶子结点数

为________个。

9.对于一棵二叉树,若一个结点的编号为i,则它的左孩子结点的编号为________,右孩子结点的编号为________,双亲结点的编号为________。

10.在一棵二叉树中,第5层上的结点数最多为______。

11.假定一棵二叉树的结点数为18,则它的最小深度为________,最大深度为________。 12.一棵二叉树的广义表表示为a(b(c,d),e(f(,g))),则e结点的双亲结点为______,左孩子结点为________,右孩子结点为________。

13. 一棵二叉树的广义表表示为a(b(c,d),e(f(,g))),它含有双亲结点______个,单分支结点______个,叶子结点______个。

14. 假定一棵二叉树顺序存储在一维数组a中,则a[i]元素的左孩子元素为________,右孩子元素为________,双亲元素(i>1)为________。

15.假定一棵二叉树顺序存储在一维数组a中,但让编号为1的结点存入a[0]元素中,让编号为2的结点存入a[1]元素中,其余类推,则编号为i结点的左孩子结点对应的存储位置为________,若编号为i结点的存储位置用j表示,则其左孩子结点对应的存储位置为________。

16.若对一棵二叉树从0开始进行结点编号,并按此编号把它顺序存储到一维数组a中,即编号为0的结点存储到a[0]中,其余类推,则a[i]元素的左孩子元素为________,右孩子元素为________,双亲元素(i>0)为________。

17.对于一棵具有n个结点的二叉树,对应二叉链表中指针总数为________个,其中________个用于指向孩子结点,________个指针空闲着。

18. 一棵二叉树广义表表示为a(b(d(,h)),c(e,f(g,i(k)))),该树的结点数为________个,深度为________。

19. 假定一棵二叉树广义表表示为a(b(c),d(e,f)),则对它进行的先序遍历结果为____________,中序遍历结果为____________,后序遍历结果为____________,按层遍历结果为____________。

20. 假定一棵普通树的广义表表示为a(b(e),c(f(h,i,j),g),d),则先根遍历结果为____________,按层遍历结果为___________。

二、应用题

1. 已知一棵具有n个结点的完全二叉树被顺序存储于一维数组的A[1] A[n]元素中,试编写一个算法打印出编号为i的结点的双亲和所有孩子。

2. 编写一算法,求出一棵二叉树中所有结点数和叶子结点数,假定分别用变参C1和C2统计所有结点数和叶子结点数,初值均为0。

(1) 写出先根遍历得到的结点序列;

(2) 写出按层遍历得到的结点序列;

(3) 画出转换后得到的二叉树和二叉链表。

第六章二叉树的应用

一、单选题

1. 从二叉搜索树中查找一个元素时,其时间复杂度大致为________。

A、 O(n)

B、 O(1)

C、 O(log2n)

D、 O(n2)

2. 向二叉搜索树中插入一个元素时,其时间复杂度大致为________。

A、 O(1)

B、 O(log2n )

C、 O(n)

D、 O(n log2n)

3. 根据n个元素建立一棵二叉搜索树时,其时间复杂度大致为________。

A、 O(n)

B、 O(log2n )

C、 O(n2)

D、 O(n log2n)

4. 从堆中删除一个元素的时间复杂度为________。

A、 O(1)

B、 O(n)

C、 O(log2n)

D、 O(n log2n)

5. 向堆中插入一个元素的时间复杂度为________。

A、 O(log2n)

B、 O(n)

C、 O(1)

D、 O(n log2n)

6. 由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为________。

A、 24

B、 48

C、 72

D、 53

二、填空题

1. 在一棵二叉搜索树中,每个分支结点的左子树上所有结点的值一定________该结点的值,右子树上所有结点的值一定________该结点的值。

2.对一棵二叉搜索树进行中序遍历时,得到的结点序列是一个________。

3.从一棵二叉搜索树中查找一个元素时,若元素的值等于根结点的值,则表明_______,若元素的值小于根结点的值,则继续向________查找,若元素的大于根结点的值,则继续向________查找。

4.在一个堆的顺序存储中,若一个元素的下标为i,则它的左孩子元素的下标为______,右孩子元素的下标为________。

5. 在一个小根堆中,堆顶结点的值是所有结点中的________,在一个大根堆中,堆顶结点的值是所有结点中的________。

6.当从一个小根堆中删除一个元素时,需要把________元素填补到________位置,然后再按条件把它逐层________调整。

三、应用题

1.已知一组元素为(46,25,78,62,12,37,70,29),画出按元素排列顺序输入生成的一棵

二叉搜索树。

2. 空堆开始依次向堆中插入线性表(38,64,52,15,73,40,48,55,26,12)中的每个元素,请以线性表的形式给出每插入一个元素后堆的状态。

3. 已知一个堆为(12,15,40,38,26,52,48,64),若需要从堆中依次删除四个元素,请给出每删除一个元素后堆的状态。

4. 有七个带权结点,其权值分别为3,7,8,2,6,10,14,试以它们为叶子结点构造一棵哈夫曼树,并计算出带权路径长度WPL。

四、算法设计

1.编写在以BST为树根指针的二叉搜索树上进行查找值为item的结点的非递归算法,

若查找成功则由item带回整个结点的值并返回true,否则返回false。

bool Find( BTreeNode * BST , ElemType & item )

2.下面的算法功能是向HBT堆中插入一个值为item的元素,使得插入后仍是一个堆。请在画有横线的地方填上合适的语句,完成其功能。

void AH(Heap & HBT , const ElemType item)

// 形参HBT为一个小根堆

{

HBT.heap[HBT.size]=item;

HBT.size++;

ElemType x=item

int i=HBT.size-1;

while ( i != 0 ){

int j= ;

if ( x>=HBT.heap[j]) break;

;

;

}

HBT.heap[i]=x;

}

第七章图

一、填空题

1.在一个图中,所有顶点的度数之和等于所有边数的________倍。

2.在一个具有n个顶点的无向完全图中,包含有________条边,在一个具有n个顶点的有向完全图中,包含有________条边。

3. 在一个具有n个顶点的无向图中,要连通所有顶点则至少需要________条边。

4.表示图的三种存储结构为________、________和________。

5. 对于一个具有n个顶点的图,若采用邻接矩阵表示,则矩阵大小为________。

6.对于一个具有n个顶点和e条边的有向图和无向图,在其对应的邻接表中,所含边结点分别为________和________条。

7. 在有向图的邻接表和逆邻接表表示中,每个顶点邻接表分别链接着该顶点的所有________和________结点。

8.对于一个具有n个顶点和e条边的有向图和无向图,若采用边集数组表示,则存于数组中的边数分别为________和________条。

9.对于一个具有n个顶点和e条边的无向图,当分别采用邻接矩阵、邻接表和边集数组表示时,求任一顶点度数的时间复杂度依次为________、________和________。

10. 假定一个图具有n个顶点和e条边,则采用邻接矩阵、邻接表和边集数组表示时,其相应的空间复杂度分别为________、________和________。

11. 对用邻接矩阵表示的图进行任一种遍历时,其时间复杂度为________,对用邻接表表示的图进行任一种遍历时,其时间复杂度为________。 12.对于下面的无向图G1,假定用邻接矩阵表示,则从顶点v 0开始进行深度优先搜索遍历得到的顶点序列为____________,从顶点v 0开始进行广度优先搜索遍历得到的顶点序列为____________。 13. 对于下面的有向图G2,假定用邻接矩阵表示,则从顶点v 0开始进行深度优先搜索遍历得到的顶点序列为____________,从顶点v 0开始进行广度优先搜索遍历得到的顶点序列为____________。 14. 对于下面的带权图G3,其最小生成树的权为________。 15.对于下面的带权图G3,若从顶点v 0出发,则按照普里姆算法生成的最小生成树中,依次得到的各条边为_______________。 16. 对于下面的带权图G3,若按照克鲁斯卡尔算法产生最小生成树,则得到的各条边依次为_______________。

17.假定用一维数组d[n]存储一个AOV 网中用于拓扑排序的顶点入度,则值为0的元素被链接成为一个________。

18. 对于一个具有n 个顶点和e 条边的连通图,其生成树中的顶点数和边数分别为________和________。

二、应用题

1. 对于下图G4和G5,按下列条件试分别写出从顶点v 0出发按深度优先搜索遍历得到的顶点序列和按广度优先搜索遍历得到的顶点序列。

(1) 假定它们均采用邻接矩阵表示;

(2) 假定它们均采用邻接表表示,并且假定每个顶点邻接表中的结点是按顶点序号从大到小的次序链接的。

2. 对于下图G6,试给出一种拓扑序列,若在它的邻接表存储结构中,每个顶点邻接表中的边结点都是按照终点序号从大到小链接的,则按此给出唯一一种拓扑序列。

图G1图G2图G3

图G4图G5

图G6

第八章查找

一、填空题

1.以顺序查找方法从长度为n的线性表中查找一个元素时,平均查找长度为________,时间复杂度为________。

2.以二分查找方法从长度为n的线性有序表中查找一个元素时,平均查找长度小于等于________,时间复杂度为________。

3.以二分查找方法从长度为12的有序表中查找一个元素时,平均查找长度为________。 4.以二分查找方法查找一个线性表时,此线性表必须是________存储的________表。 5.从有序表(12,18,30,43,56,78,82,95)中依次二分查找43和56元素时,其查找长度分别为________和________。

6.对于二分查找所对应的判定树,它既是一棵_______,又是一棵________。

7.假定对长度n=50的有序表进行二分查找,则对应的判定树高度为________,判定树中前5层的结点数为________,最后一层的结点数为________。

8.在索引表中,每个索引项至少包含有________域和________域这两项。

9.假定一个线性表为(12,23,74,55,63,40,82,36),若按Key % 3条件进行划分,使得同一余数的元素成为一个子表,则得到的三个子表分别为________、________和________。

10. 假定一个线性表为(”abcd”,”baabd”,”bcef”,”cfg”,”ahij”,”bkwte”,”ccdt”, ”aayb”),若按照字符串的第一个字母进行划分,使得同一个字母被划分在一个子表中,则得到的a,b,c三个子表的长度分别为________、________和________。

11.在线性表的________存储中,无法查找到一个元素的前驱或后继元素。

12.在线性表的________存储中,对每一个元素只能采用顺序查找。

13.假定对线性表(38,25,74,52,48)进行散列存储,采用H(K)=K % 7作为散列函数,若分别采用线性探查法和链接法处理冲突,则对各自散列表进行查找的平均查找长度分别为_______和________。

14.假定要对长度n=100的线性表进行散列存储,并采用链接法处理冲突,则对于长度m=20的散列表,每个散列地址的单链表的长度平均为________。

15. 在线性表的散列存储中,处理冲突有________和________两种方法。

16.对于线性表(18,25,63,50,42,32,90)进行散列存储时,若选用H(K)=K % 9作为散列函数,则散列地址为0的元素有________个,散列地址为5的元素有________个。

二、应用题

1. 假定查找有序表A[25]中每一元素的概率相等,试分别求出进行顺序、二分查找每

一元素时的平均查找长度。

2. 假定一个待散列存储的线性表为(32,75,29,63,48,94,25,46,18,70),散列地址空间为HT[13],若采用除留余数法构造散列函数和线性探查法处理冲突,试求出每一元素的散列地址,画出最后得到的散列表,求出平均查找长度。

3. 假定一个待散列存储的线性表为(32,75,29,63,48,94,25,46,18,70),散列地址空间为HT[11],若采用除留余数法构造散列函数和链接法处理冲突,试求出每一元素的散列地址,画出最后得到的散列表,求出平均查找长度。

三、算法设计

设计在有序表A[n]中按二分查找关键字为K的递归和非递归算法。

第九章排序

一、填空题

1.每次从无序表中取出一个元素,把它插入到有序表中的适当位置,此种排序方法叫做________排序;每次从无序表中挑选出一个最小或最大元素,把它交换到有序表的一端,此种排序方法叫做________排序。

2.每次直接或通过基准元素间接比较两个元素,若出现逆序排列时就交换它们的位置,此种排序方法叫做________排序;每次使两个相邻的有序表合并成一个有序表的排序方法叫做________排序。

3.在直接选择排序中,记录比较次数的时间复杂度为________,记录移动次数的时间复杂度为________。

4. 在堆排序的过程中,对n个记录建立初始堆需要进行________次筛运算,由初始堆到堆排序结束,需要对树根结点进行_______次筛运算。

5.在堆排序的过程中,对任一分支结点进行筛运算的时间复杂度为________,整个堆排序过程的时间复杂度为________。

6.假定一组记录的排序码为(46,79,56,38,40,84),则利用堆排序方法建立的初始堆为________________。

7. 快速排序在平均情况下的时间复杂度为________,在最坏情况下的时间复杂度为________。

8.快速排序在平均情况下的空间复杂度为________,在最坏情况下的空间复杂度为________。

9.在快速排序方法中,进行每次划分时,是从当前待排序区间的________向________依次查找出处于逆序的元素并交换之,最后将基准元素交换到一个确定位置,从而以该位置把当前区间划分为前后两个子区间。

10. 假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序的一次划分的结果为________________。

11. 假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序的过程中,对应二叉搜索树的深度为________,分支结点数为________。

12.在二路归并排序中,对n个记录进行归并的趟数为________。

13. 在归并排序中,进行每趟归并的时间复杂度为________,整个排序过程的时间复杂度为________,空间复杂度为________。

14.对20个记录进行归并排序时,共需要进行________趟归并,在第三趟归并时是把

长度为________的有序表两两归并为长度为________的有序表。

15.假定一组记录的排序码为(46,79,56,38,40,80),对其进行归并排序的过程中,第二趟归并后的结果为________________。

二、应用题

已知一组元素的排序码为

(46,74,16,53,14,26,40,38,86,65,27,34)

(1) 利用直接插入排序的方法写出每次向前面有序表插入一个元素后的排列结果。

(2) 利用直接选择排序方法写出每次选择和交换后的排列结果。

(3) 利用堆排序的方法写出在构成初始堆和利用堆排序的过程中,每次筛运算后的排列结果,并画出初始堆所对应的完全二叉树。

(4) 利用快速排序的方法写出每一层划分后的排列结果,并画出由此快速排序得到的二叉搜索树。

(5) 利用归并排序的方法写出每一趟二路归并排序后的结果。

三、算法设计

完成从一维数组A[n]上进行快速排序的递归算法。

void QuickSort( ElemType A[] , int s , int t )

{

int i = s, j = t+1;

ElemType x = A[s];

do {

do i++; while ( ) ; // 填写一个循环条件

do j--; while ( A[j].stn > x.stn );

if ( i

{ ElemType temp = A[i] ; A[i] = A[j] ; A[j] = temp; } } while ( i

A[s] = A[j]; A[j] = x;

if ( s

if ( j+1

}

数据结构设计与技巧

数据结构设计与技巧讲义 【考查目标】 1.理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。 2.掌握基本的数据处理原理和方法的基础上,能够对算法进行设计与分析。 3.能够选择合适的数据结构和方法进行问题求解。 一、线性表 (一)线性表的定义和基本操作 (二)线性表的实现 1.顺序存储结构 2.链式存储结构 3.线性表的应用 二、栈、队列和数组 (一)栈和队列的基本概念 (二)栈和队列的顺序存储结构 (三)栈和队列的链式存储结构 (四)栈和队列的应用 (五)特殊矩阵的压缩存储 三、树与二叉树 (一)树的概念 (二)二叉树 1.二叉树的定义及其主要特征 2.二叉树的顺序存储结构和链式存储结构 3.二叉树的遍历 4.线索二叉树的基本概念和构造

5.二叉排序树 6.平衡二叉树 (三)树、森林 1.书的存储结构 2.森林与二叉树的转换 3.树和森林的遍历 (四)树的应用 1.等价类问题 2.哈夫曼(Huffman)树和哈夫曼编码 四、图 (一)图的概念 (二)图的存储及基本操作 1.邻接矩阵法 2.邻接表法 (三)图的遍历 1.深度优先搜索 2.广度优先搜索 (四)图的基本应用及其复杂度分析 1.最小(代价)生成树 2.最短路径 3.拓扑排序 4.关键路径 五、查找 (一)查找的基本概念 (二)顺序查找法 (三)折半查找法 (四)B-树

(五)散列(Hash)表及其查找 (六)查找算法的分析及应用 六、内部排序 (一)排序的基本概念 (二)插入排序 1.直接插入排序 2.折半插入排序 (三)气泡排序(bubble sort) (四)简单选择排序 (五)希尔排序(shell sort) (六)快速排序 (七)堆排序 (八)二路归并排序(merge sort) (九)基数排序 (十)各种内部排序算法的比较 (十一)内部排序算法的应用 【知识点解析】 1.线性表 线性表是一种最简单的数据结构,在线性表方面,主要考查线性表的定义和基本操作、线性表的实现。在线性表实现方面,要掌握的是线性表的存储结构,包括顺序存储结构和链式存储结构,特别是链式存储结构,是考查的重点。另外,还要掌握线性表的基本应用。 2.栈、队列和数组 栈和队列是两种特殊的线性表,在这方面,要求我们掌握栈和队列的基本概念,以及他们之间的区别。对于栈和队列的存储结构(包括顺序存储结构、链式存储结构)要有较深的理解,对于栈和队列的应用,例如,排队问题、子程序调用问题、表达式问题等,要搞清楚。

2017年数据结构期末考试题及答案A

2017年数据结构期末考试题及答案 一、选择题(共计50分,每题2分,共25题) 1 ?在数据结构中,从逻辑上可以把数据结构分为 C 。 A. 动态结构和静态结构B?紧凑结构和非紧凑结构 C.线性结构和非线性结构 D .内部结构和外部结构 2?数据结构在计算机内存中的表示是指 A ° A. 数据的存储结构 B.数据结构 C.数据的逻辑结构 D .数据元 素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A. 逻辑B?存储 C.逻辑和存储 D.物理 4 .在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C ° A.数据的处理方法B?数据元素的类型 C.数据元素之间的关系 D.数据的存储方法 5. 在决定选取何种存储结构时,一般不考虑 A ° A.各结点的值如何B?结点个数的多少 C?对数据有哪些运算 D.所用的编程语言实现这种结构是否方便。 6. 以下说法正确的是D ° A. 数据项是数据的基本单位 B. 数据元素是数据的最小单位 C. 数据结构是带结构的数据项的集合 D. —些表面上很不相同的数据可以有相同的逻辑结构 7. 在以下的叙述中,正确的是B ° A. 线性表的顺序存储结构优于链表存储结构 B. 二维数组是其数据元素为线性表的线性表 C?栈的操作方式是先进先出 D.队列的操作方式是先进后出

8. 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着 A. 数据元素具有同一特点 B. 不仅数据元素所包含的数据项的个数要相同,而且对应的数据项的类型要一致 C. 每个数据元素都一样 D. 数据元素所包含的数据项的个数要相等 9 ?链表不具备的特点是 A 。 A.可随机访问任一结点 B.插入删除不需要移动元素 C?不必事先估计存储空间 D.所需空间与其长度成正比 10. 若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一 个结点,则采用 D 存储方式最节省运算时间。 A.单链表B ?给出表头指针的单循环链表 C.双链表D ?带头结点 的双循环链表 11. 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 B 。 A.单链表B .静态链表 C.线性链表 D .顺序存储结构 12 .非空的循环单链表head的尾结点(由p所指向)满足C 。 A. p—>next 一NULL B. p — NULL C. p—>next == head D. p = = head 13 .在循环双链表的p所指的结点之前插入s所指结点的操作是 D 。 A .p—> prior-> prior=s B .p—> prior-> n ext=s C.s —> prior—> n ext = s D.s —> prior—> prior = s 14 .栈和队列的共同点是C 。 A.都是先进后出 B .都是先进先出 C.只允许在端点处插入和删除元素 D .没有共同点

数据结构期末考试复习笔记

判断: 1.线性表的链式存储结构优于顺序存储错误 2.单链表的每个节点都恰好包含一个指针域错误 3.线性表中的元素都可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因 此属于同一数据对象正确 4.在线性表的顺序存储结构中,逻辑上相邻的两个元素在屋里位置上并不一定紧邻。错 误 5.在线性表的数据结构中,插入和删除元素时,移动元素的个数和该元素的位置有关。正 确 6.顺序存储的线性表可以实现随机存取正确 7.栈一定是顺序存储的线性结构错误 8.一个栈的输入序列为A,B,C,D,可以得到输入序列为C,A,B,D 错误 9.队列是一种后进先出的线性表错误 10.树结构中每个节点最多只有一个直接前驱正确 11.二叉树的前序遍历中,任意一个节点均处于其子树节点的前面正确 12.在栈空的情况下,不能做出出栈操作,否则产生溢出正确 13.在前序遍历二叉树的序列中,任何节点的子树的所有节点都是直接跟在该节点之后正 确 填空: 1.在N个节点的顺序表中删除一个节点平均需要移动((N-1)/2)个节点,具体的移 动次数取决于(表长N和删除位置) 2.在单链表中除首节点外,任意节点的存储位置都由(直接前驱)节点中的指针指示 3.树中节点的最大层次称为树的(度) 4.由一颗二叉树的前序序列和(中)序列可唯一确定这棵二叉树 5.哈弗曼树的带权路径长度(最小)的二叉树 6.二插排序树任意节点的关键字值(大于)其左子树中各节点的关键字值(小于)其 右子树中的各节点关键字值 7.二分查找法,表中元素必须按(关键字有序)存放 选择: 1.用单链表方式存储的线性表,储存每个节点需要两个域,一个数据域,另一个是(B 指针域) 2.设A1,A2,A3为三个节点;P,10,,2代表地址,则如下的链表存储结构称为(B 单链表) 3.单链表的存储密度(C 小于1) 4.在线性表中(B 中间元素)只有一个直接前驱和一个直接后续 5.两个指针P和Q,分别指向单链表的两个元素P所指元素时Q所指元素前驱的条 件是(D P==Q) 6.在栈中存取数据的原则是(B 后进先出) 7.顺序栈判空的条件是(C top==-1) 8.串是一种特殊的线性表,其特殊性体现在(B 数据元素是一个字符) 9.求字符串T和字符串S中首次出现的位置的操作为(C 串的模式匹配) 10.深度为H的二叉树至多有(B 2H-1)个节点

大学数据结构期末知识点重点总结(考试专用)

.. ;.. 第一章 概论 1.数据结构描述的是按照一定逻辑关系组织起来的待处理数据元素的表示及相关操作,涉及数据的逻辑结构、存储结构和运算 2.数据的逻辑结构是从具体问题抽象出来的数学模型,反映了事物的组成结构及事物之间的逻辑关系 可以用一组数据(结点集合K )以及这些数据之间的 一组二元关系(关系集合R )来表示:(K, R) 结点集K 是由有限个结点组成的集合,每一个结点代表一个数据或一组有明确结构的数据 关系集R 是定义在集合K 上的一组关系,其中每个关系r (r ∈R )都是K ×K 上的二元关系 3.数据类型 a.基本数据类型 整数类型(integer)、实数类型(real)、布尔类型(boolean)、字符类型(char )、指针类型(pointer ) b.复合数据类型 复合类型是由基本数据类型组合而成的数据类型;复合数据类型本身,又可参与定义结构更为复杂的结点类型 4.数据结构的分类:线性结构(一对一)、树型结构(一对多)、图结构(多对多) 5.四种基本存储映射方法:顺序、链接、索引、散列 6.算法的特性:通用性、有效性、确定性、有穷性 7.算法分析:目的是从解决同一个问题的不同算法中选择比较适合的一种,或者对原始算法进行改造、加工、使其优化 8.渐进算法分析 a .大Ο分析法:上限,表明最坏情况 b .Ω分析法:下限,表明最好情况 c .Θ分析法:当上限和下限相同时,表明平均情况 第二章 线性表 1.线性结构的基本特征 a.集合中必存在唯一的一个“第一元素” b.集合中必存在唯一的一个“最后元素” c.除最后元素之外,均有唯一的后继 d.除第一元素之外,均有唯一的前驱 2.线性结构的基本特点:均匀性、有序性 3.顺序表 a.主要特性:元素的类型相同;元素顺序地存储在连续存储空间中,每一个元素唯一的索引值;使用常数作为向量长度 b. 线性表中任意元素的存储位置:Loc(ki) = Loc(k0) + i * L (设每个元素需占用L 个存储单元) c. 线性表的优缺点: 优点:逻辑结构与存储结构一致;属于随机存取方式,即查找每个元素所花时间基本一样 缺点:空间难以扩充 d.检索:ASL=【Ο(1)】 e .插入:插入前检查是否满了,插入时插入处后的表需要复制【Ο(n )】 f.删除:删除前检查是否是空的,删除时直接覆盖就行了【Ο(n )】 4.链表 4.1单链表 a.特点:逻辑顺序与物理顺序有可能不一致;属于顺序存取的存储结构,即存取每个数据元素所花费的时间不相等 b.带头结点的怎么判定空表:head 和tail 指向单链表的头结点 c.链表的插入(q->next=p->next; p->next=q;)【Ο(n )】 d.链表的删除(q=p->next; p->next = q->next; delete q;)【Ο(n )】 e.不足:next 仅指向后继,不能有效找到前驱 4.2双链表 a.增加前驱指针,弥补单链表的不足 b.带头结点的怎么判定空表:head 和tail 指向单链表的头结点 c.插入:(q->next = p->next; q->prev = p; p->next = q; q->next->prev = q;) d.删除:(p->prev->next = p->next; p->next->prev = p->prev; p->prev = p->next = NULL; delete p;) 4.3顺序表和链表的比较 4.3.1主要优点 a.顺序表的主要优点 没用使用指针,不用花费附加开销;线性表元素的读访问非常简洁便利 b.链表的主要优点 无需事先了解线性表的长度;允许线性表的长度有很大变化;能够适应经常插入删除内部元素的情况 4.3.2应用场合的选择 a.不宜使用顺序表的场合 经常插入删除时,不宜使用顺序表;线性表的最大长度也是一个重要因素 b.不宜使用链表的场合 当不经常插入删除时,不应选择链表;当指针的存储开销与整个结点内容所占空间相 比其比例较大时,应该慎重选择 第三章 栈与队列 1.栈 a.栈是一种限定仅在一端进行插入和删除操作的线性表;其特点后进先出;插入:入栈(压栈);删除:出栈(退栈);插入、删除一端被称为栈顶(浮动),另一端称为栈底(固定);实现分为顺序栈和链式栈两种 b.应用: 1)数制转换 while (N) { N%8入栈; N=N/8;} while (栈非空){ 出栈; 输出;} 2)括号匹配检验 不匹配情况:各类括号数量不同;嵌套关系不正确 算法: 逐一处理表达式中的每个字符ch : ch=非括号:不做任何处理 ch=左括号:入栈 ch=右括号:if (栈空) return false else { 出栈,检查匹配情况, if (不匹配) return false } 如果结束后,栈非空,返回false 3)表达式求值 3.1中缀表达式: 计算规则:先括号内,再括号外;同层按照优先级,即先乘*、除/,后加+、减-;相同优先级依据结合律,左结合律即为先左后右 3.2后缀表达式: <表达式> ::= <项><项> + | <项> <项>-|<项> <项> ::= <因子><因子> * |<因子><因子>/|<因子> <因子> ::= <常数> ? <常数> ::= <数字>|<数字><常数> <数字> ∷= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 3.3中缀表达式转换为后缀表达式 InfixExp 为中缀表达式,PostfixExp 为后缀表达式 初始化操作数栈OP ,运算符栈OPND ;OPND.push('#'); 读取InfixExp 表达式的一项 操作数:直接输出到PostfixExp 中; 操作符: 当‘(’:入OPND; 当‘)’:OPND 此时若空,则出错;OPND 若非空,栈中元 素依次弹出,输入PostfixExpz 中,直到遇到‘(’为止;若 为‘(’,弹出即可 当‘四则运算符’:循环(当栈非空且栈顶不是‘(’&& 当前运算符优先级>栈顶运算符优先级),反复弹出栈顶运 算符并输入到PostfixExp 中,再将当前运算符压入栈 3.4后缀表达式求值 初始化操作数栈OP ; while (表达式没有处理完) { item = 读取表达式一项; 操作数:入栈OP ; 运算符:退出两个操作数, 计算,并将结果入栈} c.递归使用的场合:定义是递归的;数据结构是递归的;解决问题的方法是递归的 2.队列 a.若线性表的插入操作在一端进行,删除操作在另一端进行,则称此线性表为队列 b.循环队列判断队满对空: 队空:front==rear ;队满:(rear+1)%n==front 第五章 二叉树 1.概念 a. 一个结点的子树的个数称为度数 b.二叉树的高度定义为二叉树中层数最大的叶结点的层数加1 c.二叉树的深度定义为二叉树中层数最大的叶结点的层数 d.如果一棵二叉树的任何结点,或者是树叶,或者恰有两棵非空子树,则此二叉树称作满二叉树 e.如果一颗二叉树最多只有最下面的两层结点度数可以小于2;最下面一层的结点都集中在该层最左边的位置上,则称此二叉树为完全二叉树 f.当二叉树里出现空的子树时,就增加新的、特殊的结点——空树叶组成扩充二叉树,扩充二叉树是满二叉树 外部路径长度E :从扩充的二叉树的根到每个外部结点(新增的空树叶)的路径长度之和 内部路径长度I :扩充的二叉树中从根到每个内部结点(原来二叉树结点)的路径长度之和 2.性质 a. 二叉树的第i 层(根为第0层,i ≥0)最多有2^i 个结点 b. 深度为k 的二叉树至多有2k+1-1个结点 c. 任何一颗二叉树,度为0的结点比度为2的结点多一个。n0 = n2 + 1 d. 满二叉树定理:非空满二叉树树叶数等于其分支结点数加1 e. 满二叉树定理推论:一个非空二叉树的空子树(指针)数目等于其结点数加1 f. 有n 个结点(n>0)的完全二叉树的高度为?log2(n+1)?,深度为?log2(n+1)?? g. 对于具有n 个结点的完全二叉树,结点按层次由左到右编号,则有: 1) 如果i = 0为根结点;如果i>0,其父结点编号是 (i-1)/2 2) 当2i+1∈N ,则称k 是k'的父结 点,k'是的子结点 若有序对∈N , 则称k'k ″互为兄弟 若有一条由 k 到达ks 的路径,则 称k 是的祖先,ks 是k 的子孙 2.树/森林与二叉树的相互转换 a.树转换成二叉树 加线: 在树中所有兄弟结点之间加一连线 抹线: 对每个结点,除了其最左孩子外,与其余孩 子之间的连线 旋转: 45° b.二叉树转化成树 加线:若p 结点是双亲结点的左孩子,则将的右孩子,右孩子的右孩子,所有右孩子,都与p 的双亲用线连起来 线 调整:将结点按层次排列,形成树结构 c.森林转换成二叉树 将各棵树分别转换成二叉树 将每棵树的根结点用线相连 为轴心,顺时针旋转,构成二叉树型结构 d.二叉树转换成森林 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到 的所有右孩子间连线全部抹掉,使之变成孤立的二叉树 还原:将孤立的二叉树还原成树 3.周游 a.先根(次序)周游 若树不空,则先访问根结点,然后依次先根周游各棵子树 b.后根(次序)周游 若树不空,则先依次后根周游各棵子树,然后访问根结点 c.按层次周游 若树不空,则自上而下自左至右访问树中每个结点 4.存储结构 “左子/右兄”二叉链表表示法:结点左指针指向孩子,右结点指向右兄弟,按树结构存储,无孩子或无右兄弟则置空 5. “UNION/FIND 算法”(等价类) 判断两个结点是否在同一个集合中,查找一个给定结点的根结点的过程称为FIND 归并两个集合,这个归并过程常常被称为UNION “UNION/FIND ”算法用一棵树代表一个集合,如果两个结点在同一棵树中,则认为它们在同一个集合中;树中的每个结点(除根结点以外)有仅且有一个父结点;结点中仅需保存父指针信息,树本身可以 存储为一个以其结点为元素的数组 6.树的顺序存储结构 a. 带右链的先根次序表示法 在带右链的先根次序表示中,结点按先根次序顺序存储在一片连续的存储单元中 每个结点除包括结点本身数据外,还附加两个表示结构的信息字段,结点的形式为: info 是结点的数据;rlink 是右指针,指向结点的下一个兄弟;ltag 是一个左标记,当结点没有子结点(即对应二 叉树中结点没有左子结点时),ltag 为 1,否则为 0 b. 带双标记位的先根次序表示法 规定当结点没有下一个兄弟(即对应的二叉树中结点没有右子结点时)rtag 为1,否则为0 c. 带双标记位的层次次序表示法 结点按层次次序顺序存储在一片连续的存储单元中 第七章 图 1.定义 a.假设图中有n 个顶点,e 条边: 含有e=n(n-1)/2条边的无向图称作完全图 含有e=n(n-1) 条弧的有向图称作有向完全图 若边或弧的个数e < nlogn ,则称作稀疏图,否则称作稠密图 b. 顶点的度(TD)=出度(OD)+入度(ID) 顶点的出度: 以顶点v 为弧尾的弧的数目 顶点的入度: 以顶点v 为弧头的弧的数目 c.连通图、连通分量 若图G 中任意两个顶点之间都有路径相通,则称此图为连通图 若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量 d.强连通图、强连通分量 对于有向图,若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图 否则,其各个极大强连通子图称作它的强连通分量 e.生成树、生成森林 假设一个连通图有n 个顶点和e 条边,其中n-1条边和n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树 对非连通图,则将由各个连通分量构成的生成树集合称做此非连通图的生成森林 2.存储结构 a.相邻矩阵表示法 表示顶点间相邻关系的矩阵 若G 是一个具有n 个顶点的图,则G 的相邻矩阵是如下定义的n ×n 矩阵: A[i,j]=1,若(Vi, Vj)(或)是图G 的边 A[i,j]=0,若(Vi, Vj)(或)不是图G 的边 b.邻接表表示法 为图中每个顶点建立一个单链表,第i 个单链表中的结点表示依附于顶点Vi 的边(有向图中指以Vi 为尾的弧)(建立单链表时按结点顺序建立) 3.周游 a. 深度优先周游: 从图中某个顶点V0出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发,深度优先搜索遍历图中的其余顶点,直至图中所有与V0有路径相通的顶点都被访问到为止 b. 广度优先周游: 从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,随后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有与V0有路径相通的顶点都被访问到为止,若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止 4.拓扑排序 拓扑排序的方法是:1)选择一个入度为0的顶点且输出之 2)从图中删掉此顶点及所有的出边 3)回到第1步继续执行,直至图空或者图不空但找不到无前驱(入度为0)的顶点为止 5.单源最短路径(Dijkstra 算法) 6.每对顶点间的最短路径(Floyd 算法) 7.最小生成树 a.Prim 算法 b.Kruskal 算法 c.两种算法比较:Prim 算法适合稠密图,Kruskal 算法适合稀疏图 第八章 内排序 算法 最大时间 平均时间 直接插入排序 Θ(n2) Θ(n2) 冒泡排序 Θ(n2) Θ(n2) 直接选择排序 Θ(n2) Θ(n2) Shell 排序 Θ(n3/2) Θ(n3/2) 快速排序 Θ(n2) Θ(nlog n) 归并排序 Θ(nlog n) Θ(nlog n) 堆排序 Θ(nlog n) Θ(nlog n) 桶式排序 Θ(n+m) Θ(n+m) 基数排序 Θ(d ·(n+r)) Θ(d ·(n+r)) 最小时间 S(n) 稳定性 Θ(n) Θ(1) 稳定 Θ(n) Θ(1) 稳定 Θ(n2) Θ(1) 不稳定 Θ(n3/2) Θ(1) 不稳定 Θ(nlog n) Θ(log n) 不稳定 Θ(nlog n) Θ(n) 稳定 Θ(nlog n) Θ(1) 不稳定 Θ(n+m) Θ(n+m) 稳定 Θ(d ·(n+r)) Θ(n+r) 稳定 第十章 检索 1.平均检索长度(ASL )是待检索记录集合中元素规模n 的函数, 其定义为: ASL= Pi 为检索第i 个元素的概率;Ci 为找到第i 个元素所需的比较次数 2.散列 a.除余法 用关键码key 除以M(取散列表长度),并取余数作为散列地址 散列函数为:hash(key) = key mod M b.解决冲突的方法 开散列方法:把发生冲突的关键码存储在散列表主表之外(在主表外拉出单链表) 闭散列方法:把发生冲突的关键码存储在表中另一个位置上 c.线性探查 基本思想:如果记录的基位置存储位置被占用,就在表中下移,直到找到一个空存储位置;依次探查下述地址单元:d0+1,d0+2,...,m-1,0, 1,..., d0-1;用于简单线性探查的探查函数是:p(K, i) = i d.散列表的检索 1.假设给定的值为K ,根据所设定的散列函数h ,计算出散列地址h(K) 2. 如果表中该地址对应的空间未被占用,则检索失败,否则将该地址中的值与K 比较 3. 若相等则检索成功;否则,按建表时设定的处理冲突方法查找探查序列的下一个地址,如此反复下去,直到某个地址空间未被占用(可以插入),或者关键码比较相等(有重复记录,不需插入)为止 e.散列表的删除:删除后在删除地点应加上墓碑(被删除标记) f.散列表的插入:遇到墓碑不停止,知道找到真正的空位置 第十一章 索引技术 1.概念: a.主码:数据库中的每条记录的唯一标识 b.辅码:数据库中可以出现重复值的码 2.B 树 a.定义:B 树定义:一个m 阶B 树满足下列条件: (1) 每个结点至多有m 个子结点; (2) 除根和叶外 其它每个结点至少有??个子结点; (3) 根结点至少有两个子结点 例外(空树,or 独根) (4) 所有的叶在同一层,可以有??- 1到m-1个关键码 (5) 有k 个子结点的非根结点恰好包含k-1个关键码 b.查找 在根结点所包含的关键码K1,…,Kj 中查找给定的关键码值(用顺序检索(key 少)/二分检索(key 多));找到:则检索成功;否则,确定要查的关键码值是在某个Ki 和Ki+1之间,于是取pi 所指结点继续查找;如果pi 指向外部结点,表示检索失败. c.插入 找到的叶是插入位置,若插入后该叶中关键码个数

数据结构以及C语言常问与难点

数据结构以及C语言常问与难点 1.序言 2.常问与难点,为避免重复发帖,特设此帖并置顶,以供浏览查阅。 3.内容主要是将本版的好帖子收集起来,并加以整理,仅给出知识点分析与问题解答,并不给出原帖链接,致歉。 4.本版中的好东西会慢慢添加进来(各位版主齐心协力,每天添加一个知识点,用不了多久就会很强大),本帖观点只 是各位版主和我个人的分析,不一定尽善尽美,但一定是尽心尽力。各位热心研友如有修正和补充,请在回复中说明。 5.特代表研友感谢各位版主的辛勤奉献,代表版主感谢热心研友对王道的支持(呵呵)。特别地,祝备考10的研友们一 切顺利,考上理想的学校。珍惜时间,努力才是王道。 1.目录,共占用一个代码区 2. 3. 1.如下结构体定义的全部细节解释,附有完整程序。涉及知识点:结构体定义,typedef,指针使用的部分知识。 4.typedef struct LNode{ 5. ElemType data; 6. struct LNode *next; 7.} LNode, *LinkList; 8. 9. 2.符号&的含义,指针进阶。涉及知识点:引用机制,实参与形参,C语言中地址与指针(以及指向指针的指针),指 针的传递(暂不涉及数组与指针的知识,将在以后介绍)。 10. 11. 3.如下方式动态分配内存的全部细节解释。涉及知识点:动态分配内存,define,强制类型转换,malloc(),顺序 表存储结构,顺序表与数组,链表结点的内存分配,指针细节,附完整程序。 12.L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 复制代码 1.正文,每个问题占用一个代码区 复制代码 1. 1.如下结构体定义的全部细节解释,附有完整程序。涉及知识点:结构体定义,typedef,指针使用的部分知识。 2.typedef struct LNode{ 3. ElemType data; 4. struct LNode *next; 5.} LNode, *LinkList; 6. 7.如下是一个最简单的结构体定义:

数据结构 期末考试复习题及答案

1.什么是最小生成树?简述最小生成树的Prime算法的思想。 答:最小生成树就是构造一棵生成树,使得树上各边的代价之和最小。 普里姆算法(Prim)的基本思想: 从连通网络N = { V, E }中的某一顶点u0 出发,选择与它关联的具有最小权值的边(u0, v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把它的顶点加入到集合U中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合U中为止。 2.简述AOV网络中为何不能出现回路,如何判断AOV网络是否有回路? 答:在AOV网络中,如果活动vi必须在vj之前进行,则称为存在有向边;在AOV网络中不能出现有向回路,如果出现了,则意味着某项活动应以自己作为先决条件。 如何检查AOV网是否存在有向环: 检测有向环的一种方法是对AOV网络构造它的拓扑有序序列。即将各个顶点(代表各个活动)排列成一个线性有序的序列,使得AOV网络中所有应存在的前驱和后继关系都能得到满足。(1)这种构造AOV网络全部顶点的拓扑有序序列的运算就叫做拓扑排序。 (2)如果通过拓扑排序能将AOV网络的所有顶点都排入一个拓扑有序的序列中,则该AOV 网络中必定不会出现有向环;相反,如果得不到满足要求的拓扑有序序列,则说明AOV网络中存在有向环,此AOV网络所代表的工程是不可行的。

3.为何需要采用循环队列?n个空间的循环队列,最多存储多少个元素?为什 么? 答:循环队列以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分的利用,所以采用循环队列。 n个空间的循环队列,最多存储n-1个元素,那是为了区别循环队列的队空和队满的条件。队空的条件是Q.front==Q.rear,而队满的条件是(Q.rear+1)%N==Q.front(N是数组中单元的总数),因此,Q.rear所指向的数组单元处于未用状态。所以说,N个单元的数组所存放的循环队列最大长度是N-1。 4.简述堆的删除算法,其删除的是那个值? 答:堆的删除算法:首先,移除根节点的元素(并把根节点作为当前结点)比较当前结点的两个孩子结点的元素大小,把较大的那个元素移给当前结点,接着把被移除元素的孩子结点作为当前结点,并再比较当前结点的孩子的大小,以此循环,直到最后一个叶子结点的值大于或等于当前结点的孩子结点或孩子结点的位置超过了树中元素的个数,则退出循环。最后把最后叶子结点的元素移给当前结点。 在堆的算法里面,删除的值为根值。 5.线索二叉树中,什么是线索,它是否唯一?可有根据什么顺序得到?

2010级数据结构期末复习题(E)

一、是非题 1.数据结构概念包括数据之间的逻辑结构,数据在计算机中的存储方式和数据的运 算三个方面。.......................( T ) 2.线性表的逻辑顺序与物理顺序总是一致的........( F ) 3.线性表中的每个结点最多只有一个前驱和一个后继。......( T ) 4.线性的数据结构可以顺序存储,也可以链接存储。非线性的数据结构只能链接存 储。.......................( F ) 5.栈和队列逻辑上都是线性表。..........................( T ) 6.单链表从任何一个结点出发,都能访问到所有结点........( F ) 7.单链表形式的队列,头指针F指向队列的第一个结点,尾指针R指向队列的最后 一个结点。.................................................( T ) 8.在用单链表表示的链式队列中,队头在链表的链尾位置。....( F ) 9.多维数组是向量的推广。..............................( T ) 10.栈是一种先进先出的线性表。....( F ) 11.凡是递归定义的数据结构都可以用递归算法来实现它的操作。......( T ) 12.设串S的长度为n,则S的子串个数为n(n+1)/2。...........( F ) 13.一般树和二叉树的结点数目都可以为0。................( F ) 14.按中序遍历二叉树时,某结点的直接后继是它的右子树中第1个被访问的结 点。....( T ) 15.后序序列和中序序列能唯一确定一棵二叉树。....( T ) 16.对于一棵具有n个结点,其高度为h的二叉树,进行任—种次序遍历的时间复杂 度为O(n) .............( T ) 17.网络的最小代价生成树是唯一的。...( T ) 18.图的拓扑有序序列不是唯一的。...( T ) 19.进行折半搜索的表必须是顺序存储的有序表。...( T ) 二、单选题 1.算法指的是( D ) A.计算机程序 B.解决问题的计算方法 C.排序算法 D.解决问题的有限运算序列 2.线性表采用链式存储时,结点的存储地址(B ) A.必须是不连续的 B.连续与否均可 C.必须是连续的 D.和头结点的存储地址相连续 3.将长度为n的单链表链接在长度为m的单链表之后的算法的时间复杂度为(C ) A.O(1) B.O(n) C.O(m) D.O(m+n) 4.在一个长度为n的顺序表的表尾插入一个新元素的渐进时间复杂度为( B )。 A.O(n) B.O(1) C.O(n2) D.O(log2n)T 5.线性表L在( B )情况下适用于使用链式结构实现。 A.需经常修改L中的结点值 B.需不断对L进行删除插入 C.L中含有大量的结点 D.L中结点结构复杂 6.设单链表中结点的结构为(data,1ink)。已知指针q所指结点是指针p所指结点 的直接前驱,若在*q与*p之间插入结点*s,则应执行下列哪一个操作?( B ) A.s一>1ink=p一>1ink;p一>1ink=s B.q一>1ink=s;s一>link=p C.p一>link=s一>1ink;s一>1ink=p

2018考研计算机:数据结构重难点及复习建议

2018考研计算机:数据结构重难点及 复习建议 新东方在线推荐: 一、重难点解析和复习建议 数据结构的考查目标定位为掌握数据结构的基本概念、基本原理和基本方法,掌握数据的逻辑结构、存储结构以及基本操作的实现;能够对算法进行基本的时间复杂度和空间复杂度的分析;能够运用数据结构的基本原理和方法进行问题的分析求解,具备采用C、C++或JAVA语言设计程序与实现算法的能力。 当然,考生也不必因此而专门复习一遍C或C++程序设计,毕竟复习时间有限,而且数据结构要求的重点在于算法设计的能力,而不是编写代码的能力,因此,只要能用类似伪代码的形式把思路表达清楚就行,不用强求写出一个没有任何语法错误的程序。 下面我们来解析一下知识点: 线性表这一章里面的知识点不多,但要做到深刻理解,能够应用相关知识点解决实际问题。链表上插入、删除节点时的指针操作是选择题的一个常考点,诸如双向链表等一些相对复杂的链表上的操作也是可以出现在综合应用题当中的。 栈、队列和数组可以考查的知识点相比链表来说要多一些。最基本的,是栈与队列FILO和FIFO的特点。比如针对栈FILO的特点,进栈出栈序列的问题常出现在选择题中。其次,是栈和队列的顺序和链式存储结构,这里一个常考点是不同存储结构下栈顶指针、队首指针以及队尾指针的操作,特别是循环队列判满和判空的2种判断方法。再次,是特殊矩阵的压缩存储,这个考点复习的重点可以放在二维矩阵与一维数组相互转换时,下标的计算方法,比如与对角线平行的若干行上数据非零的矩阵存放在一维数组后,各个数据点相应的下标的计算。这一章可能的大题点,在于利用堆栈或队列的特性,将它们作为基础的数据结构,支持实际问题求解算法的设计,例如用栈解决递归问题,用队列解决图的遍历问题等等。 树和二叉树:这一章中我们从顺序式的数据结构,转向层次式的数据结构,要掌握树、二叉树的各种性质、树和二叉树的不同存储结构、森林、树和二叉树之间的转换、线索化二叉树、二叉树的应用(二叉排序树、平衡二叉树和Huffman树),重点要熟练掌握的,是森林、树以及二叉树的前中后三种遍历方式,要能进行相应的算法设计。这一部分是数据结构考题历来的重点和难点,复习时要特别关注。一些常见的选择题考点包括:满二叉树、完全二叉树节点数的计算,由树、二叉树的示意图给出相应的遍历序列,依据二叉树的遍历序列还原二叉树,线索化的实质,计算采用不同的方法线索化后二叉树剩余空指针域的个数,平衡二叉树的定义、性质、建立和四种调整算法以及回溯法相关的问题。常见的综合应用题考点包括:二叉树的遍历算法,遍历基础上针对二

数据结构期末复习题

第一类题目选择题 1.从逻辑上可以把数据结构分为()两大类。 A.动态结构、静态结构 B.顺序结构、链式结构 C.线性结构、非线性结构 D.初等结构、构造型结构 2.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。 A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表3.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。 A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表 4.执行下面程序短的时间复杂度为()。 for(i=0;inext==NULL C. p==head D. p->next==head 8.某个栈的入栈序列是a,b,c,d,e,则可能的出栈序列是()。 A.a,d,b,e,c B.e,b,c,a,d C.b,c,d,e,a D.e,a,b,c,d 9. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?() A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 10.二叉树的第I层上最多含有结点数为()。 A.2I B.2I-1 C.2I-1-1 D.2I-1 11. 如果从无向图的任一顶点出发进行一次深度优先搜索即可访问所有的顶点,则该图一定是()。 A.完全图 B.有回路 C.连通图 D.一棵树 12. 栈在()中应用。 A. 递归调用 B. 子程序调用 C. 表达式求值 D. A,B,C 13. 一个递归算法必须包括()。 A. 递归部分 B. 终止条件和递归部分 C. 迭代部分 D.终止条件和迭

数据结构复习资料,java数据结构期末考试

第二章算法分析 1.算法分析是计算机科学的基础 2.增长函数表示问题(n)大小与我们希望最优化的值之间的关系。该函数表示了该算法的时间复杂度或空间复杂度。增长函数表示与该问题大小相对应的时间或空间的使用 3.渐进复杂度:随着n的增加时增长函数的一般性质,这一特性基于该表达式的主项,即n 增加时表达式中增长最快的那一项。 4.渐进复杂度称为算法的阶次,算法的阶次是忽略该算法的增长函数中的常量和其他次要项,只保留主项而得出来的。算法的阶次为增长函数提供了一个上界。 5.渐进复杂度:增长函数的界限,由增长函数的主项确定的。渐进复杂度类似的函数,归为相同类型的函数。 6.只有可运行的语句才会增加时间复杂度。 7. O() 或者大O记法:与问题大小无关、执行时间恒定的增长函数称为具有O(1)的复杂度。 增长函数阶次 t(n)=17 O(1) t(n)=3log n O(log n) t(n)=20n-4 O(n) t(n)=12n log n + 100n O(n log n) t(n)=3n2+ 5n - 2 O(n2) t(n)=8n3+ 3n2O(n3) t(n)=2n+ 18n2+3n O(2n) 8.所有具有相同阶次的算法,从运行效率的角度来说都是等价的。 9.如果算法的运行效率低,从长远来说,使用更快的处理器也无济于事。 10.要分析循环运行,首先要确定该循环体的阶次n,然后用该循环要运行的次数乘以它。(n 表示的是问题的大小) 11.分析嵌套循环的复杂度时,必须将内层和外层循环都考虑进来。 12.方法调用的复杂度分析: 如:public void printsum(int count){ int sum = 0 ; for (int I = 1 ; I < count ; I++) sum += I ; System.out.println(sun); } printsum方法的复杂度为O(n),计算调用该方法的初始循环的时间复杂度,只需把printsum方法的复杂度乘以该循环运行的次数即可。所以调用上面实现的printsum方法的复 杂度为O(n2)。 13指数函数增长> 幂函数增长> 对数函数增长

相关文档
最新文档