当前位置:文档之家› 广州大学松田学院2数据结构复习题-线性表-参考答案

广州大学松田学院2数据结构复习题-线性表-参考答案

2数据结构复习题(线性表)一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)(×)(1)线性表的链式存储结构优于顺序存储。

(×)(2)链表的每个结点都恰好包含一个指针域。

(√)(3)在线性表的链式存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。

(×)(4)顺序存储方式的优点是存储密度大,插入、删除效率高。

(×)(5)线性链表的删除算法简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。

(×)(6)顺序表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

(√)(7)线性表链式存储的特点是可以用一组任意的存储单元存储表中的数据元素。

(√)(8)线性表采用顺序存储,必须占用一片连续的存储单元。

(×)(9)顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。

(ㄨ)(10)插入和删除操作是数据结构中最基本的两种操作,所以这两种操作在数组中也经常使用。

二.填空题(1)顺序表中逻辑上相邻的元素在物理位置上必须相连。

(2)线性表中结点的集合是有限的,结点间的关系是一对一关系。

(3)顺序表相对于链表的优点是:节省存储和随机存取。

(4)链表相对于顺序表的优点是:插入、删除方便。

(5)采用顺序存储结构的线性表叫顺序表。

(6)(7)链表相对于顺序表的优点是插入、删除方便;缺点是存储密度(8)在双链表中要删除已知结点*P(9)在单链表中要在已知结点*P之前插入一个新结点,需找到*P的直接前趋结点的地址,其查找的时间复杂度为 O(n) 。

(10)单链表中需知道头指针才能遍历整个链表。

(11)性表中第一个结点没有直接前趋,称为开始结点。

(12)在一个长度为n的顺序表中删除第i个元素,要移动n-i 个元素。

(13)在一个长度为n的顺序表中,如果要在第i个元素前插入一个元素,要后移n- i +1 个元素。

(14)在无头结点的单链表中,第一个结点的地址存放在头指针中,而其它结点的存储地址存放在前趋结点的指针域中。

(15)当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快速度存取线性表中的元素时,应采用顺序存储结构。

(16)在线性表的链式存储中,元素之间的逻辑关系是通过指针决定的。

(17)在双向链表中,每个结点都有两个指针域,它们一个指向其前趋结点,另一个指向其后继结点。

(18)对一个需要经常进行插入和删除操作的线性表,采用链式存储结构为宜。

(19)双链表中,设p是指向其中待删除的结点,则需要执行的操作为:p->prior->next=p->next 。

(20)在如图所示的链表中,若在指针P所在的结点之后插入数据域值为a和b的两个结点,则可用下列两个语句: S->next->next=P->next; 和P->next=S;来实现该操作。

三.选择题(1)在具有n个结点的单链表中,实现( A )的操作,其算法的时间复杂度都是O(n)。

A.遍历链表或求链表的第i个结点B.在地址为P的结点之后插入一个结点C.删除开始结点D.删除地址为P的结点的后继结点(2)设a、b、c为三个结点,p、10、20分别代表它们的地址,则如下的存储结构称为( B )。

A.循环链表 B.单链表C.双向循环链表 D.双向链表(3)单链表的存储密度( C )。

A.大于1 B.等于1 C.小于1 D.不能确定(4)已知一个顺序存储的线性表,设每个结点占m个存储单元,若第一个结点的地址为B,则第i个结点的地址为( A )。

A. B+(i-1)*m B.B+i*m C. B-i*m D. B+(i+1)*m(5)在有n个结点的顺序表上做插入、删除结点运算的时间复杂度为( B )。

A.O(1) B.O(n)C.O(n2) D.O(log2n)(6)设Llink、Rlink分别为循环双链表结点的左指针和右指针,则指针P所指的元素是双循环链表L的尾元素的条件是( D )。

A.P== L B.P->Llink== L C.P== NULL D.P->Rlink==L(7)两个指针P和Q,分别指向单链表的两个元素,P所指元素是Q所指元素前驱的条件是( B )。

A.P->next==Q->next B.P->next== Q C.Q->next== P D.P== Q(8)用链表存储的线性表,其优点是( C )。

A.便于随机存取B.花费的存储空间比顺序表少C.便于插入和删除D.数据元素的物理顺序与逻辑顺序相同(9)在单链表中,增加头结点的目的是( C )。

A.使单链表至少有一个结点B.标志表中首结点的位置C.方便运算的实现D.说明该单链表是线性表的链式存储结构(10)下面关于线性表的叙述中,错误的是( D )关系。

A.顺序表必须占一片地址连续的存储单元B.顺序表可以随机存取任一元素C.链表不必占用一片地址连续的存储单元D.链表可以随机存取任一元素(11)L是线性表,已知LengthList(L)的值是5,经DelList(L,2)运算后,LengthList(L)的值是( C )。

A.2 B.3 C.4 D.5(12)单链表的示意图如下:L指向链表Q 结点的前趋的指针是( B )。

