太原理工大学数据结构试题库及答案

更新时间:2024-05-15 21:56:01 阅读量: 综合文库 文档下载

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

数据结构试题库及答案

第一章 概论

一、选择题

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

A.数据的逻辑结构 B.数据的存储结构

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

A. 空间复杂度和时间复杂度 B. 正确性和简单性 C. 可读性和文档性D. 数据复杂性和程序复杂性 3、具有线性结构的数据结构是(D)。

A.图 B.树 C.广义表 D.栈 6、算法是( D)。

A.计算机程序 B.解决问题的计算方法 C.排序算法 D.解决问题的有限运算序列

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

A. O(n) B. O(nlog2n) C. O(n2) D. O(log2n) 11、抽象数据类型的三个组成部分分别为(A )。

A. 数据对象、数据关系和基本操作 B.数据元素、逻辑结构和存储结构 C. 数据项、数据元素和数据类型 D. 数据元素、数据结构和数据类型 二、填空题 三、综合题

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)

一、填空题

1. 数据结构被形式地定义为(D, R),其中D是数据元素的有限集合,R是D上的关系有限集合。

2. 数据结构包括数据的逻辑结构、数据的存储结构和数据的运算这三个方面的内容。

3. 数据结构按逻辑结构可分为两大类,它们分别是线性结构和非线性结构。

8.数据的存储结构可用四种基本的存储方法表示,它们分别是顺序、链式、索引、散列。

9. 数据的运算最常用的有5种,它们分别是插入、删除、修改、查找、排序。

二、单项选择题

(C)2. 数据结构中,与所使用的计算机无关的是数据的结构;

A)存储 B)物理 C)逻辑 D)物理和存储

三、简答题

1.数据结构和数据类型两个概念之间有区别吗?

答:简单地说,数据结构定义了一组按某些关系结合在一起的数组元素。数据类型不仅定义了一组带结构的数据元素,而且还在其上定义了一组操作。

2. 简述线性结构与非线性结构的不同点。

答:线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是多对多的。

四、分析下面各程序段的时间复杂度

