第2章测试题(1)_第1页
第2章测试题(1)_第2页
第2章测试题(1)_第3页
第2章测试题(1)_第4页
第2章测试题(1)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 选择题1从一个具有n个结点的单链表中查找值为x的结点,在查找成功情况下,需平均比较( d)n个节点,单链表。如果x等于第一个元素的值。则要比较1次 x等于第二个元素的值,则要比较2次 最不巧:x值刚好等于第n个元素,则要比较x次所以总次数是1+2+3+n-1+n=(n+1)*n/2所以平均需要:(n+1)/2次。顺序数组可以用折半查找,需要 log2为低N 次个结点。AnBn/2C(n-1)/2D(n+1)/22(a )插入、删除速度快,但查找速度慢。链表只需要修改前驱或者前驱与后继的指针就可以,查找时链表需要顺序查找,并且由于读取指针耗费时间A链表B顺序表C有序顺序表D上述三项无法比较

2、3若希望从链表中快速确定一个结点的前驱,则链表最好采用( c)方式。双链表在结点前驱后继查找上的时间复杂度是O(1)A单链表B循环单链表C双向链表D任意4在一个单链表中,若删除p所指结点的后继结点,则执行(d)。p->next指向p指针的后继结点,p->next->next指向后继结点的后继结点。Ap->next=p->nextBp=p->next->nextCp=p->next;p->next=p->next->next;Dp->next=p->next->next5带头结点的单链表head为空的判定条件是(

3、b )。Ahead=NULLBhead->next=NULLChead->next=headDhead!=NULL6在循环双向链表的p所指结点之后插入s所指结点的操作是( d)。Ap->next=s;s->prior=p;p->next->prior=s;s->next=p->next;Bp->next=s;p->next->prior=s;s->prior=p;s->next=p->next;Cs->prior=p;s->next=p->next;p->next=s;p->nex

4、t->prior=s;Ds->prior=p;s->next=p->next;p->next->prior=s;p->next=s;7若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用( a)存储方式最节省时间。想要存取任一指定序号的元素,链表实现这个功能的代价很大本来顺序表的弱点在于插入和删除元素,但是题目要求只最后进行插入和删除运算,所有顺序表是最好的选择!A顺序表B双向链表C带头结点的双循环链表D单循环链表二、 填空题1对于采用顺序存储结构的线性表,当随机插入或删除一个数据元素时,平均约需移动表中 一半 元素。2当对

5、一个线性表经常进行的是插入和删除操作时,采用 链式 存储结构为宜。因为采用链式结构存储线性表,插入和删除操作需要从头结点起查找被插入或删除结点的前驱结点,并修改这些结点的指针域,查找过程平均移动指针域为表长的一半3当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用 顺序 存储结构。它的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示4在一个长度为n的顺序存储结构的线性表中,向第i个元素(1in+1)之前插入一个新元素时,需向后移动 n-i+1 个元素。这道题,可以进行举例来验证,比如要是在第一个元素

6、前插入元素,需要移动n个元素。i=1时,需要移动n个,进行验证5从长度是n的采用顺序存储结构的线性表中删除第i个元素(1in),需向前移动 n-i 个元素。6对于长度是n的顺序存储结构的线性表,插入或删除元素的时间复杂度为 0(n) 。7在具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是 0(n) 。因为单链表保存的信息只有表头 如果要在特定位置插入一个节点 需要先从表头一路找到那个节点 这个过程是O(n)的8在双向链表中,每个结点共有两个指针域,一个指向 前驱 结点,另一个则指向 后继 结点。三、 判断题1链表中的头结点仅起到标识的作用。( f)头结点的数据域还可以存储一些必

7、要的数据,如表长。2顺序存储结构的主要缺点是不利于插入和删除操作。( t)3线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。( f)结点内部空间是连续的。4顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。( f)还有其他比较参数。如空间利用率,难易程度,存取快捷等。5对任何数据结构链表存储结构一定优于顺序存储结构。( f)还有其他比较参数。如空间利用率,难易程度,存取快捷等。6顺序存储方式只能用于存储线性结构。( f)也可用于树、二叉树等7循环链表不是线性表。( f)8为了很方便地插入和删除数据,可以使用双向链表存放数据。( t)9线性表的特点是每个元素都有一个前驱和

8、一个后继。( f)第一个结点无前驱,最后一个结点无后继。10取线性表的第i个元素的时间与i的大小有关。( f)看线性表的存储机构,链表有关,顺序表无关。四、 应用题1线性表有两种存储结构:一是顺序表,二是链式表。试问:如果有n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用哪种存储结构?为什么?链表,理由是链表能够高效的执行插入删除操作,适用于元素变化较多的情形若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结构?为什么?顺序存储结构。顺序表可以随机存取,时间复杂度为O(1)2线性表的顺

