数据结构期中试题(答案)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在以下题目中任意选择做

1.求下列程序段的时间复杂度(每小题5分)

(1)for(i=0;i

for(j=0; j

for(k=0; k

x=x+delta;

O(n3)

(2)i=1;

while (i

n)

O(log

2

(3) i=n*n;

while (i!=1) i=i/2;

n2)

O(log

2

2.按增长率从小到大顺序排列以下函数(5分)

n, n-n3+7n5, nlogn, 2n/2, n3, logn, n1/2+logn, (3/2)n, n!, n2+logn 答: logn,n1/2+logn,n, nlogn, n2+logn, n3, n-n3+7n5, 2n/2, (3/2)n, n!

3.问答题

(1).对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度分别为多少?(3分) 答:访问节点复杂度为O(1), 增加、删除结点的时间复杂度为O(n);

(2).若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表

中的元素,那么应采用哪种存储结构?为什么?(5分)

答:采用顺序存储结构.因为顺序存储存取操作复杂度为O(1),效率高.

(3).双向链表中有两个指针域,llink和rlink,分别指回前驱及后继,设p指向链表中的

一个结点,q指向一待插入结点,现要求在p前插入q,请写出其插入操作序列。(6分)答:q->rlink=p; q->llink=p->llink, p->llink->rlink=q;p->llink=q;

(这是答案之一,还可以有其它答案)

(4).在单链表和双向链表中,能否从当前结点出发访问到任何一个结点? (3分)

答:单链表不行,双向链表可以。

(5).给出循环队列中元素个数的计算式(设队最大长度为N,队首指针FRONT,队尾指针REAR)。(5分)

答:(R-F+N)% N

(6). 若串S1=”ABCDEFGHIJK”, S2=”9898” ,S3=”###”执行

replace(S1,0,substr(S1,length(S2),length(S3)),S3)后,其结果是什么?(5分)答: ABCD###HIJK

(7).假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个

存储单元,基地址为10,请求出Loc[5,5]的值。(5分)

答:Loc(5,5)=10+((5-1)*100+(5-1))*2=818

(8). 有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是多少?(5分)

非0元素占10*3*2=60字节;控制结构占3*2=6字节。共66字节。

4.填空与选择

(1).以下程序采用链表合并的方法,将两个已排序的单链表合并成一个链表而不改变其排序性(升序),这里两链表的头指针分别为p和q.(每空3分)

void mergelink(SLNode *p, SLNode *q)

{

SLNode *h,*r;

(1)_h=(SLNode *)malloc(sizeof(SLNode);_____

h->next= NULL;

r=h;

while((p!=NULL)&& (q!=NULL)){

if (p->data<=q->data){

(2)r->next=p___; r=p; p=p->next;

}

else{

(3)r->next=q____; r=q; q=q->next;

}

}

if(p==NULL) r->next=q;

(4)if(q==NULL) r->next=p____;

}

(以下选择题每题4分)

(2).一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是(B )。

A. 2 3 4 1 5

B. 5 4 1 3 2

C. 2 3 1 4 5

D. 1 5 4 3 2

(3) 输入序列为ABC,可以变为CBA时,经过的栈操作为( B )

A. push,pop,push,pop,push,pop

B. push,push,push,pop,pop,pop

C. push,push,pop,pop,push,pop

D. push,pop,push,push,pop,pop

(4) 栈和队列的共同点是( C )。

A. 都是先进先出

B. 都是先进后出

C. 只允许在端点处插入和删除元素

D. 没有共同点

(5)对稀疏矩阵进行压缩存储目的是( C )

A.便于进行矩阵运算 B.便于输入和输出 C.节省存储空间 D.降低运算的时间复杂度

5.程序设计题 (程序题主要看其思路是否正确)

(1)已知两个单链表A和B,其头指针分别为heada和headb,编写一个函数从单链表A中

删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前。(15分)

int DelInsert(SLNode *heada,SLNode *headb,int i,int j,len)

{

SLNode *p,*q,*u;

int k;

if(i<1 || len<1 || j<1)

{ printf(“参数错误\n”);

Return 0;}

p=heada;∥

k=0;

while(p!=null && k

{k++;p=p->next;}

if(p==null){printf(“给的%d太大\n”,i);return 0;}

q=p->next;

k=0;

while(q!=null && k

{k++;u=q;q=q->next;free(u);} ∥删除结点,后移指针。

if(k

p->next=q;∥A链表删除了len个元素。

if (heada->next!=null) ∥heada->next=null说明链表中结点均已删除,无需往B表插入

{

while(p->next!=null)p= p->next;∥找A的尾结点。

q=headb;∥q为链表B的工作指针。

k=0;∥计数

while(q!=null && k

{k++;q= q->next;} ∥查找成功时,q指向第j-1个结点

if(q==null){printf(“给的%d太大\n”,j);return 0;}

p->next=q->next;∥将A链表链入

q->next=heada->next;∥A的第一元素结点链在B的第j-1个结点之后}

free(heada);∥释放A表头结点。

}∥算法结束。

(2) 利用两个栈sl,s2模拟一个队列时,编程实现用栈的运算实现队列的插入,删除以及判队空运算。(15分)

(1) int enqueue(SeqStack *s1, SeqStack *s2,elemtp x)

//s1是容量为n的栈,栈中元素类型是elemtp。本算法将x入队列,若入队列成功返回1,否则返回0。

{if(s1->top==n && StackNotEmpty(s2))

{printf(“栈满”);return(0);} //s1满s2非空,这时s1不能再入栈。

if(s1->top==n && !StackNotEmpty(s2)) //若s2为空,先将s1退栈,元素再

相关文档
最新文档