一、判断正误
( F )1. 链表的每个结点中都恰好包含一个指针。
( F )2. 链表的物理存储结构具有同链表一样的顺序。
( F )3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动将后续各个单元向前移动。
( F )4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
( F )5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。
二、单项选择题
( A )1. 链式存储的存储结构所占存储空间:
- 分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
- 只有一部分,存放结点值
(C)只有一部分,存储表示结点间关系的指针
(D)分两部分,一部分存放结点值,另一部分存放结点所占单元数
( D )2. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址:
(A)必须是连续的 (B)部分地址必须是连续的
(C)一定是不连续的 (D)连续或不连续都可以
( B )3. 线性表L在 情况下适用于使用链式结构实现。
(A)需经常修改L中的结点值 (B)需不断对L进行删除插入
(C)L中含有大量的结点 (D)L中结点结构复杂
( C )4. 单链表的存储密度
(A)大于1; (B)等于1; (C)小于1; (D)不能确定
( B )5. 设a1、a2、a3为3个结点,整数P0,3,4代表地址,则如下的链式存储结构称为
| P0 |
|
| 3 |
|
| 4 |
|
|
P0 | à | a1 | 3 | à | a2 | 4 | à | a3 | 0 |
(A)循环链表 (B)单链表 (C)双向循环链表 (D)双向链表
( B )6.下面关于线性表的叙述中,错误的是哪一个?
A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链接存储,不必占用一片连续的存储单元。
D.线性表采用链接存储,便于插入和删除操作。
( A )7.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用______存储方式最节省时间。
A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表
( D )8.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用 _______存储方式最节省运算时间。
A.单链表 B.仅有头指针的单循环链表
C.双链表 D.仅有尾指针的单循环链表
( B )9. 链表不具有的特点是_________.
A.插入、删除不需要移动元素 B.可随机访问任一元素
C.不必事先估计存储空间 D.所需空间与线性长度成正比
( D )10.完成在双循环链表结点p之后插入s的操作是( ).
A. p^.next:=s ; s^.priou:=p; p^.next^.prior:=s ; s^.next:=p^.next;
B. p^.next^.prior:=s; p^.next:=s; s^.prior:=p; s^.next:=p^.next;
C. s^.prior:=p; s^.next:=p^.next; p^.next:=s; p^.next^.prior:=s ;
D. s^.prior:=p; s^.next:=p^.next; p^.next^.prior:=s ; p^.next:=s;
( B )11.在单链表指针为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 )12.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是( )
A.head==NULL B.head->next==NULL C.head->next==head D.head!=NULL
( A )13. 在双向链表存储结构中,删除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个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。在此情况下,应选用哪种存储结构? 为什么?
应选链式存储结构,可以动态申请内存空间,不受表长度的影响。插入、删除时间复杂度为O(1)
(2)若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采用哪种存储结构?为什么?
选择顺序存储结构,顺序表可以随机存取,时间复杂度为O(1)
2 . 在单链表中设置头结点的作用是什么?
- 便于首元结点的处理
增加了头结点后,首元结点的地址保存在头结点的指针域中,对链表的第一个数据元素的操作与其他数据元素相同,无需进行特殊处理
- 便于空表和非空表的统一处理
增加头结点后,无论链表是否为空,头指针都是指向头节点的非空指针,若为空表,头结点的指针域为空。
四、线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表L={23,17,47,05,31},若它以链接方式存储在下列100~119号地址空间中,每个结点由数据(占2个字节)和指针(占2个字节)组成,如下所示:
05 | U | 17 | X | 23 | V | 31 | Y | 47 | Z | |
^ |
|
|
|
|
|
|
|
|
| ^ |
100 |
|
|
|
|
|
|
|
|
| 120 |
其中指针X,Y,Z的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?
尾结点指针域的值为0
X=116
Y=0
Z=100
末节点的起始地址为23的起始地址,即112
五、编程题
1. 已知一个带头结点的单链表L,请编程求该单链表中数据元素的个数。
- int Listlength(LinkList L)
- {
- int sum=0;
- LinkList p=L->next;
- while(p)
- {
- p=p->next;
- sum++;
- }
- return sum;
- }
2. 设有一带头结点的单链表,编程将链表颠倒过来,即(a1...an)逆置为(an...a1),要求不用另外的数组或结点完成.
- int ListReverse(LinkList &L)
- {
- if(L->next)
- return 1;
- LNode*pre=NULL;
- LNode*p=L->next;
- while(p)
- {
- LNode*temp=p->next;
- p->next=pre;
- pre=p;
- p=temp;
- }
- return 1;
- }