9、序存储结构具有三个弱点:其一,在进行插入或删除操作时,需移动大量元素;其二,由于难以估计,必须预先分配较大的空间,往往使存储空间不能得到充分的利用。线性表的链式存储结构是否一定都能克服以上缺点,试讨论之。链式存储结构一般说克服了顺序存储结构的三个弱点。首先,插入、删除不需移动元素,只修改指针,时间复杂度为O(1);其次,不需要预先分配空间,可根据需要动态申请空间;其三,表容量只受可用内存空间的限制。其缺点是因为指针增加了空间开销,当空间不允许时,就不能克服顺序存储的缺点。3线性表(a1,a2,.,an)用顺序映射表示时,ai和ai+1(1<=i<n)的物理位置相邻吗?链接表示时呢?

10、顺序映射时,ai与ai+1的物理位置相邻;链表表示时ai与ai+1的物理位置不要求相邻。4试述头结点,首元结点,头指针这三个概念的区别。在线性表的链式存储结构中,头指针指链表的指针,若链表有头结点则是链表的头结点的指针,头指针具有标识作用,故常用头指针冠以链表的名字。头结点是为了操作的统一、方便而设立的,放在第一元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等),有头结点后,对在第一元素结点前插入结点和删除第一结点,其操作与对其它结点的操作统一了。而且无论链表是否为空,头指针均不为空。首元结点也就是第一元素结点,它是头结点后边的第一个结点。5在单链表和双向链表

11、中,能否从当前结点出发访问到任何一个结点?在单链表中不能从任意结点(若结点不是第一结点)出发访问到任何一个结点,链表只能从头指针开始,访问到链表中每个结点。在双链表中求前驱和后继都容易,从任何一个结点向前到第一结点,向后到最后结点,可以访问到任何一个结点。6如何通过改链表的方法,把一个单向链表变成一个与原来链接方向相反的单向链表?设该链表带头结点,将头结点摘下,并将其指针域置空,然后从第一元素节点开始,直到最后一个结点为止,依次前插入头结点的后面,则实现了链表的逆置五、 算法设计题1 已知单链表L,写一个算法,删除其中的重复结点。void delete(LinkList &L)Link

12、Node *p,*q,*s; ElemType e; for(p=L->next;p;p=p->next)  e=p->data;for(q=p->next;q;)  if(e=q->data) s=q; p->next=q->next; q=q->next; free(s);else q=q->next;  2 将数据元素x插入到递增有序的顺序表的适当位置,使插入后的顺序表仍为递增有序。struct list *p, *q, *s, *head; p = head; while(

13、p != NULL) if(x > p->data) q = p; p = p->next; else s = (struct list*)malloc(sizeof(struct list); s->data = x; q->next = s; s->next = p; 3 假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。#include"stdio.h" #include"malloc.h"

14、 struct list int data; struct list *next; ; struct list *head1,*head2,*p1,*p2,*q1,*q2; void main() int n=0; void unionlist(); p1=q1=(struct list*)malloc(sizeof(struct list); printf("请输入第一个链表的信息n"); scanf("%d",&p1->data); while(p1->data!=0) n=n+1; if(n=1) head1=q1; else

15、q1->next=p1; q1=p1; p1=(struct list*)malloc(sizeof(struct list); scanf("%d",&p1->data); q1->next=NULL; n=0; p2=q2=(struct list*)malloc(sizeof(struct list); printf("请输入第二个链表的信息n"); scanf("%d",&p2->data); while(p2->data!=0) n=n+1; if(n=1) head2=q2;

16、else q2->next=p2; q2=p2; p2=(struct list*)malloc(sizeof(struct list); scanf("%d",&p2->data); q2->next=NULL; unionlist(); void unionlist() struct list *head,*p; int i=0; p1=head1; p2=head2; head=p=(struct list*)malloc(sizeof(struct list); p->data=0; while(p1 && p2) i

17、f(p1->data<=p2->data) p->next=p1; p=p1; p1=p1->next; else p->next=p2; p=p2; p2=p2->next; p->next=p1?p1:p2; p=head; printf("合并后的链表为如下:n"); while(p) i=i+1; if(i=1) p=p->next; printf("%3d",p->data); p=p->next; printf("n"); free(head1); free

18、(head2); 4 已知递增有序的两个单链表A,B分别存储了一个集合。设计算法实现求两个集合的并集的运算A=AB。/无头链表 /#define data data_int #include "head.h" struct LNode / char data10; int data; struct LNode *next; ; typedef struct LNode * LinkList; void InitList_L(LinkList &L)/链表构造函数 L=new LNode; L->next=NULL; void PrintList_L(LinkL

19、ist &H)/链表显示函数 LinkList L=H; L=L->next; while(1) cout<<"data value is "<<L->data<<endl; L=L->next; if (L=NULL) return; void Insert_L(LinkList &H,int n=0)/插入链表 LinkList L=H; LinkList p=L; int i=0; if (n=0) n=1; while(p->next!=NULL) p=p->next; n+; els

20、e if (n<1) cout<<"error"<<endl; return; for (i=0;i<n-1;i+) if (L->next=NULL) cout<<"error"<<endl; return; L=L->next; p=new LNode; cout<<"please input a value:" cin>>p->data; p->next=L->next; L->next=p; LinkList bing_LinkList(LinkList a,LinkList b) LinkList c; LinkList nc; LinkList t; InitList_L(c); nc=c; a=a->next; while (a!=NULL)/复制a到c t=new LNode; t->data=a->data; nc->next=t; t-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论