数据结构期中试题(答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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退栈,元素再