A .LB .PC .QD .R(13)设p 为指向单循环链表上某结点的指针,则*p 的直接前驱( C )。

A .找不到B .查找时间复杂度为O (1)C .查找时间复杂度为O (n )D .查找结点的次数约为n(14)等概率情况下,在有n 个结点的顺序表上做插入结点运算,需平均移动结点的数目为( C )。

A .nB .(n-1)/2C . n/2D .(n+1)/2 (15)在下列链表中不能从当前结点出发访问到其余各结点的是( C )。

A .双向链表B .单循环链表C .单链表D .双向循环链表(16)在顺序表中,只要知道( D ),就可以求出任一结点的存储地址。

A .基地址B .结点大小C . 向量大小D .基地址和结点大小(17)在双链表中做插入运算的时间复杂度为( A )。

A .O (1)B .O (n )C .O (n 2) D .O (log 2n ) (18)链表不具备的特点是( A )。

A .随机访问B .不必事先估计存储空间C .插入删除时不需移动元素D .所需空间与线性表成正比 (19)以下关于线性表的论述,不正确的为( C )。

A .线性表中的元素可以是数字、字符、记录等不同类型B .线性顺序表中包含的元素个数不是任意的C .线性表中的每个结点都有且仅有一个直接前趋和一个直接后继D .存在这样的线性表,即表中没有任何结点 (20)在( B )的运算中,使用顺序表比链表好。

A .插入B .根据序号查找C . 删除D .根据元素查找四.下述算法的功能是什么?(1) (2)解:(1)返回结点*p 的直接前趋结点地址。

(2)交换结点*p 和结点*q (p 和q 的值不变)。

五. 程序填空1.已知线性表中的元素是无序的,并以带表头结点的单链表作存储。

试写一算法,删除表中所有大于min ,小于max 的元素,试完成下列程序填空。

ListNode *Demo1(LinkList L,ListNode *p){ // L 是有头结点的单链表ListNode *q=L->next;While (q && q->next!=p)q=q->next;if (q)return q; elseError(“*p not in L”);} void Demo2(ListNode *p,ListNode *q) { // p,*q 是链表中的两个结点 DataType temp; temp=p->data; p->data=q->data; q->data=temp; }V oid delete (lklist head; datatype min, max){ q=head->next;while (p!=NULL){ if ((p->data<=min ) | | (p->data>=max ){q=p; p=p->next ; }else{ q->next=p->next ;delete (p) ;p=q->next ; }}}2.在带头结点head的单链表的结点a之后插入新元素x,试完成下列程序填空。

struct node{ elemtype data;node *next;};void lkinsert (node *head, elemtype x){ node *s, *p;s= new node ;s->data= x ;p=head->next;while (p!=NULL) && ( p->data!=a )____p=p->next ;if (p==NULL)cout<< " 不存在结点a! ";else {_____s->next=p->next______;___ p->next=s __________;}}六.程序设计题1.写一个对单循环链表进行遍历(打印每个结点的值)的算法,已知链表中任意结点的地址为P 。

2.对给定的带头结点的单链表L,编写一个删除L中值为x的结点的直接前趋结点的算法。

3.将一个顺序表中从第i个结点开始的k个结点删除。

4.已知一个单链表,编写一个函数从单链表中删除自第i个结点起的k个结点。

5.有—个单链表(不同结点的数据域值可能相同),其头指针为head,编写一个函数计算值域为x的结点个数。

6.有两个循环单链表,链头指针分别为head1和head2,编写一个函数将链表head1链接到链表head2,链接后的链表仍是循环链表。

1.解:void Show(ListNode *P){ ListNode *t=P;do{ printf ("%c",t->data);t=t->rear;}while (t!=P);}2.解:void delete(ListNode *L){ ListNode *p=L,*q;if (L->next->data==X){ printf (“值为x的结点是第一个结点,没有直接前趋结点可以删除”);return;}for (;p->next->data!=X; q=p; p=p->next); // 删除指针p所指向的结点q->next=p->next;delete p;}3.解(校对一下,或换一题)void Del(SeqList *L,int i,int k){ int j=i-1+k;for (j=0;j<k;j++){ L->data[i-1+j]=L->data[i+k-2+j];if (i+k-2+j>L->last)break;}}void Del(SeqList *L,int i,int k){ int j=i-1+k;if (j>L->last){ printf(“超出范围!”)return;}for (j=0;j<L->last-i;j++)L->data[i-1+j]=L->data[i+k-2+j];}4.解:void Del(node *head,int i,int k){node *p,*q;int j;if (i==1)for (j=1;j<=k;j++) // 删除前k个元素{p=head; // p指向要删除的结点head=head->next;delete p;}else{p=head;for (j=1;j<=i-2;j++)p=p->next; // p指向要删除的结点的前一个结点for (j=1;j<=k;j++){q=p->next; // q 指向要删除的结点p->next=q->next;delete q;}}} 佟1985.解:本题是遍历单链表的每个结点,每遇到一个结点,结点个数加1,结点个数存储在变量n中。

相关主题