第二章 线性表

更新时间:2024-03-02 18:06:03 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第二章 线性表

一、选择题

1.线性表是具有n个__C___的有限序列(n>0)。

A.表元素 B.字符 C.数据元素 D.数据项 2.一个顺序表所占用的存储空间大小与___B___无关。 A.表的长度 C.元素的类型

B.元素的存放顺序

D.元素中各字段的类型

3.线性表的顺序存储结构是一种__A___。 A.随机存取的存储方式 C.索引存取的存储方式

B.顺序存取的存储方式 D.Hash存取的存储方式

4. 若线性表采用顺序存储结构,每个元素占用 4 个存储单元,第一个元素的存储地址为 100,则第 12 个元素的存储地址是__B____。 A.112 B.144 C.148 D.412 5. 线性表是__A____。

A.一个有限序列,可以为空 B.一个有限序列,不能为空 C.一个无限序列,可以为空 D.一个无限序列,不能为空

6.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为__C____。 A.O(n)O(n) B.O(n)O(1) C.O(1)O(n) D.O(1)O(1) 7.若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,首先需要移动表中___A____中数据元素。

A.n-i B.n+i C.n-i+1 D.n-i-1 8.对顺序存储的线性表,设其长度为n,在任何位置插入或删除操作都是等概率的。删除一个元素时平均要移动表中的____C____个元素。 A.n/2 B.(n+1)/2 C.(n-1)/2 D.n 9.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为__C____。(1≤i≤n+1)

A.O(0) B.O(1) C.O(n) D.O(n2) 10.线性表中各链接点之间的地址___C____。 A.必须连续

B.部分地址必须连续

C.不一定连续 D.连续与否无所谓

11.在n个结点的线性表的数组表示中,算法的时间复杂度是O(1)的操作是_A______。

A.访问第i个结点后插入一个新结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)

B.在第i个结点后插入一个新结点(1≤i≤n) C.删除第i个结点(1≤i≤n) D.以上都不对

12.单链表中,增加一个头结点的目的是为了____C_____。 A.使单链表至少有一个结点 B.标识表结点中首结点的位置 C.方便运算的实现

D.说明单链表是线性表的链式存储

13.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是_B____。 A.head==NULL C.head->next==head

B.head->next==NULL D.head!=NULL

14.将长度为n的单链表链接在长度为m的单链表后面的算法的时间复杂度采用大O形式表示应该是___C____。

A.O(1) B.O(n) C.O(m) D.O(n+m) 15.静态链表中指针表示的是___C____。 A.下一个元素的地址 C.下一个元素在数组中的位置

B.内存储器的地址

D.左链或右链指向的元素的地址

16.非空的循环单链表head的尾结点p满足__A______。

A.P->link=head B.P->link=NULL C.P=NULL D.P=head 17.某线性表用带头结点的循环单链表存储,头指针为head,当head->next->next==head成立时,线性表的长度是___B____。 A.0 B.1 C.2 D.3 18.在什么情况下,应使用链式结构存储线性表L?___B____ A.需经常修改L中的结点值 C.需要经常查询L中的结点值

B.需不断对L进行删除插入 D.L中结点结构复杂

19.与单链表相比较,双向链表的优点之一是___D_____。 A.可以省略头结点指针 C.插入、删除操作更简单

B.可以随机访问

D.顺序访问相邻结点更灵活

20.某线性表常发生的操作为删除第一个数据元素和最后一个元素后添加新元素,采用__D__作为存储结构,能使其存储效率和时间效率最高。 A.单链表 C.双向循环链表

B.仅用头指针的循环单链表 D.仅用尾指针的循环单链表

21.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用_D___存储方式最节省运算时间。

A.单链表 B.双链表 C.单循环链表 D.带头结点的双循环链表 22.对于一个线性表既要求能够进行较快的插入和删除,又要求存储结构能够反映数据之间的逻辑关系,则应用___C____。

A.顺序方式存储 B.散列方式存储 C.链接方式存储 D.以上方式均可 23.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用___A___存储方式最节省时间。

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表 24.若线性表最常用的操作是存取第i个元素及其前驱和后继元素的值,为节省时间应采用的存储方式为___D_____。