1. for (i=0; i

3. x=0;

for(i=1; i

for (j=1; j<=n-i; j++)

x++;

Mn nn nn log3n

2. s=0;

for (i=0; i

for(j=0; j

4. i=1;

while(i<=n) i=i*3;

五、设有数据逻辑结构S=(D,R),试按各小题所给条件画出这些逻辑结构的图示,并确定其是哪种逻辑结构。

1. D={d1,d2,d3,d4} R={(d1,d2),(d2,d3),(d3,d4) }

2. D={d1,d2,?,d9}

R={(d1,d2),(d1,d3),(d3,d4),(d3,d6),(d6,d8),(d4,d5), (d6,d7),(d8,d9) }

3.D={d1,d2,?,d9}

R={(d1,d3),(d1,d8),(d2,d3),(d2,d4),(d2,d5),(d3,d9), (d5,d6),(d8,d9),(d9,d7), (d4,d7),(d4,d6)}

第二章 线性表

一、选择题

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

A. O(log2n) B.O(1) C. O(n) D.O(n2) 2、若一个线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用()存储方式最节省时间。

A. 顺序表 B. 单链表 C. 双链表 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; 10、线性表是n个()的有限序列。

A. 表元素 B. 字符 C. 数据元素 D. 数据项 11、从表中任一结点出发,都能扫描整个表的是()。

A. 单链表 B.顺序表 C. 循环链表 D.静态链表 12、在具有n个结点的单链表上查找值为x的元素时,其时间复杂度为()。

A. O(n) B. O(1) C. O(n2) D. O(n-1) 15、在线性表的下列存储结构中,读取元素花费的时间最少的是()。 A. 单链表 B. 双链表 C. 循环链表 D. 顺序表

16、在一个单链表中,若删除p所指向结点的后续结点,则执行()。

A. p->next=p->next->next;

B. p=p->next;p->next=p->next->next; C. p =p->next;

D. p=p->next->next;

17、将长度为n的单链表连接在长度为m的单链表之后的算法的时间复杂度为()。

A. O(1) B. O(n) C. O(m) D. O(m+n) 18、线性表的顺序存储结构是一种(a)存储结构。N

A. 随机存取 B. 顺序存取 C. 索引存取 D. 散列存取 19、顺序表中,插入一个元素所需移动的元素平均数是()。 A. (n-1)/2 B. n C. n+1 D. (n+1)/2 11、不带头结点的单链表head为空的判定条件是( b)。

A. head==NULL B. head->next==NULL C. head->next==head D. head!=NULL

12、在下列对顺序表进行的操作中,算法时间复杂度为O(1)的是()。

A. 访问第i个元素的前驱(1

C.删除第i个元素(1?i?n) D. 对顺序表中元素进行排序 13、已知指针p和q分别指向某单链表中第一个结点和最后一个结点。假设指针s指向另一个单链表中某个结点,则在s所指结点之后插入上述链表应执行的语句为( a )。

A. q->next=s->next;s->next=p; B. s->next=p;q->next=s->next; C. p->next=s->next;s->next=q; D. s->next=q;p->next=s->next;

15、在表长为n的顺序表中,当在任何位置删除一个元素的概率相同时,删除一个元素所需移动的平均个数为(a)。

A. (n-1)/2 B. n/2 C. (n+1)/2 D. n 二、填空题 1、设单链表的结点结构为(data,next)。已知指针p指向单链表中的结点,q指向新结点,欲将q插入到p结点之后,则需要执行的语句:;。 答案:q->next=p->next p->next=q

3、写出带头结点的双向循环链表L为空表的条件。 答案:L->prior==L->next==L

5、在一个单链表中删除p所指结点的后继结点时,应执行以下操作:

q= p->next;

p->next=_ q->next ___; 三、判断题

3、用循环单链表表示的链队列中,可以不设队头指针,仅在队尾设置队尾指针。

x

4、顺序存储方式只能用于存储线性结构。? 5、在线性表的顺序存储结构中,逻辑上相邻的两个元素但是在物理位置上不一定是相邻的。?

6、链式存储的线性表可以随机存取。? 四、程序分析填空题

1、函数GetElem实现返回单链表的第i个元素,请在空格处将算法补充完整。 int GetElem(LinkList L,int i,Elemtype *e){

LinkList p;int j; p=L->next;j=1; while(p&&j

p=p->next;++j; }

if(!p||j>i) return ERROR; *e=p->data; return OK; }

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

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

while((p!=NULL)&&(jnext;j++; }

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

s->next=p->next; p->next=s; return OK; }/*ListInsert*/

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]=L->slist[k+1];

--L->Length; return OK; }

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

while((p->next!=NULL)&&(jnext;j++; }

if(p->next==NULL||j>i-1) return ERROR; q=p->next; p->next=q->next; *s=q->data; free(q); return OK; }/*listDelete*/ 5、写出算法的功能。

int L(head){ node * head; 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;

if(!head->next) return ERROR;

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

{p=q; q=q->next; p->next=head->next; head->next=p;} }

2、有两个循环链表,链头指针分别为L1和L2,要求写出算法将L2链表链到L1链表之后,且连接后仍保持循环链表形式。 答案: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; }

}

4、编写算法,将一个头指针为head不带头结点的单链表改造为一个单向循环链表,并分析算法的时间复杂度。 答案:

void linklist_c(Lnode *head) {Lnode *p; p=head;

if(!p) return ERROR;

while(p->next!=NULL)

p=p->next; p->next=head; }

设单链表的长度(数据结点数)为N,则该算法的时间主要花费在查找链表最后一个结点上(算法中的while循环),所以该算法的时间复杂度为O(N)。

5、已知head为带头结点的单循环链表的头指针,链表中的数据元素依次为(a1,a2,a3,a4,?,an),A为指向空的顺序表的指针。阅读以下程序段,并回答问题: (1)写出执行下列程序段后的顺序表A中的数据元素; (2)简要叙述该程序段的功能。

if(head->next!=head) {

p=head->next; A->length=0;

while(p->next!=head) {

p=p->next;

A->data[A->length ++]=p->data; if(p->next!=head)p=p->next; }

}

答案:

(1) (a2, a4, ?, ) (2)将循环单链表中偶数结点位置的元素值写入顺序表A

6、设顺序表va中的数据元数递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。 答案:

void Insert_sq(Sqlist va[], ElemType x) {int i, j, n;

n=length(va[]); if(x>=va[i])

va[n]=x; else

{i=0;

while(x>va[i]) i++; for(j=n-1;j>=I;j--)

va[j+1]=va[j]; va[i]=x; } n++; }

7、假设线性表采用顺序存储结构,表中元素值为整型。阅读算法f2,设顺序表L=(3,7,3,2,1,1,8,7,3),写出执行算法f2后的线性表L的数据元素,并描述该算法的功能。

void f2(SeqList *L){

int i,j,k; k=0;

for(i=0;ilength;i++){

for(j=0;jdata[i]!=L->data[j];j++); if(j==k){

if(k!=i)L->data[k]=L->data[i];

k++; } }

L->length=k;

}

答案:

(3,7,2,1,8) 删除顺序表中重复的元素

8、已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表中所有大于x且小于y的元素(若表中存在这样的元素)同时释放被删除结点空间。 答案:

void Delete_list(Lnode *head, ElemType x, ElemType y) {Lnode *p, *q;

if(!head) return ERROR;

p=head; q=p; while(!p)

{if(p->data>x) && (p->data

if(p==head)

{head=p->next; free(p); p=head; q=p; } else

{q->next=p->next; free(p); p=q->next; } else

{q=p; p=p->next; }

}

}

9、在带头结点的循环链表L中,结点的数据元素为整型,且按值递增有序存放。给定两个整数a和b,且a

第三章 栈和队列

一、选择题

2、判断一个循环队列Q(最多n个元素)为满的条件是(c )。

A. Q->rear==Q->front C. Q->front==(Q->rear+1)%n

B. Q->rear==Q->front+1 D. Q->front==(Q->rear-1)%n

3、设计一个判别表达式中括号是否配对的算法,采用()数据结构最佳。

A. 顺序表 B. 链表 C. 队列 D. 栈 4、带头结点的单链表head为空的判定条件是()。

A. head==NULL B. head->next==NULL C. head->next!=NULL D. head!=NULL 5、一个栈的输入序列为:1,2,3,4,则栈的不可能输出的序列是()。

A. 1243 B. 2134 C. 1432 D. 4312 E. 3214

6、若用一个大小为6的数组来实现循环队列,且当rear和front的值分别为0,3。当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为()。

A. 1和5 B. 2和4 C. 4和2 D. 5和1 7、队列的插入操作是在()。

A. 队尾 B.队头 C. 队列任意位置 D. 队头元素后 8、循环队列的队头和队尾指针分别为front和rear,则判断循环队列为空的条件是()。

A. front==rear B. front==0 C. rear==0 D. front=rear+1 9、一个顺序栈S,其栈顶指针为top,则将元素e入栈的操作是()。

A. *S->top=e;S->top++; B. S->top++;*S->top=e; C. *S->top=e D. S->top=e; 10、表达式a*(b+c)-d的后缀表达式是()。

A. abcd+- B. abc+*d-

C. abc*+d-

D. -+*abcd

11、将递归算法转换成对应的非递归算法时,通常需要使用()来保存中间结果。

A.队列 B.栈 C.链表 D.树 12、栈的插入和删除操作在()。 A. 栈底 B. 栈顶 C. 任意位置 D. 指定位置 13、五节车厢以编号1,2,3,4,5顺序进入铁路调度站(栈),可以得到()的编组。 A. 3,4,5,1,2 B. 2,4,1,3,5

C. 3,5,4,2,1 D. 1,3,5,2,4 14、判定一个顺序栈S(栈空间大小为n)为空的条件是()。

A. S->top==0 B. S->top!=0 C. S->top==n D. S->top!=n 15、在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为()。

A. front=front->next B. s->next=rear;rear=s C. rear->next=s;rear=s; D. s->next=front;front=s; 16、一个队列的入队序列是1,2,3,4,则队列的出队序列是()。 A. 1,2,3,4 B. 4,3,2,1 C. 1,4,3,2 D. 3,4,1,2

17、依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是()。

A. a B. b C. c D. d 18、正常情况下,删除非空的顺序存储结构的堆栈的栈顶元素,栈顶指针top的变化是()。

A. top不变 B. top=0 C. top=top+1 D. top=top-1

19、判断一个循环队列Q(空间大小为M)为空的条件是()。

A. Q->front==Q->rear B. Q->rear-Q->front-1==M C. Q->front+1=Q->rear D. Q->rear+1=Q->front

20、设计一个判别表达式中左右括号是否配对出现的算法,采用()数据结构最佳。

A.线性表的顺序存储结构 B. 队列 C. 栈 D. 线性表的链式存储结构

21、当用大小为N的数组存储顺序循环队列时,该队列的最大长度为()。

A. N B. N+1 C. N-1 D. N-2 22、队列的删除操作是在()。

A. 队首 B. 队尾 C. 队前 D. 队后 23、若让元素1,2,3依次进栈,则出栈次序不可能是()。

A. 3,2,1 B. 2,1,3 C. 3,1,2 D. 1,3,2

24、循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是()。

A. (rear-front+m)%m B. rear-front+1

C. rear-front-1 D. rear-front 25、在解决计算机主机和打印机之间速度不匹配问题时,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取走数据打印。该缓冲区应该是一个()结构。

A. 堆栈 B. 队列 C. 数组 D. 线性表 26、栈和队列都是()。

A. 链式存储的线性结构 B. 链式存储的非线性结构 C. 限制存取点的线性结构 D. 限制存取点的非线性结构

27、在一个链队列中,假定front和rear分别为队头指针和队尾指针,删除一个结点的操作是()。

A. front=front->next B. rear= rear->next C. rear->next=front D. front->next=rear 28、队和栈的主要区别是()。 A. 逻辑结构不同 B.存储结构不同 C. 所包含的运算个数不同 D. 限定插入和删除的位置不同

二、填空题

1、设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5,e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1,则栈的容量至少应该是。 答案:3

2、一个循环队列Q的存储空间大小为M,其队头和队尾指针分别为front和rear,则循环队列中元素的个数为:。 答案:(rear-front+M)%M

3、在具有n个元素的循环队列中,队满时具有个元素。 答案:n-1 4、设循环队列的容量为70,现经过一系列的入队和出队操作后,front为20,rear为11,则队列中元素的个数为。 答案:61

5、已知循环队列的存储空间大小为20,且当前队列的头指针和尾指针的值分别为8和3,且该队列的当前的长度为_______。 三、判断题

1、栈和队列都是受限的线性结构。?

2、在单链表中,要访问某个结点,只要知道该结点的地址即可;因此,单链表是一种随机存取结构。?

3、以链表作为栈的存储结构,出栈操作必须判别栈空的情况。?

四、程序分析填空题

1、已知栈的基本操作函数:

int InitStack(SqStack *S); //构造空栈 int StackEmpty(SqStack *S);//判断栈空 int Push(SqStack *S,ElemType e);//入栈 int Pop(SqStack *S,ElemType *e);//出栈

函数conversion实现十进制数转换为八进制数,请将函数补充完整。

void conversion(){ InitStack(S); scanf(“%d”,&N); while(N){

(1); N=N/8; }

while((2)){ Pop(S,&e);

printf(“%d”,e); }

}//conversion

答案:(1)Push(S,N%8) (2)!StackEmpty(S) 2、写出算法的功能。

int function(SqQueue *Q,ElemType *e){ if(Q->front==Q->rear) return ERROR;

*e=Q->base[Q->front];

Q->front=(Q->front+1)%MAXSIZE; return OK; }

3、阅读算法f2,并回答下列问题:

(1)设队列Q=(1,3,5,2,4,6)。写出执行算法f2后的队列Q; (2)简述算法f2的功能。

void f2(Queue *Q){ DataType e;

if (!QueueEmpty(Q)){ e=DeQueue(Q);

f2(Q); EnQueue(Q,e); } }

答案:(1)6,4,2,5,3,1

(2)将队列倒置

五、综合题 1、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请写出相应的入队列算法(用函数实现)。

rear

答案:void EnQueue(Lnode *rear, ElemType e)

{ Lnode *new;

New=(Lnode *)malloc(sizeof(Lnode));

If(!new) return ERROR;

new->data=e; new->next=rear->next; rear->next=new; rear =new; }

2、已知Q是一个非空队列,S是一个空栈。编写算法,仅用队列和栈的ADT函数和少量工作变量,将队列Q的所有元素逆置。 栈的ADT函数有:

void makeEmpty(SqStack s); 置空栈

void push(SqStack s,ElemType e); 元素e入栈 ElemType pop(SqStack s); 出栈,返回栈顶元素 int isEmpty(SqStack s); 判断栈空 队列的ADT函数有:

void enQueue(Queue q,ElemType e); 元素e入队 ElemType deQueue(Queue q); 出队,返回队头元素 int isEmpty(Queue q); 判断队空 答案:void QueueInvent(Queue q)

{ ElemType x;

makeEmpty(SqStack s);

while(!isEmpty(Queue q))

{x=deQueue(Queue q);

push(SqStack s, ElemTypex);} while(!isEmpty(SqStack s))

{x=pop(SqStack s);

enQueue(Queue q, ElemType x);}

}

3、对于一个栈,给出输入项A,B,C,D,如果输入项序列为A,B,C,D,试给出全部可能的输出序列。

答案:出栈的可能序列:

ABCD ABDC ACDB ACBD ADCB BACD BADC BCAD BCDA CBDA CBAD CDBA DCBA

第五章 数组和广义表

一、选择题

1、设广义表L=((a,b,c)),则L的长度和深度分别为(C )。

A. 1和1 B. 1和3 C. 1和2 D. 2和3 2、广义表((a),a)的表尾是(B )。

A. a B. (a) C. () D. ((a)) 3、稀疏矩阵的常见压缩存储方法有( C )两种。

A.二维数组和三维数组 B.三元组和散列表 C.三元组和十字链表 D.散列表和十字链表 4、一个非空广义表的表头(D)。

A. 不可能是子表 B.只能是子表 C. 只能是原子 D.可以是子表或原子

5、数组A[0..5,0..6]的每个元素占5个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5][5]的地址是(A)。

A. 1175 B. 1180 C. 1205 D. 1210 6、广义表G=(a,b(c,d,(e,f)),g)的长度是( A )。

A. 3 B. 4 C. 7 D. 8

7、采用稀疏矩阵的三元组表形式进行压缩存储,若要完成对三元组表进行转置,只要将行和列对换,这种说法( B )。

A. 正确 B. 错误 C. 无法确定 D. 以上均不对 8、广义表(a,b,c)的表尾是( B )。

A. b,c B. (b,c) C. c D. (c) 9、常对数组进行两种基本操作是( C )。

A. 建立和删除 B. 索引和修改 C. 查找和修改 D. 查找与索引

10、对一些特殊矩阵采用压缩存储的目的主要是为了(D )。

A. 表达变得简单 B.对矩阵元素的存取变得简单 C. 去掉矩阵中的多余元素 D. 减少不必要的存储空间的开销 11、设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一个元素,其存储地址为1,每元素占1个地址空间,则a85的地址为()。

A. 13 B. 33 C. 18 D. 40 12、设矩阵A是一个对称矩阵,为了节省存储,将其下三角部分按行序存放在一维数组B[1,n(n-1)/2]中,对下三角部分中任一元素ai,j(i>=j),在一维数组B的下标位置k的值是( B )。

A. i(i-1)/2+j-1 B. i(i-1)/2+j C. i(i+1)/2+j-1 D. i(i+1)/2+j

13、广义表A=((a),a)的表头是( B )。

A. a B. (a) C. b

D. ((a))

14、稀疏矩阵一般的压缩存储方法有两种,即(C)。

A. 二维数组和三维数组 B.三元组和散列 C.三元组和十字链表 D.散列和十字链表 15、假设以三元组表表示稀疏矩阵,则与如图所示三元组表对应的4×5的稀疏矩阵是(注:矩阵的行列下标均从1开始)(B)。 ?0?8?0?7A. ?00???50??0?8?0?0C. ?70???50?00040004600060000??0? 0??0??0??3? 0??0???0?8?0?7B.??50??00??0?8?0?7D.??50??00?00400040600060000??3? 0??0??0??0? 3??0??

16、以下有关广义表的表述中,正确的是(A)。

A. 由0个或多个原子或子表构成的有限序列 B. 至少有一个元素是子表 C. 不能递归定义 D. 不能为空表 17、对广义表L=((a,b),((c,d),(e,f)))执行head(tail(head(tail(L))))操作的结果是()。

A. 的 B. e C. (e) D.(e,f) 二、判断题

()1、广义表中原子个数即为广义表的长度。

()2、一个稀疏矩阵采用三元组表示,若把三元组中有关行下标与列下标的值互换,并把mu和nu的值进行互换,则完成了矩阵转置。

(√)3、稀疏矩阵压缩存储后,必会失去随机存取功能。 ()4、广义表的长度是指广义表中括号嵌套的层数。

(√)5、广义表是一种多层次的数据结构,其元素可以是单原子也可以是子表。 三、填空题

1、已知二维数组A[m][n]采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A[0][0]),则A[i][j]的地址是___ Loc(A[0][0])+(i*N+j)*k ____。 2、广义表运算式HEAD(TAIL((a,b,c),(x,y,z)))的结果是:(x,y,z)。 3、二维数组,可以按照两种不同的存储方式。 4、稀疏矩阵的压缩存储方式有:和。 四、综合题

