第2章 线性表

第2章 线性表
第2章 线性表

第2章线性表

班级学号__________-姓名

一、判断正误

(×)1. 链表的每个结点中都恰好包含一个指针。

链表中的结点可含多个指针域,分别存放多个指针。例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继结点的指针。

(×)2. 链表的物理存储结构具有同链表一样的顺序。

链表的存储结构特点是无序,而链表的示意图有序。

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

链表的结点不会移动,只是指针内容改变。

(×)4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存放记录型数据。

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

正好说反了。顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜”

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

前一半正确,但后一半说法错误,那是链式存储的优点。顺序存储方式插入、删除运算效率较低,在表长为n的顺序表中,插入和删除一个数据元素,平均需移动表长一半个数的数据元素。

(×)7. 线性表在物理存储空间中也一定是连续的。

线性表有两种存储方式,顺序存储和链式存储。后者不要求连续存放。

(×)8. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。

线性表有两种存储方式,在顺序存储时,逻辑上相邻的元素在存储的物理位置次序上也相邻。

(×)9. 顺序存储方式只能用于存储线性结构。

顺序存储方式不仅能用于存储线性结构,还可以用来存放非线性结构,例如

完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式。(后一节介绍)

(×)10. 线性表的逻辑顺序与存储顺序总是一致的。

理由同7。链式存储就无需一致。

二、单项选择题

(C )1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:(A)存储结构(B)逻辑结构(C)顺序存储结构(D)链式存储结构( B )2. 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是(A)110 (B)108 (C)100 (D)120

( A )3. 在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是:

(A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)

(B)在第i个结点后插入一个新结点(1≤i≤n)

(C)删除第i个结点(1≤i≤n)

(D)将n个结点从小到大排序

( B )4. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动个元素(A)8 (B)63.5 (C)63 (D)7

( A )5. 链接存储的存储结构所占存储空间:

(A)分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针

(B)只有一部分,存放结点值

(C)只有一部分,存储表示结点间关系的指针

(D)分两部分,一部分存放结点值,另一部分存放结点所占单元数

( D )6. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址:

(A)必须是连续的(B)部分地址必须是连续的

(C)一定是不连续的(D)连续或不连续都可以

( B )7.线性表L在情况下适用于使用链式结构实现。

(A)需经常修改L中的结点值(B)需不断对L进行删除插入

(C)L中含有大量的结点(D)L中结点结构复杂

( C )8.单链表的存储密度

(A)大于1;(B)等于1;(C)小于1;(D)不能确定

( B )9.设a1、a2、a3为3个结点,整数P0,3,4代表地址,则如下的链式存储结构称为

P0 3 4

P0→→→

(A)循环链表(B)单链表(C)双向循环链表(D)双向链表

( B )10.下面关于线性表的叙述中,错误的是哪一个?

A.线性表采用顺序存储,必须占用一片连续的存储单元。

B.线性表采用顺序存储,便于进行插入和删除操作。

C.线性表采用链接存储,不必占用一片连续的存储单元。

D.线性表采用链接存储,便于插入和删除操作。

(C )11.线性表是具有n个________的有限序列(n>0)。

A.表元素 B.字符 C.数据元素 D.数据项

( A )12.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用______存储方式最节省时间。

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表

( D )13.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用_______存储方式最节省运算时间。

A.单链表 B.仅有头指针的单循环链表

C.双链表 D.仅有尾指针的单循环链表

(C )14. 静态链表中指针表示的是________.

A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址

(B)15. 链表不具有的特点是_________.

A.插入、删除不需要移动元素 B.可随机访问任一元素

C.不必事先估计存储空间 D.所需空间与线性长度成正比

(D)16.完成在双循环链表结点p之后插入s的操作是().

A. p^.next:=s ; s^.priou:=p; p^.next^.priou:=s ; s^.next:=p^.next;

B. p^.next^.priou:=s; p^.next:=s; s^.priou:=p; s^.next:=p^.next;

C. s^.priou:=p; s^.next:=p^.next; p^.next:=s; p^.next^.priou:=s ;

D. s^.priou:=p; s^.next:=p^.next; p^.next^.priou:=s ; p^.next:=s;

(B)17.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:()。

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

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