A.单链表 B.双向链表 C.单循环链表 D.顺序表 25.下面哪一条是顺序存储结构的优点?___C______ A.插入运算方便 C.存储密度大

B.可方便地用于各种逻辑结构的存储表示 D.删除运算方便

26.下面关于线性表的叙述中,错误的是___B_____。 A.线性表采用顺序存储,必须占用一批连续的存储单元 B.线性表采用顺序存储,便于进行插入和删除的操作 C.线性表采用链接存储,不必占用一片连续的存储单元 D.线性表采用链接存储,便于插入和删除操作

27.在非空线性链表中由p所指的链接点后面插入一个由q所指的链接点的过程是依次执行动作__B____。

A.q->link=p;p->link=q; C.q->link=p->link;p=q;

B.q-link=p->link;p->link=q; D.p->link=q;q->link=p;

26.在非空双向循环链表中由q所指的链接点前面插入一个由p指的链接点的过程是依次执行语句p->rlink=q;p->llink=q->llink;q->llink=p; ____D____。 A.q->rlink->llink=p; C.p->rlink->llink=p;

B.q->llink->rlink=p; D.p->llink->rlink=p;

29.在非空双向循环链表中由q所指的链接点后面插入一个由p指的链接点的动作依次为__D____。

A.p->llink=q ; p->rlink=q->rlink ; q->rlink=p ; q->rlink->llink=p; B.p->rlink=q->rlink ; p->llink=q ; q->rlink ; q->rlink->llink=p; C.p->llink=q ; p->rlink=q->rlink ; q->rlink=p ; p->llink->rlink=p; D.p->llink=q ; p->rlink=q->rlink ; q->rlink=p ; p->rlink->llink=p; 30.在双向链表存储结构中,删除p所指的结点时须修改指针__A____。 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 ; 31.单链表的存储密度为__C____。

A.大于1 B.等于5 C.小于1 D.不能确定

二.判断题

1. 线性表的逻辑顺序与存储顺序总是一致的。 ( ) 2. 线性表的顺序存储结构比链式存储结构更好。 ( ) 3. 线性表中的所有元素都有一个前驱元素和后继元素。 ( ) 4. 不论线性表采用顺序存储结构还是链式存储结构,删除值为X 的结点的时间复杂度均为O(n)。 ( ) 5. 线性的数据结构可以顺序存储,也可以链接存储。非线性的数据结构只能链接存储。 ( ) 6. 非空线性表中任意一个数据元素都有且仅有一个直接后继元素。( ) 7. 用一组地址连续的存储单元存放的元素一定构成线性表。 ( ) 8. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。

( )

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

10. 顺序表中所有结点的类型必须相同。 ( ) 11. 对链表进行插入和删除操作时不必移动链表中结点。 ( ) 12. 非空的双向循环链表中任何结点的前驱指针均不为空。 ( ) 13. 链式存储在插入和删除时需要保持物理存储空间的顺序分配,不需要保持数据元素之间的逻辑顺序。 ( ) 14. 单链表从任何一个结点出发,都能访问到所有结点。 ( ) 15. 符号p->next 出现在表达式中表示p 所指的那个结点的内容。( ) 16. 带表头结点的双向循环链表判空的条件是: first->rlink == first(first 为表头指针)。 ( )

三、综合应用题

1.利用顺序表的操作,实现以下函数:

1)从顺序表中删除具有最小值的元素并由函数返回被删除元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。

2)从顺序表中删除第i个元素并由函数返回被删除元素的值,如果i不合理或顺序表为空则显示出错信息并退出运行。

3)向顺序表中第i个位置插入一个新元素x。如果i不合理则显示出错信息并退出运行

4)从顺序表中删除具有给定值x的所有元素。

5)从顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素。如果s或t不合理或者顺序表为空,则显示错误信息并退出。

6)从有序顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素,如果s或t不合理或顺序表为空,则显示错误信息并退出。

7)将两个有序顺序表合并成一个新的有序顺序表并由函数返回结果顺序表

8)从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。

2.请设计算法将不带头结点的单链表就地逆置。