1、现有一个稀疏矩阵,请给出它的三元组表。

?0?1??0??00?000?? 210??0?20?31答案:

i112334j231233v31121-2

第六章 树

一、选择题

1、二叉树的深度为k,则二叉树最多有( C )个结点。

A. 2k B. 2k-1 C. 2k-1 D. 2k-1

2、用顺序存储的方法,将完全二叉树中所有结点按层逐个从左到右的顺序存放在一维数组R[1..N]中,若结点R[i]有右孩子,则其右孩子是( B )。

A. R[2i-1] B. R[2i+1] C. R[2i] D. R[2/i]

3、设a,b为一棵二叉树上的两个结点,在中序遍历时,a在b前面的条件是( B)。

A. a在b的右方 B. a在b的左方 C. a是b的祖先 D. a是b的子孙

4、设一棵二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树先序遍历序列为()。

A. adbce B. decab C. debac D. abcde 5、在一棵具有5层的满二叉树中结点总数为(A)。 A. 31 B. 32 C. 33 D. 16

6、由二叉树的前序和后序遍历序列( B )惟一确定这棵二叉树。

A. 能 B. 不能

7、某二叉树的中序序列为ABCDEFG,后序序列为BDCAFGE,则其左子树中结点数目为( C )。

A. 3 B. 2 C. 4 D. 5 8、若以{4,5,6,7,8}作为权值构造哈夫曼树,则该树的带权路径长度为(C)。

