数据结构试题集(含答案)

更新时间:2023-10-06 22:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 概论

一、选择题

1、研究数据结构就是研究( D )。

A. 数据的逻辑结构

B. 数据的存储结构

C. 数据的逻辑结构和存储结构 D. 数据的逻辑结构、存储结构及其基本操作 2、算法分析的两个主要方面是( A )。

A. 空间复杂度和时间复杂度

B. 正确性和简单性

C. 可读性和文档性 D. 数据复杂性和程序复杂性 3、具有线性结构的数据结构是( A. 图

B. 树

D )。

C. 广义表 D. 栈

4、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、( B )等5个特性。

A. 可执行性、可移植性和可扩充性 B. 可执行性、有穷性和确定性 C. 确定性、有穷性和稳定性

D. 易读性、稳定性和确定性

5、下面程序段的时间复杂度是( C )。

for(i=0;i

for(j=0;j

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

C. O(m*n)

D. O(m+n)

A. O(m2) B. O(n2) 6、算法是( D )。

1

A. 计算机程序 B. 解决问题的计算方法

C. 排序算法 D. 解决问题的有限运算序列

7、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示( C )。

A. O(n)

B. O(nlog2n) C. O(n2) D. O(log2n)

8、下面程序段的时间复杂度为( C )。

i=1; while(i<=n)

i=i*3; A. O(n)

B. O(3n)

C. O(log3n) D. O(n3)

9、数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的( B )和运算等的学科。

A. 结构

B. 关系

C. 运算

D. 算法

10、下面程序段的时间复杂度是( C )。

i=s=0; while(s

A. O(n)

B. O(n2)

C. O(√n)

D. O(n3)

i++;s+=i;

11、抽象数据类型的三个组成部分分别为( A )。 A. 数据对象、数据关系和基本操作

C. 数据项、数据元素和数据类型

B. 数据元素、逻辑结构和存储结构 D. 数据元素、数据结构和数据类型

12、通常从正确性、易读性、健壮性、高效性等4个方面评价算法的质量,以下解释

2

错误的是( A )。

A. 正确性算法应能正确地实现预定的功能

B. 易读性算法应易于阅读和理解,以便调试、修改和扩充

C. 健壮性当环境发生变化时,算法能适当地做出反应或进行处理,不会产生不需

要的运行结果

D. 高效性即达到所需要的时间性能

13、下列程序段的时间复杂度为( B )。

x=n;y=0;

while(x>=(y+1)*(y+1))

y=y+1;

B. O(n)

C. O(1)

D. O(n2)

A. O(n)

二、填空题

1、程序段“i=1;while(i<=n) i=i*2;”的时间复杂度为 O(log2n) 。 2、数据结构的四种基本类型中, 树形结构 的元素是一对多关系。 三、综合题

1、将数量级O(1),O(N),O(N2),O(N3),O(NLOG2N),O(LOG2N),O(2N)按增长率由小到大排序。

答案: O(1) < O(log2N) < O(N) < O(Nlog2N) < O(N2) < O(N3) < O(2N)

3

第二章 线性表

一、选择题

1、若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素算法的时间复杂度( C )。

A. O(log2n)

B.O(1)

C. O(n)

D.O(n2)

2、若一个线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用( A )存储方式最节省时间。 A. 顺序表 B. 单链表 3、具有线性结构的数据结构是( D )。

A. 图

B. 树

C. 广义表 D. 栈

C. 双链表 D. 单循环链表

4、在一个长度为n的顺序表中,在第i个元素之前插入一个新元素时,需向后移动( B )个元素。

A. n-i

B. n-i+1 C. n-i-1

4

D. i

5、非空的循环单链表head的尾结点p满足( A )。

A. p->next==head C. p==NULL

B. p->next==NULL

D. p==head

6、链表不具有的特点是( A )。

A. 可随机访问任一元素 C. 不必事先估计存储空间

B. 插入删除不需要移动元素

D. 所需空间与线性表长度成正比

7、在双向循环链表中,在p指针所指的结点后插入一个指针q所指向的新结点,修改指针的操作是( C )。

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->next=p->next;q->prior=p;p->next=q;p->next=q; 8、线性表采用链式存储时,结点的存储地址( C )。

A. 必须是连续的 C. 连续与否均可

B. 必须是不连续的

D. 和头结点的存储地址相连续

9、在一个长度为n的顺序表中删除第i个元素,需要向前移动( A )个元素。

A. n-i

B. n-i+1

C. n-i-1

D. i+1

10、线性表是n个( C )的有限序列。

A. 表元素

B. 字符

C. 数据元素

D. 数据项

11、从表中任一结点出发,都能扫描整个表的是( C )。

A. 单链表 B. 顺序表

C. 循环链表

D. 静态链表

12、在具有n个结点的单链表上查找值为x的元素时,其时间复杂度为( A )。

5

答案:(1)p=p->next (2)p->data

2、函数实现单链表的插入算法,请在空格处将算法补充完整。

int ListInsert(LinkList L,int i,ElemType e){ LNode *p,*s;int j; p=L;j=0;

while((p!=NULL)&&(j

}

p=p->next;j++;

if(p==NULL||j>i-1) return ERROR; s=(LNode *)malloc(sizeof(LNode)); s->data=e;

(1) ; (2) ; return OK; }/*ListInsert*/

答案:(1)s->next=p->next (2)p->next=s

3、函数ListDelete_sq实现顺序表删除算法,请在空格处将算法补充完整。

int ListDelete_sq(Sqlist *L,int i){ int k;

if(i<1||i>L->length) return ERROR;

for(k=i-1;klength-1;k++)

L->slist[k]= (1) ;

(2) ;

11

return OK; }

答案:(1)L->slist[k+1] (2) --L->Length

4、函数实现单链表的删除算法,请在空格处将算法补充完整。 int ListDelete(LinkList L,int i,ElemType *s){ LNode *p,*q; int j; p=L;j=0;

while(( (1) )&&(jnext;j++; }

if(p->next==NULL||j>i-1) return ERROR; q=p->next; (2) ; *s=q->data; free(q); return OK; }/*listDelete*/

答案:(1)p->next!=NULL (2)p->next=q->next 5、写出算法的功能。

int L(head){

node * head;

12

}

int n=0; node *p; p=head; while(p!=NULL) { p=p->next; n++; } return(n);

答案:求单链表head的长度

五、综合题

1、编写算法,实现带头结点单链表的逆置算法。 答案:void invent(Lnode *head)

{Lnode *p,*q,*r;

if(!head->next) return ERROR;

p=head->next; q=p->next; p->next =NULL; while(q)

{ r=q->next;

13

q->next=p; head->next=q; p=q; q=r;

}

}

试编写一个算法,将一个顺序表逆置,并使用最少的辅助存储空间实现。

答案:typedef struct { ElemType *elem; int length; }Sqlist;

Invert_list(Sqlist *L)/*将顺序表进行逆置*/ { int i; ElemType t;

for(i=0;i<(L->length-1)/2;i++){ t=L->elem[i];

L->elem [i]= L->elem [L->length-i-1]; L->elem [L->length -i-1]=t; }/*for*/ }/*invert_list*/

2、有两个循环链表,链头指针分别为L1和L2,要求写出算法将L2链表链到L1链表之后,且连接后仍保持循环链表形式。

14

答案:void merge(Lnode *L1, Lnode *L2)

{Lnode *p,*q ; while(p->next!=L1)

p=p->next; while(q->next!=L2)

q=q->next;

q->next=L1; p->next =L2; }

3、设一个带头结点的单向链表的头指针为head,设计算法,将链表的记录,按照data域的值递增排序。

答案:void assending(Lnode *head)

{Lnode *p,*q , *r, *s;

p=head->next; q=p->next; p->next=NULL; while(q)

{r=q; q=q->next; if(r->data<=p->data)

{r->next=p; head->next=r; p=r; } else

{while(!p && r->data>p->data)

{s=p; p=p->next; } r->next=p; s->next=r;}

p=head->next; }

15

}

printf(“%d”,p->data);

}

答案:二叉树后序遍历递归算法

五、综合题

1、假设以有序对表示从双亲结点到孩子结点的一条边,若已知树中边的集合为{,,,,,,,,,},请回答下列问题: (1)哪个结点是根结点? a

(2)哪些结点是叶子结点? b,d,i,j,f,k,h (3)哪些结点是k的祖先? g,c,a (4)哪些结点是j的兄弟? i (5)树的深度是多少? 4

2、假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。

【知识点:二叉树前序序列的隐含性质:第一个一定是二叉树的根,后面紧跟着的是其左子树的根;二叉树后序序列的隐含性质:最后一个一定是二叉树的根,它的紧前一个是其右子树的根】 答案:

46

3、假设用于通讯的电文仅由8个字母A、B、C、D、E、F、G、H组成,字母在电文中出现的频率分别为:0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。请为这8个字母设计哈夫曼编码。

47

答案:

4、已知二叉树的先序遍历序列为ABCDEFGH,中序遍历序列为CBEDFAGH,画出二叉树。

答案:二叉树形态

ABCEDFGH

5、试用权集合{12,4,5,6,1,2}构造哈夫曼树,并计算哈夫曼树的带权路径长度。 答案:

48

301218743125116

WPL=12*1+(4+5+6)*3+(1+2)*4=12+45+12=69

6、已知权值集合为{5,7,2,3,6,9},要求给出哈夫曼树,并计算带权路径长度WPL。 答案:(1)树形态:

321367919105523 (2)带权路径长度:WPL=(6+7+9)*2+5*3+(2+3)*4=44+15+20=79

7、已知一棵二叉树的先序序列:ABDGJEHCFIKL;中序序列:DJGBEHACKILF。画出二叉树的形态。

ABDGJEHKILCF答案: 8、一份电文中有6种字符:A,B,C,D,E,F,它们的出现频率依次为16,5,9,3,30,1,完成问题:

49

(1)设计一棵哈夫曼树;(画出其树结构) (2)计算其带权路径长度WPL; 答案:(1)树形态:

6430341618995413 (2)带权路径长度:WPL=30*1+16*2+9*3+5*4+(1+3)*5=30+32+27+20+20=129

9、已知某森林的二叉树如下所示,试画出它所表示的森林。

ABCEDHFG 答案:

ABCEGDFH

50

本文来源:https://www.bwwdw.com/article/ga7d.html

Top