3.有一个单链表L(至少有1个结点),其头结点指针为head,编写一个过程将L逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。

4.设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法:

找出最小值结点,且打印该数值。

若该数值是奇数,则将其与直接后继结点的数值交换。 若该数值是偶数,则将其直接后继结点删除。

5.给定(已生成)一个带表头结点的单链表,设head为头指针,结点的结构为(data,next),data为整型元素,next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间(要求:不允许使用数组作辅助空间)。

6.假设有两个按元素值递增次序排列的线性表,并要求利用原来两个单链表的结点存放归并后的单链表。

7.在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。例如:(7,10,10,21,30,42,42,42,51,70)将变为(7,10,21,30,42,51,70)。

8.试编写在带头结点的单链表中删除一个最小值结点的高效算法:void delete(Linklist &L)。

9.已知两个单链表A和B,其头指针分别为heada和headb,编写一个过程从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个元素之前。

10.已知非空线性表由list指出,链结点的构造为(data,link)。请写一算法,将链表中数据域值最小的那个链结点移到链表的最前面(要求:不得额外申请新的链结点)。

11.带头结点且头指针为ha和hb的两线性表A和B分别表示两个集合,两表中的元素皆为递增有序。请写一算法求A和B的并集A U B,要求该并集中的元素仍保持递增有序,且要利用A和B的原有结点空间。

12.已知两个链表A和B分别表示两个集合,其元素递增排列。编写一函数程序,求A与B的交集,并存放于A链表中。

13.设计一个求两个集合A和B之差C=A-B的程序,即当且仅当e是A的一个元素,但不是B中的一个元素时,e才是C中的一个元素。集合用有序链表实现,初始时,A、B集合中的元素按递增排列,C为空;操作完成后,A、B保持不变,C中元素按递增排列。下面的函数append(last,e)是把值为e的新结

点链接在由指针last指向的结点的后面,并返回新结点的地址;在执行A-B运算之前,用于表示结果集合的链表首先增加一个附加的表头结点,以便新结点的添加,当A-B运算执行完毕后,再删除并释放表示结果集合的链表的表头结点。

typedef struct node{ int element; struct node *link; }NODE;; NODE *A,*B,*C;

NODE *append (NODE *last,int e){

last->link=(NODE*)malloc(sizeof(NODE)); last->link->element=e; return (last->link); }

NODE *difference (NODE *A,NODE *B) { ……… }

14.设一单向链表的头指针为head,链表的记录中包含着整数类型的key域,试设计算法,将此链表的记录按照key递增的次序进行就地排序。

15.设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于等于零的结点(链表A的元素类型为整型,要求B、C表利用A表的结点)。

16.将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。

1)写出其类型定义。 2)写出算法。

17.两个整数序列A=a1,a2,a3,…,am和B=b1,b2,b3,…,bn已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的子序列。

18.已知线性表(a1,a2,a3,…,an)按顺序存于内存,每个元素都是整数,试设计用最少时间把所有值为负数的元素移到全部正数值(假设0为正数)元素前边的算法。例如:(x,-x,-x,x,x,-x, …,x)变为(-x,-x,-x, …,x,x,x)。

19.一元稀疏多项式以循环单链表按降幂排列,结点有三个域,系数域coef,指数域exp和指针域next。现对链表求一阶导数,链表的头指针为ha,头结点的exp域为-1。

20.设用带头结点的双向循环链表表示的线性表为L=(a1,a2,a3, …,an)。写出算法将L改造成:L=(a1,a3, …,an, …,a4,a2).

结点和结点指针类型定义如下: typedef struct node{ ElemType data; Struct node *prior,next; }*DLinkList;

21.设有一个头指针为L的带有表头结点的非循环双向链表,其每个结点中除有pred(前驱指针)、data(数据)和next(后继指针)域外,还有一个访问频度域freq。在链表被起用前,其值均初始化为零。每当在链表中进行一次Locate(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度非增(递减)的顺序排列,同时最近访问的结点排在频度相同的结点的最后,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的Locate(L,x)运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型。

本文来源:https://www.bwwdw.com/article/owfa.html

Top