A. 67 B. 68 C. 69 D. 70 9、将一棵有100个结点的完全二叉树从根这一层开始,每一层上从左到右依次对结点进行编号,根结点的编号为1,则编号为49的结点的左孩子编号为( A )。

A. 98 B. 99 C. 50 D. 48 10、表达式a*(b+c)-d的后缀表达式是( B )。

A. abcd+- B. abc+*d- C. abc*+d-

D. -+*abcd

11、对某二叉树进行先序遍历的结果为ABDEFC,中序遍历的结果为DBFEAC,则后序遍历的结果是(B )。

A. DBFEAC B. DFEBCA C. BDFECA D. BDEFAC

12、树最适合用来表示( C )。

A. 有序数据元素 B. 无序数据元素 C. 元素之间具有分支层次关系的数据 D. 元素之间无联系的数据

?0?1??1??1?0???00111100?01000??10110??

01011?01101??00110??01答案:(1)图形态 (2)深度优先搜索树

32325454

3、写出下图中全部可能的拓扑排序序列。

152364 答案:1,5,2,3,6,4 1,5,6,2,3,4 5,1,2,3,6,4

5,1,6,2,3,4 5,6,1,2,3,4 4、AOE网G如下所示,求关键路径。(要求标明每个顶点的最早发生时间和最迟发生时间,并画出关键路径)