( B )18.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是()A.head==NULL B.head→next==NULL C.head→next==head D.head!=NULL

( A )19. 在双向链表存储结构中,删除p所指的结点时须修改指针()。

A. (p^.llink)^.rlink:=p^.rlink (p^.rlink)^.llink:=p^.llink;

B. p^.llink:=(p^.llink)^.llink (p^.llink)^.rlink:=p;

C. (p^.rlink)^.llink:=p p^.rlink:=(p^.rlink)^.rlink

D. p^.rlink:=(p^.llink)^.llink p^.llink:=(p^.rlink)^.rlink;

三、简答题

1.线性表有两种存储结构:一是顺序表,二是链表。试问:

(1)如果有 n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用哪种存储结构?为什么?

(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结构?为什么?

答案:(1)选链式存储结构。它可动态申请内存空间,不受表长度(即表中元素个数)的影响,插入、删除时间复杂度为O(1)。

(2)选顺序存储结构。顺序表可以随机存取,时间复杂度为O(1)。

2 . 在单链表中设置头结点的作用是什么?

答案:在单链表的首元结点(第一个数据元素)之前附设的结点,称为头结点,其作用是为了对单链表进行操作时,对空表和非空表的情况统一处理,对首元结点和其它结点统一处理。

四、线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表L={23,17,47,05,31},若它以链接方式存储在下列100~119号地址空间中,每个结点由数据(占2个字节)和指针(占2

^ ^

100 120

其中指针X,Y,Z的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?答:X= 116Y= 0Z= 100首址= 108末址= 112

五、编程题

1. 已知一个带头结点的单链表L,请编程求该单链表中数据元素的个数。

解:编写C程序如下(已上机通过):

全局变量及函数提前说明:

---------------------------------

#include

#include

typedef struct liuyu{int data;struct liuyu*link;}test;

liuyu *p,*q,*r,*head;

int m=sizeof(test);

void main ( ) /*第一步,从键盘输入整数,不断添加到链表*/

{int i;

head=(test*)malloc(m); /*m=sizeof(test);*/

p=head; i=0;

while (i!=-9999)

{ printf("/ninput an integer [stop by '-9999']:");

scanf("%d",&i);

p->data=i; /* input data is saved */

p->link=(test*)malloc(m); /*m=sizeof(test));*/

q=p;

p=p->link;

}

q->link=NULL; /*原先用p->link=NULL似乎太晚!*/

p=head; i=0; /*统计链表结点的个数并打印出来*/

while (p->link!=NULL)

{printf("%d",p->data);

p=p->link;

i++;

}

printf("\n node number=%d\n", i-1); /*结点的个数不包括-9999*/

}

2. 设有一带头结点的单链表,编程将链表颠倒过来,即(a1...a n)逆置为(a n...a1),要求不用另外的数组

或结点完成.

typedef struct node

{int data;∥假定结点数据域为整型。

struct node *next;

}node,*LinkedList;

LinkedList invert1(LinkedList head)/*逆置单链表*/

{ LinkedList p=head->next; /*p为工作指针*/

head->next=null;

while(p!=null)

{ r=p->next; /*暂存p的后继*/

p->next=head->next;

head->next=p;

p=r;

}

return(head);

}/*结束invert1函数*/

3.请写一个算法将顺序存储结构的线性表(a1...a n)逆置为(a n...a1),要求使用最少的附加空间。

[题目分析]顺序存储结构的线性表的逆置,只需一个变量辅助空间。算法核心是选择循环控制变量的初值和终值。

void SeqInvert(ElemType a[ ],int n)

∥a是具有n个元素用一维数组存储的线性表,本算法将其逆置。

{for(i=0;i<=(n-1)/2;i++)

{t=a[i];a[i]= a[n-1-i];a[n-1-i]=t;}

}∥算法结束

[算法讨论]算法中循环控制变量的初值和终值是关键。C中数组从下标0开始,第n个元素的下标是n-1。

因为首尾对称交换,所以控制变量的终值是线性表长度的一半。当n为偶数,“一半”恰好是

线性表长度的二分之一;若n是奇数,“一半”是小于n/2的最大整数,这时取大于1/2的最

小整数的位置上的元素,恰是线性表中间位置的元素,不需要逆置。

相关主题
相关文档
最新文档