3v0v132v3v42v52324v2 答案:(1)最早发生时间和最迟发生时间: (2)关键路径:

顶点v0v1v2v3v4v5ve032668vl032668v02v3v2432v13v42v5

5、已知有向图G如下所示,根据迪杰斯特拉算法求顶点v0到其他顶点的最短距离。(给出求解过程)

v04v24v3951242v17v42

从v0到各终点的d值和最短路径的求解过程 答案: 终点 i=1 v1 v2 v3 v4 vj s 12 (v0,v1) 4 (v0,v2) 9 (v0,v3) 5 (v0,v4) v2 {v0,v2} i=2 12 (v0,v1) 8 (v0,v2,v3) 5 (v0,v4) v4 {v0,v4} i=3 7 (v0,v4,v1) 7 (v0,v4,v3) v1 {v0,v4,v1} i=4 7 (v0,v4,v3) v3 {v0,v4,v3} 6、已知图G如下所示,根据Prim算法,构造最小生成树。(要求给出生成过程)

v08v2242v6v3756v448v17v58v7 答案:prim算法求最小生成树如下:

v0v06v44v57v6v22v06v44v57v6v22v06v44v5v32v67v22v06v44v5v32v67v06v45v7v224v5v327v6v06v45v74v17v56v4

7、已知有向图如下所示,请写出该图所有的拓扑序列。

v2v3v1v4v5v8v6v7

答案:拓扑排序如下:

v1, v2, v4, v6, v5, v3, v7, v8 v1, v2, v4, v6, v5, v7, v3, v8

v1, v2, v6, v4, v5, v3, v7, v8 v1, v2, v6, v4, v5, v7, v3, v8 v1, v6, v2, v4, v5, v3, v7, v8 v1, v6, v2, v4, v5, v7, v3, v8 8、如下图所示的AOE网,求:

(1)求事件的最早开始时间ve和最迟开始时间vl;

事件 1 2 3 4 5 6 7 8 9 Ve Vl V2a1a416a24a35V4a62V6V3a94a51V5a79a87V8a114V9汇点 V7 (2)求出关键路径; a102V1源点

答案:(1)求ve和vl (2)关键路径

事件vevl100*266*346458577*671071616*81414*91818*v16v21v57v849v72v9如下所示的有向图,回答下面问题:

v1v2

(1)该图是强连通的吗?若不是,给出强连通分量。 (2)请给出图的邻接矩阵和邻接表表示。

答案:(1) 是强连通图 (2) 邻接矩阵和邻接表为:

0010100001011000v1v2v3v4v2v3v1v3v4v4v3

??112610??1?89????9、已知图G的邻接矩阵A=?128??2?,试画出它所表示的图G,并根据Prim算

???69??4???10?24???法求出图的的最小生成树(给出生成过程)。 答案:

(1)图形态: (2)prim算法求最小生成树:

v112102v518v34v2v11v2v118v2v118v324v29v4v118v3v22v5v3v5v4

10、如下图所示的AOV网,写出其中三种拓扑排序序列。

v0v2v1v3v4v5v6v7

11、已知图G如下,根据克鲁斯卡尔算法求图G的一棵最小生成树。(要求给出构造过程)

答案:kruskal算法的最小生成树

B2B2D3B2D3B2A4D3FFKF3KF3CKHHB2A4D3B25A4D3B25A45D3F3C4KF3C4KF3C4KHEHEHE

12、已知图G如下所示,求从顶点a到其余各顶点的最短路径。(给出求解过程)

b 6 a 3 c 答案: 终点 b c d e f vj S 6 (a,b) 3 (a,c) ? ? ? c {a,c} 2 5 d 3 2 5 最短路径求解过程 5 (a,c,b) 6 (a,c,d) 7 (a,c,e) ? b {a,c,b} 6 (a,c,d) 7 (a,c,e) ? d {a,c,d} 7 (a,c,e) 9 (a,c,d,f) e {a,c,e} 9 (a,c,d,f) f {a,c,d,f} 3 f 4 e 第九章 查找

一、选择题

1、已知一个有序表为(11,22,33,44,55,66,77,88,99),则折半查找55需要比较( A )次。

A. 1 B. 2 C. 3 D. 4 2、有一组关键字序列{13,16,6,34,32,98,73,1,27},哈希表的表长为13,哈希函数为H(key)=key MOD 13,冲突解决的办法为链地址法,请构造哈希表(用图表示)。 3、解决哈希冲突的主要方法有()。

A. 数字分析法、除余法、平方取中法 B. 数字分析法、除余法、线性探测法

C. 数字分析法、线性探测法、再哈希法 D. 线性探测法、再哈希法、链地址法

4、在一棵深度为h的具有n个元素的二叉排序树中,查找所有元素的最长查找长度为()。

A. n B. log2n C. (h+1)/2 D. h 5、已知表长为25的哈希表,用除留取余法,按公式H(key)=key MOD p 建立哈希表,则p应取()为宜。

A. 23 B.24 C. 25 D. 26 6、设哈希表长m=14,哈希函数H(key)=key MOD 11。表中已有4个结点:

addr(15)=4,addr(38)=5,addr(61)=6,addr(84)=7 其余地址为空,如用二次探测再散列处理冲突,则关键字为49的地址为( A )。

A.8 B. 3 C. 5 D. 9 7、在散列查找中,平均查找长度主要与( C)有关。

A. 散列表长度 B.散列元素个数 C. 装填因子 D. 处理冲突方

8、根据一组记录(56,42,50,64,48)依次插入结点生成一棵AVL树,当插入到值为的结点时需要进行旋转调整。 9、m阶B-树中的m是指()。

A. 每个结点至少具有m棵子树 B. 每个结点最多具有m棵子树

C. 分支结点中包含的关键字的个数 D. m阶B-树的深度 10、一个待散列的线性表为k={18,25,63,50,42,32,9},散列函数为H(k)=k MOD 9,与18发生冲突的元素有()个。

A. 1 B. 2 C. 3 D. 4 11、在对查找表的查找过程中,若被查找的数据元素不存在,则把该数据元素插到集合中,这种方式主要适合于()。

A.静态查找表 B. 动态查找表 C. 静态查找表和动态查找表 D. 两种表都不适合

12、有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当折半查找值为82的结点时,( B )次比较后查找成功。

A. 1 B. 4 C. 2 D. 8 13、在各种查找方法中,平均查找承担与结点个数n无关的查找方法是( C )。

A. 顺序查找 B. 折半查找 C. 哈希查找 D. 分块查找 14、下列二叉树中,不平衡的二叉树是(C)。 .

15、对一棵二叉排序树按( B)遍历,可得到结点值从小到大的排列序列。

A. 先序 B.中序 C.后序 D.层次 16、解决散列法中出现的冲突问题常采用的方法是(D )。

A. 数字分析法、除余法、平方取中法 B.数字分析法、除余法、线性探测法

C. 数字分析法、线性探测法、多重散列法 D. 线性探测法、多重散列法、链地址法

17、对线性表进行折半查找时,要求线性表必须( C )。

A. 以顺序方式存储 B. 以链接方式存储 C. 以顺序方式存储,且结点按关键字有序排序 D. 以链接方式存储,且结点按关键字有序排序 二、填空题

1、在散列函数H(key)=key%p中,p应取。

2、已知有序表为(12,18,24,35,47,50,62,83,90,115,134),当用折半查找90时,需进行 2 次查找可确定成功。

3、具有相同函数值的关键字对哈希函数来说称为。

4、在一棵二叉排序树上实施遍历后,其关键字序列是一个有序表。

5、在散列存储中,装填因子α的值越大,则存取元素时发生冲突的可能性就越大;α值越

小,则存取元素发生冲突的可能性就越小。 三、判断题

(×)1、折半查找只适用于有序表,包括有序的顺序表和链表。

()2、二叉排序树的任意一棵子树中,关键字最小的结点必无左孩子,关键字最大的结点必无右孩子。

()3、哈希表的查找效率主要取决于哈希表造表时所选取的哈希函数和处理冲突的方法。 ()4、平衡二叉树是指左右子树的高度差的绝对值不大于1的二叉树。

(√)5、AVL是一棵二叉树,其树上任一结点的平衡因子的绝对值不大于1。 四、综合题

1、选取哈希函数H(k)=(k)MOD 11。用二次探测再散列处理冲突,试在0-10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈希表,并求等概率情况下查找成功时的平均查找长度。 答案:(1)表形态:

022110112461313245673038411953110

(2)ASL:ASL(7)=(1*5+2*1+3*1)/7=(5+2+3)/7=10/7

2、设哈希表HT表长m为13,哈希函数为H(k)=k MOD m,给定的关键值序列为{19,14,23,10,68,20,84,27,55,11}。试求出用线性探测法解决冲突时所构造的哈希表,并求出在等概率的情况下查找成功的平均查找长度ASL。 答案:(1)表形态:

0114122723681455256191720188439102311110212112

(2)平均查找长度:ASL(10)=(1*5+2*4+3*1)/10=1.6

3、设散列表容量为7(散列地址空间0..6),给定表(30,36,47,52,34),散列函数H(K)=K mod 6,采用线性探测法解决冲突,要求: (1)构造散列表;

(2)求查找数34需要比较的次数。 答案:(1)表形态:

0301126223452154716343

(2)查找34 的比较次数:3

4、已知下面二叉排序树的各结点的值依次为1-9,请标出各结点的值。

答案:

5196162738

5、若依次输入序列{62,68,30,61,25,14,53,47,90,84}中的元素,生成一棵二叉排序树。画出生成后的二叉排序树(不需画出生成过程)。

6、设有一组关键字{19,1,23,14,55,20,84,27,68,11,10,77},采用哈希函数

H(key)=key MOD 13,采用开放地址法的二次探测再散列方法解决冲突,试在0-18的散列空间中对关键字序列构造哈希表,画出哈希表,并求其查找成功时的平均查找长度。 7、已知关键字序列{11,2,13,26,5,18,4,9},设哈希表表长为16,哈希函数H(key)=key MOD 13,处理冲突的方法为线性探测法,请给出哈希表,并计算在等概率的条件下的平均查找长度。

8、设散列表的长度为m=13,散列函数为H(k)=k MOD m,给定的关键码序列为19,14,23,1,68,20,84,27,55,11,13,7,试写出用线性探查法解决冲突时所构造的散列表。

答案:表形态:

01311141212368142745553619172018843973102311111112

9、依次读入给定的整数序列{7,16,4,8,20,9,6,18,5},构造一棵二叉排序树,并计算在等概率情况下该二叉排序树的平均查找长度ASL。(要求给出构造过程)

10、设有一组关键字(19,1,23,14,55,20,84,27,68,11,10,77),采用哈希函数H(key)=key,采用二次探测再散列的方法解决冲突,试在0-18的散列地址空间中对该关键字序列构造哈希表。

答案:

027311121423551468258436191720189103102311111112771131415161718

第十章 内部排序

一、选择题

1、若需要在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。

A. 快速排序 B. 堆排序 C. 归并排序 D. 直接插入排序 2、下列排序方法中()方法是不稳定的。

A. 冒泡排序 B.选择排序 C. 堆排序 D. 直接插入排序

3、一个序列中有10000个元素,若只想得到其中前10个最小元素,则最好采用()方法。

A. 快速排序 B.堆排序 C.插入排序 D.归并排序 4、一组待排序序列为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。

A. 79,46,56,38,40,80 B. 84,79,56,38,40,46 C. 84,79,56,46,40,38 D. 84,56,79,40,46,38 5、快速排序方法在()情况下最不利于发挥其长处。

A. 要排序的数据量太大 B.要排序的数据中有多个相同值 C. 要排序的数据已基本有序 D. 要排序的数据个数为奇数

6、排序时扫描待排序记录序列,顺次比较相邻的两个元素的大小,逆序时就交换位置,这是()排序的基本思想。

A. 堆排序 B. 直接插入排序 C. 快速排序 D. 冒泡排序 7、在任何情况下,时间复杂度均为O(nlogn)的不稳定的排序方法是()。 A.直接插入 B. 快速排序 C. 堆排序 D. 归并排序 8、如果将所有中国人按照生日来排序,则使用()算法最快。

A. 归并排序 B.希尔排序 C.快速排序 D.基数排序 9、在对n个元素的序列进行排序时,堆排序所需要的附加存储空间是()。

A. O(log2n) B. O(1) C. O(n) D. O(nlog2n) 10、排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为()。

A. 希尔排序 B. 冒泡排序 C. 插入排序 D.选择排序 11、一组记录的的序列未(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。

A. 79,46,56,38,40,80 B. 84,79,56,38,40,46 C. 84,79,56,46,40,38 D. 84,56,79,40,46,38 12、用某种排序方法对线性表( 25,84,21,47,15,27,68,35,20)进行排序时,元素序列的变化情况如下:

⑴ 25,84,21,47,15,27,68,35,20 ⑵ 20,15,21,25,47,27,68,35,84 ⑶ 15,20,21,25,35,27,47,68,84 ⑷ 15,20,21,25,27,35,47,68,84 则所采用的排序方法是()。 A. 选择排序 B. 希尔排序 C. 归并排序 D. 快速排序 13、设有1024个无序的元素,希望用最快的速度挑选出其中前5个最大的元素,最好选用()。 A.冒泡排序 B. 选择排序 C.快速排序 D.堆排序 14、下列排序方法中,平均时间性能为O(nlogn)且空间性能最好的是()。

A. 快速排序 B.堆排序 C. 归并排序 D. 基数排序

15、希尔排序的增量序列必须是()。

A.递增的 B. 递减的 C.随机的 D.非递减的

二、填空题

1、在插入和选择排序中,若初始数据基本正序,则选用,若初始数据基本反序,则选用。

答案:递增排列 递减排列

2、在插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序和基数排序中,排序是不稳定的有。

三、判断题

1、直接选择排序是一种稳定的排序方法。?

2、快速排序在所有排序方法中最快,而且所需附加空间也最少。? 3、直接插入排序是不稳定的排序方法。? 4、选择排序是一种不稳定的排序方法。

四、程序分析题

五、综合题

1、写出用直接插入排序将关键字序列{54,23,89,48,64,50,25,90,34}排序过程的每一趟结果。

答案:初始: 54,23,89,48,64,50,25,90,34

1:(23,54),89,48,64,50,25,90,34 2:(23,54,89),48,64,50,25,90,34 3:(23,48,54,89),64,50,25,90,34 4:(23,48,54,64,89),50,25,90,34 5:(23,48,50,54,64,89),25,90,34 6:(23,25,48,50,54,64,89),90,34 7:(23,25,48,50,54,64,89,90),34 8:(23,25,48,50,54,64,89,90,34)

2、设待排序序列为{10,18,4,3,6,12,1,9,15,8}请写出希尔排序每一趟的结果。增量序列为5,3,2,1。

答案:初始: 10,18,4,3,6,12,1,9,15,8

d=5: 10,1,4,3,6,12,18,9,15,8 d=3: 3,1,4,8,6,12,10,9,15,18 d=2: 3,1,4,8,6,9,10,12,15,18 d=1: 1,3,4,6,8,9,10,12,15,18

3、已知关键字序列{418,347,289,110,505,333,984,693,177},按递增排序,求初始堆(画出初始堆的状态)。

答案:418,347,289,110,505,333,984,693,177

418984347289693418110505333984347505333289693177110177

4、有一关键字序列(265,301,751,129,937,863,742,694,076,438),写出希尔排序的每趟排序结果。(取增量为5,3,1) 答案:

初始: 265,301,751,129,937,863,742,694,076,438 d=5: 265,301,694,076,438,863,742,751,129,937 d=3: 076,301,129,265,438,694,742,751,863,937 d=1: 076,129,265,301,438,694,742,751,863,937

5、对于直接插入排序,希尔排序,冒泡排序,快速排序,直接选择排序,堆排序和归并排序等排序方法,分别写出:

(1)平均时间复杂度低于O(n2)的排序方法; (2)所需辅助空间最多的排序方法;

答案:(1) 希尔、快速、堆、归并 (2) 归并

6、对关键子序列(72,87,61,23,94,16,05,58)进行堆排序,使之按关键字递减次序排列(最小堆),请写出排序过程中得到的初始堆和前三趟的序列状态。 答案:

初始堆7287235994166105875923947205166105592394728716610559239472第1趟166187第2趟872359059472611605875994722361160587599423726116第3趟5972870594236116

d=5: 10,1,4,3,6,12,18,9,15,8 d=3: 3,1,4,8,6,12,10,9,15,18 d=2: 3,1,4,8,6,9,10,12,15,18 d=1: 1,3,4,6,8,9,10,12,15,18

3、已知关键字序列{418,347,289,110,505,333,984,693,177},按递增排序,求初始堆(画出初始堆的状态)。

答案:418,347,289,110,505,333,984,693,177

418984347289693418110505333984347505333289693177110177

4、有一关键字序列(265,301,751,129,937,863,742,694,076,438),写出希尔排序的每趟排序结果。(取增量为5,3,1) 答案:

初始: 265,301,751,129,937,863,742,694,076,438 d=5: 265,301,694,076,438,863,742,751,129,937 d=3: 076,301,129,265,438,694,742,751,863,937 d=1: 076,129,265,301,438,694,742,751,863,937

5、对于直接插入排序,希尔排序,冒泡排序,快速排序,直接选择排序,堆排序和归并排序等排序方法,分别写出:

(1)平均时间复杂度低于O(n2)的排序方法; (2)所需辅助空间最多的排序方法;

答案:(1) 希尔、快速、堆、归并 (2) 归并

6、对关键子序列(72,87,61,23,94,16,05,58)进行堆排序,使之按关键字递减次序排列(最小堆),请写出排序过程中得到的初始堆和前三趟的序列状态。 答案:

初始堆7287235994166105875923947205166105592394728716610559239472第1趟166187第2趟872359059472611605875994722361160587599423726116第3趟5972870594236116

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

Top