数据结构 线性表试题
!数据结构作业-线性表
head->next->next= D =rear
单选题 1分
29.已知指针p和q分别指向某 单链表中第一个结点和最后一 个结点。假设指针s指向 另一 个单链表中某个结点,则在s所 指结点之后插入上述链表应执 行的语句为( )
A
q->next=s>next;s->next=p;
B
s->next=p;q>next=s->next;
单选题 1分 2. 设n是描述问题规模的非负 整数,下面程序片断的时间复 杂度是( ) x=2; while(x<n/2) x=2*x;
A O(log2n)
B O(n)
C O(nlog2n)
D O(n2)
单选题 1分 3. 在下面的程序段中,对x的 赋值语句的频度为( ) For(i=1;i<n;i++) For( j=1;j<n;j++) x=x+1;
A head->next->data=='C'
B head->data =='B'
C P1->data ==’D’
D P2 ->next ==null
单选题 1分
20.下面关于线性表的叙述中, 错误的是哪一个?( )
A
线性表采用顺序存储,必须 占用一片连续的存储单元。
数据结构试题及答案(十套)
一、单选题(每题 2 分,共20分)
1.对一个算法的评价,不包括如下(B )方面的内容。
A.健壮性和可读性B.并行性C.正确性D.时空复杂度
2.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结点,
则执行( )。
A. p->next=HL->next; HL->next=p;
B. p->next=HL; HL=p;
C. p->next=HL; p=HL;
D. HL=p; p->next=HL;
3.对线性表,在下列哪种情况下应当采用链表表示?( )
A.经常需要随机地存取元素
B.经常需要进行插入和删除操作
C.表中元素需要占据一片连续的存储空间
D.表中元素的个数不变
4.一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是
( C )
A. 2 3 1
B. 3 2 1
C. 3 1 2
D. 1 2 3
5.AOV网是一种()。
A.有向图B.无向图C.无向无环图D.有向无环图
6.采用开放定址法处理散列表的冲突时,其平均查找长度()。
A.低于链接法处理冲突 B. 高于链接法处理冲突
C.与链接法处理冲突相同D.高于二分查找
7.若需要利用形参直接访问实参时,应将形参变量说明为()参数。
A.值B.函数C.指针D.引用
8.在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具有
相同的()。
A.行号B.列号C.元素值D.非零元素个数
9.快速排序在最坏情况下的时间复杂度为()。
A.O(log2n) B.O(nlog2n)C.0(n) D.0(n2)
数据结构练习题线性表习题及答案
数据结构练习题线性表习题及答案
精品文档
第二章线性表
一.名词解释
1.线性结构
2.数据结构的顺序实现
3.顺序表
4.链表
5.数据结构的链接实现
6. 建表
7.字符串
8.串
9.顺序串 10.链串
二、填空题
1.为了便于讨论,有时将含n(n>=0)个结点的线性结构表示成(a,a,……a),其中每n12个a代表一个______。a称为______结点,a称为______结点,i称为a在线性表中的________ii1n或______。对任意一对相邻结点a、a(1<=i<n),a称为a的直接______a称为a的直iii┼1i┼1┼i1i接______。< bdsfid="75" p=""></n),a称为a的直接______a称为a的直iii┼1i┼1┼i1i接______。<>
2.为了满足运算的封闭性,通常允许一种逻辑结构出现不含任何结点的情况。不含任何结点的线性结构记为______或______。
3.线性结构的基本特征是:若至少含有一个结点,则除起始结点没有直接______外,其他结点有且仅有一个直接______;除终端结点没有直接______外,其它结点有且仅有一个直接______.
4.所有结点按1对1的邻接关系构成的整体就是______结构。
5.线性表的逻辑结构是______结构。其所含结点的个数称为线性表的______,简称______.
6.表长为O的线性表称为______
7.线性表典型的基本运算包括:______、______、______、______、______、______等六种。
数据结构线性表答案 (1)
第一章线性表
2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
解:头指针是指向链表中第一个结点的指针。首元结点是指链表中存储第一个数据元素的结点。头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。它可以对空表、非空表以及首元结点的操作进行统一处理。
2.2 填空题。
解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。
(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。单链表中逻辑上相邻的元素的物理位置不一定紧邻。
(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。
(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。
2.3 在什么情况下用顺序表比链表好?
解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。
2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。
解:
2.5 画出执行下列各行语句后各指针及链表的示意图。 L=(LinkList)malloc(sizeof(LNode)); P=L; for(i=1;i<=4;i++){
P->next=(LinkList)malloc(sizeof(LNode)); P=P->next; P->data=i*2-1;
}
P->next=NULL;
for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2); for(i=1;i<=3;i++) Del_LinkList(L,i);
数据结构试题及答案
数据结构试题及答案
⼀、选择题(共10题,每题1分,共10分)
1.下⾯关于线性表的叙述中,错误的是哪⼀个?()
A.线性表采⽤顺序存储,必须占⽤⼀⽚连续的存储单元
B.线性表采⽤顺序存储,便于进⾏插⼊和删除操作
C.线性表采⽤链接存储,不必占⽤⼀⽚连续的存储单元
D.线性表采⽤链接存储,便于插⼊和删除操作
2.在⼀个单链表中,已知q所指结点是p所指结点的前驱,若在p和q之间插⼊s所指结点,则执⾏的操作是()。
A. s->next=p->next;p->next=s;
B. q->next=s;s->next=p;
C. p->next=s->next;s->next=p;
D. p->next=s;s->next=q;
3.设有三个元素X,Y,Z顺序进栈,下列得不到的出栈排列是( )。
A.XYZ B. YZX C. ZXY D. ZYX
4.若⽤⼀个长度为6的数组来实现循环队列,且当前rear和front的值分别为0和3,则从队列中删除⼀个元素,再增加两个元素后,rear和front的值分别是( )。
A.1和5 B.2和4 C.4和2 D. 5和1
5.下列说法中正确的是()。
A.⼆叉树就是度为2的树 B.⼆叉树中不存在度⼤于2的结点
C.⼆叉树中⾄少有⼀个结点的度为2 D.⼆叉树中任何⼀个结点的度都为2 6.在具有n个结点的⼆叉链表中,共有()个空指针。
A. n
B. n-1
C. n+1
D. 不确定
7.根据⼆叉树与树的转换关系可知,深度为h的满⼆叉树对应的森林由()棵树构成。
数据结构考研复习题--第二章--线性表(带答案)
第2章线性表
一选择题
1.下述哪一条是顺序存储结构的优点?()【北方交通大学 2001 一、4(2分)】A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示
2.下面关于线性表的叙述中,错误的是哪一个?()【北方交通大学 2001 一、14(2分)】
A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链接存储,不必占用一片连续的存储单元。
D.线性表采用链接存储,便于插入和删除操作。
3.线性表是具有n个()的有限序列(n>0)。【清华大学 1998 一、4(2分)】A.表元素 B.字符 C.数据元素 D.数据项 E.信息项
4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。【哈尔滨工业大学 2001 二、1(2分)】A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。【南开大学 2000 一、3】
A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表
6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时间。
A. 单链表
B.单循环链表
C. 带尾指针的单循环链表
D.带头结点的双循环链表
【合肥工业大学 2000 一、1(2分)】
7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用()存储方式最节省运算时间。【北京理工大学 2000 一、1(2分)】A.单链表 B.双链表 C.单循环链表 D.带头结点的双循环链表
数据结构线性表课后答案
第2章线性表
1.选择题
(1)顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()。
A.110 B.108 C.100 D.120
答案:B
解释:顺序表中的数据连续存储,所以第5个元素的地址为:100+2*4=108。
(2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是()。
A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
B.在第i个结点后插入一个新结点(1≤i≤n)
C.删除第i个结点(1≤i≤n)
D.将n个结点从小到大排序
答案:A
解释:在顺序表中插入一个结点的时间复杂度都是O(n2),排序的时间复杂度为O(n2)或O(nlog2n)。顺序表是一种随机存取结构,访问第i个结点和求第i个结点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是O(1)。
(3)向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为()。
A.8 B.63.5 C.63 D.7
答案:B
解释:平均要移动的元素个数为:n/2。
(4)链接存储的存储结构所占存储空间()。
A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
B.只有一部分,存放结点值
C.只有一部分,存储表示结点间关系的指针
D.分两部分,一部分存放结点值,另一部分存放结点所占单元数
答案:A
(5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。
A.必须是连续的B.部分地址必须是连续的
C.一定是不连续的D.连续或不连续都可以
答案:D
(6)线性表L在()情况下适用于使用链式结构实现。
数据结构试题库及答案
数据结构试题库及答案
一、选择题
1. 在数据结构中,线性结构的特点是:
A. 元素之间存在一对一关系
B. 元素之间存在一对多关系
C. 元素之间存在多对多关系
D. 元素之间存在一对一或多对多关系
答案:A
2. 栈(Stack)是一种特殊的线性表,其特点是:
A. 只能在一端进行插入和删除操作
B. 可以在两端进行插入和删除操作
C. 只能在一端进行插入操作,另一端进行删除操作
D. 可以在任意位置进行插入和删除操作
答案:A
3. 在二叉树中,度为1的节点数目为2,度为0的节点数目也为2,该二叉树的节点总数是:
A. 5
B. 6
C. 7
D. 8
答案:B
二、简答题
1. 请简述什么是哈希表,并说明其主要优点。
答案:哈希表是一种通过哈希函数将键映射到表中一个位置来访问记录的数据结构。其主要优点包括:平均情况下,查找、插入和删除操作的时间复杂度为O(1),即常数时间内完成操作;空间效率高,能够存储大量数据。
2. 描述图的深度优先搜索(DFS)算法的基本思想。
答案:深度优先搜索算法的基本思想是从一个顶点开始,尽可能深地搜索图的分支。搜索过程中使用一个栈来保存路径上的顶点。当搜索到一个顶点时,先访问该顶点,然后依次搜索其所有未被访问过的邻接顶点。如果当前顶点的所有邻接顶点都被访问过,则回溯到上一个顶点,继续搜索其他邻接顶点。
三、应用题
1. 给定一个无向图,使用邻接表表示,请编写一个算法找出图中的所有连通分量。
答案:首先,创建一个访问过的顶点集合。然后,从图中任意一个未被访问的顶点开始,执行深度优先搜索(DFS)。每次DFS完成后,就找到了一个连通分量。重复这个过程,直到所有顶点都被访问过,即可找到图中的所有连通分量。
数据结构--线性表习题及答案
数据结构--线性表习题及答案
第⼆章线性表
⼀、选择题
1、若长度为n的线性表采⽤顺序存储结构,在其第i个位置插⼊⼀个新元素算法的时间复杂度()。
A. O(log2n)
B.O(1)
C. O(n)
D.O(n2)
2、若⼀个线性表中最常⽤的操作是取第i个元素和找第i个元素的前趋元素,则采⽤()存储⽅式最节省时间。
A. 顺序表
B. 单链表
C. 双链表
D. 单循环链表
3、具有线性结构的数据结构是()。
A. 图
B. 树
C. ⼴义表
D.栈
4、在⼀个长度为n的顺序表中,在第i个元素之前插⼊⼀个新元素时,需向后移动()个元素。
A. n-i
B. n-i+1
C. n-i-1
D. i
5、⾮空的循环单链表head的尾结点p满⾜()。
A. p->next==head
B. p->next==NULL
C. p==NULL
D. p==head
6、链表不具有的特点是()。
A. 可随机访问任⼀元素
B. 插⼊删除不需要移动元素
C. 不必事先估计存储空间
D. 所需空间与线性表长度成正⽐
7、在双向循环链表中,在p指针所指的结点后插⼊⼀个指针q所指向的新结点,修改指针的操作是()。
A. p->next=q;q->prior=p;p->next->prior=q;q->next=q;
B. p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;
C. q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;
数据结构 线性表 习题
第二章线性表
一、选择题
1.线性表是()
A.一个有限序列,可以为空B.一个有限序列,不可以为空
C.一个无限序列,可以为空D.一个无限序列,不可以为空
2.一维数组与线性表的特征是()。
A.前者长度固定,后者长度可变B.两者长度均固定
C.后者长度固定,前者长度可变D.两者长度均可变
3.用单链表方式存储的线性表,存储每个结点需要两个域,一个数据域,另一个
是( ).
A.当前结点所在地址域B.指针域
C.空指针域D.空闲域
4.用链表表示线性表的优点是()。
A.便于随机存取B.便于进行插入和删除操作
C.占用的存储空间较顺序表少D.元素的物理顺序与逻辑顺序相同5.在具有 n 个结点的单链表中,实现___的操作,其算法的时间复杂度都是O(n)。
A.遍历链表和求链表的第i个结点D.删除地址为P的结点的后继结点B.在地址为P的结点之后插入一个结点 C.删除开始结点
6.下面关于线性表的叙述中,错误的是()。
A.线性表采用顺序存储必须占用一片连续的存储单元
B.线性表采用顺序存储便于进行插入和删除操作
C.线性表采用链式存储不必占用一片连续的存储单元
D.线性表采用链式存储便于进行插入和删除操作
7.已知单链表的每个结点包括一个指针域next,它指向该结点的后继结点。现
要将指针 q 指向的新结点插入到指针 p 指向的结点之后,下面的操作序列中正确的是()。
A . q = p->next; p->next = q->next ;
B . p->next = q->next; q = p->next ;
C . q->next = p->next; p->next = q ;
《数据结构》关于线性表的练习题(PPT内含答案)
3.在单链表中要在已知结点*P之前插入一个新结点, 需找到*P的直接前趋结点的地址,其查找的时间 复杂度为 O(n) 。
4.在长度为n的顺序表中,如果要在第i个元素前插 入一个元素,要后移 n-i+1 个元素。
C.查找时间复杂度为O(n) D.查找结点的次数约为n
13.等概率情况下,在有n个结点的顺序表上做插入结点运 算,需平均移动结点的数目为( C )。
A.n
B.(n-1)/2 C.n/2 D.(n+1)/2
习题2
14.以下链表结构中,从当前结点出发能够访问到 任意结点的是( C )。
A.单向链表和双向链表
物理位置上并不一定紧邻。( T ) 4.顺序存储方式的优点是存储密度大,插入、删除效率高。
(F) 5.线性链表的删除算法简单,因为当删除链中某个结点后,
计算机会自动地将后续的各个单元向前移动。F
习题2
6.顺序表的每个结点只能是一个简单类型,而链表的每个
结点可以是一个复杂类型。
(F )
7.线性表链式存储的特点是可以用一组任意的存储单元存
C.p->next=s;p->next=s->next;
D.p->next=s->next;p->next=s;
数据结构第二章线性表习题
第二章 线性表习题
1.
A.
C.
2.
A.
、单项选择题
线性表是
一个有限序列, 一个无限序列, 在一个长度为
n-i
B.
B.—个有限序列,不可以为空
D.—个无限序列,不可以为空
n的顺序表中删除第i个元素(0<=i<=n)时,需向前移动
可以为空
可以为空
n-i+l
C.n-i-1
D.iቤተ መጻሕፍቲ ባይዱ
个元素。
线性表采用链式存储时,其地址
必须是连续的B.—定是不连续的
个元素结点。
数据结构——线性表(选择题)
1.线性表是()。
简单,线性表的概念与性质,02702001 [单选题]
A、一个有限序列,可以为空(正确答案)
B、一个无限序列,不可以为空
C、一个无限序列,可以为空
D、一个无限序列,不可以为空
2.在一个长度为n 的顺序表中删除第i 个元素(0<=i<=n)时,需向前挪移()个元素。
简单,线性表顺序存储实现,02702003 [单选题]
A 、n-i(正确答案)
B 、n-i+1
C 、n-i-1
D 、i
3.线性表采用链式存储时,其地址()。
简单,线性表的链式存储原理,02702004 [单选题]
A、必须是连续的
B、一定是不连续的
C、部份地址必须是连续的
D、连续与否均可以(正确答案)
4.从一个具有n 个结点的单链表中查找其值等于x 的结点时,在查找成功的情况
下,需平均比较()个元素结点。
普通,链式存储的实现,02702005 [单选题]
A 、n/2
B 、n
C 、(n+1)/2(正确答案)
D 、(n-1)/2
5.在双向循环链表中p 所指的结点之后插入s 指针所指向的结点,其操作是()。普通,循环链表实现,02702022 [单选题]
A 、p->next=s; s->prior=p; p->next->prior=s; s->next=p->next;
B 、s->prior=p; s->next=p->next; p->next=s; p->next->prior=s;
C 、p->next=s; p->next->prior=s; s->prior=p; s->next=p->next;
数据结构(线性表习题含答案)
数据结构第二章
线性表习题含答案
说明:顺序存储的线性表称为向量。
一,单项选择题一个向量第一个元素的地址是100,每个元素的长度为2,则第5个元素的地址是__①_B__。
A) 110 B) 108 C) 100 D) 120
线性结构通常采用的两种存储结构是__①A___。
A) 顺序存储结构和链式存储结构B) 散列方式和索引方式
C) 链表存储结构和数组D) 线性存储结构和非线性存储结构不带头结点的单链表head为空的判定条件是__①__A_.
A) head==NULL B) head->next==NULL
C) head->next==head D) head!=NULL
带头结点的单链表head为空的判定条件是__①B___。
A) head==NULL B) head->next==NULL
C) head->next==head D) head!=NULL
非空的循环链表head的尾结点(由p所指向)满足__①_C__。
A) p->next==NULL B) p==NULL
C) P->next==head D) p==head
在循环双链表的p所指结点之后插入s所指结点的操作是___①_C_。
A) p->right=s; s->left=p; p->right->left=s; s->right=p->right;
B) p->right=s; p->right->left=s; s->left=p; s->right=p->right;
C) s->left=p; s->right=p->right; p->right=s; p->right->left=s;
线性表填空试题 数据结构
数据结构复习题:线性表
填空题
1、在线性结构中第一结点_____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后继结点。
2、对于顺序存储的线性表,当随机插入或删除一个元素时,约需平均移动表长______的元素。
3、对于长度为n的顺序表,插入或删除元素的时间复杂性为________;对于顺序栈或队列,插入或删除元素的时间复杂性为_________。
4、在线性表的顺序存储中,元素之间的逻辑关系是通过__________决定的;在线性表的链接存储中,元素之间的逻辑关系是通过____________决定的。
5、一个单链表中删除*p结点时,应执行如下操作:
(1)q=p->next;
(2)p->data=p->next->data;
(3)p->next=__________;
(4)free(q);
6、对于线性表的顺序存储,需要预先分配好存储空间,若分配太多则容易造成存储空间的__________,若分配太少又容易在算法中造成__________,因此适应于数据量变化不大的情况;对于线性表的链接存储(假定采用动态结点),不需要__________存储空间,存储器中的整个__________都可供使用,分配和回收结点都非常方便,能够有效地利用存储空间,在算法中不必考虑__________的发生,因此适应数据量变化较大的情况。
7、从顺序表中删除第i个元素时,首先把第i个元素赋给__________带回,接着从_____________开始向后的所有元素均___________一个位置,最后使线性表的长度_____________。
数据结构-线性表习题及解析
线性表典型例题
一、单项选择题
[例7-1]在数据结构中,与所使用计算机无关的数据叫( ①)结构;链表是一种采用( ②)存储结构存储的线性表;链表适用于( ③)查找;在链表中进行( ④)操作的效率比在线性表中进行该操作的效率高。
①A.存储B.物理C.逻辑D.物理和逻辑
②A.顺序B.网状C.星式D.链式
③A.顺序B.二分法C.顺序及二分法D.随机
④A.二分法查找B.快速查找C.顺序查找D.插入
解析:本题考查的是基本概念。本题答案为:①C;②D;③A;④D。
[例7-2] 链表不具备的特点是( )。
A.插入和删除不需要移动元素B.可随机访问任一结点
C.不必预分配空间D.所需空间与其长度成正比
解析:线性表可随机访问任一结点,而链表必须从第一个数据结点出发逐一查找每个结点。本题答案为:B。
[例7-3] 不带头结点的单链表head为空的判定条件是( )。
A.head==NULL B.head_>next==NULL
C.head_>next==head D.head!=NULL
解析:在不带头结点的单链表head中,head指向第一个数据结点。空表即该表没有结点,head==NULL表示该单链表为空。本题答案为:A。
[例7-4] 带头结点的单链表head为空的判定条件是( )。
A.head==NULL B.head—>next==NULL
C.head—> next==head D.head!=NULL
解析:在带头结点的单链表head中,head指向头结点。空表即该表只有头结点,head —>next==NULL表示该单链表为空。本题答案为:B。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
选择题
1.对于线性表最常用的操作是查找指定序号的元素和在末尾插入元素,则选择( )最节省时间
A)顺序表 B)带头结点的双循环链表
C)单链表 D)带尾结点的单循环链表
【答案】A
2.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法时间复杂度为( )(1≤i≤n+1)。
A) O(0) B) O(1) C) O(n) D) O(n2)
【答案】C
3.双向链表中有两个指针域,prior和next,分别指向前驱及后继,设p指向链表中的一个结点,q指向一待插入结点,现要求在p前插入q,则正确的插入为( )
A) p->prior=q; q->next=p; p->prior->next=q; q->prior=p->prior;
B) q->prior=p->prior; p->prior->next=q; q->next=p; p->prior=q->next;
C) q->next=p; p->next=q; p->prior->next=q; q->next=p;
D) p->prior->next=q; q->next=p; q->prior=p->prior; p->prior=q;
【答案】D
4.在一个具有n个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是( )
A)O(nlog2n) B) O(1) C) O(n) D) O(n2)
【答案】C
5. 在一个以 h 为头指针的单循环链中,p 指针指向链尾结点的条件是( )
A)p->next==NULL B) p->next==h
C)p->next->next==h D) p->data==-1
【答案】B
6.对于一个具有n个结点的线性表,建立其单链表的时间复杂度是( )
A)O(n) B) O(1) C)O(nlog2n) D) O(n2)
【答案】A
8.在双向链表存储结构中,删除p所指的结点时须修改指针( )
A)p->prior->next=p->next p->next->prior=p->prior;
B)p->prior=p->prior->prior p->prior->next=p;
C)p->next->prior=p p->next=p->next->next
D)p->next=p->prior->prior p->prior=p->next->next;
【答案】A
9.线性表采用链式存储时,其元素地址( )
A)必须是连续的 B)一定是不连续的
C)部分地址是连续的 D)连续与否均可
【答案】D
2.2 填空题
1.线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是_____________。
【答案】(n-1)/2
2.在单链表中设置头结点的作用是_____________。
【答案】主要是使插入和删除等操作统一,在第一个元素之前插入元素和删除第一个结点不必另作判断。另外,不论链表是否为空,链表头指针不变。
3.线性表的顺序存储是通过_____________来反应元素之间的逻辑关系,而链式存储结构是通过_____________来反应元素之间的逻辑关系。
【
答案】(1)数据元素的前后顺序 (2)元素中的指针
4.当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,则采用_____________存储结构最节省时间,相反当经常进行插入和删除操作时,则采用_____________存储结构最节省时间。
【答案】(1)顺序 (2)链式
5.对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为_____________,在给定值为x的结点后插入一个新结点的时间复杂度为_____________。
【答案】(1)O(1) (2)O(n)
7. 对于双向链表,在两个结点之间插入一个新结点需修改的指针共_____________个,单链表为_____________个。
【答案】(1)4 (2)2
8. 循环单链表的最大优点是_____________。
【答案】从任一结点出发都可访问到链表中每一个元素。
9.若要在一个不带头结点的单链表的首结点*p结点之前插入一个*s结点时,可执行下列操作:
s->next=_____________;
p->next=s;
t=p->data;
p->data= _____________;
s->data=_____________;
【答案】(1)p->next (2)s->data (3) t
10.某线性表采用顺序存储结构,每个元素占据4个存储单元,首地址为100,则下标为11的(第12个)元素的存储地址为_____________。
【答案】144
11.带头结点的双循环链表L中只有一个元素结点的条件是_____________。
【答案】L->next->next==L
2.3 判断题
1.取线性表的第i个元素的时间同i的大小有关( )
【答案】×
2.线性表的特点是每个元素都有一个前驱和一个后继( )
【答案】×
3. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高( )
【答案】×
4.线性表采用链表存储时,结点的存储空间可以是不连续的( )
【答案】√
5.链表是采用链式存储结构的线性表,进行插入、删除操作时,在链表中比在顺序存储结构中效率高( )
【答案】√
6.顺序存储方式只能用于存储线性结构( )
【答案】×
【解析】线性结构、树型结构和图状结构均可用顺序存储表示。
9.顺序存储结构的主要缺点是不利于插入或删除操作( )
【答案】√
10.顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好( )
【答案】×
2.4 程序设计题
1.设顺序表va中的数据元素递增有序。试设计一个算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
【算法源代码】
void Insert_SqList(SqList va,int x)/*把x插入递增有序表va中*/
{ int i;
if(va.length> MAXSIZE) return;
for(i=va.length-1;va.elem>x&&i>=0;i--)
va.elem[i+1]=va.elem
;
va.elem[i+1]=x;
va.length++;
}/*Insert_SqList*/
2.设 A=(a1,a2,…,am) 和 B=(b1,b2,…,bn)均为顺序表,试设计一个比较A,B大小的算法(请注意:在算法中,不要破坏原表A和B)。
【算法分析】比较顺序表A和B,并用返回值表示结果,值为1,表示A>B;值为-1,表示A1)当两个顺序表可以互相比较时,若对应元素不等,则返回值为1或-1;
2)当两个顺序表可以互相比较的部分完全相同时,若表长也相同,则返回值为0;否则,哪个较长,哪个就较大
【算法源代码】
int ListComp(SqList A,SqList B)
{ for(i=1;i<=A.length&&i<=B.length;i++)
if(A.elem!=B.elem)
return A.elem>B.elem?1:-1;
if(A.length==B.length) return 0;
return A.length>B.length?1:-1; /*当两个顺序表可以互相比较的部分完全相同时,哪个较长, 哪个就较大*/
}/*ListComp */
3.已知指针 ha和 hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试设计一个算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。
【算法分析】
1)单链表ha的头结点作为连接后的链表的头结点,即hc=ha;
2)查找单链表ha的最后一个结点,由指针p指向,即p->next==NULL;
3)将单链表hb的首元结点(非头结点)连接在p之后,即p->next=hb->next;
4)回收单链表hb的头结点空间
【算法源代码】
void ListConcat(LinkList ha,LinkList hb,LinkList *hc)/*把链表hb接在ha后面形成链表hc*/
{ *hc=ha; p=ha;/*由指针p指向ha的尾元结点*/
p=p->next;
p->next=hb->next;
free(hb);
}/*ListConcat */
4.试设计一个算法,在无头结点的动态单链表上实现线性表操作INSERT(L,i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。
【算法分析】
1)生成新结点存放元素b,由指针new指向;
2)将new插入在单链表的第i个元素的位置上:若i==1,new插在链表首部;否则查找第i-1个结点,由指针p指向,然后将new插在p之后。
【算法源代码】
void Insert(LinkList *L,int i,int b)
{ LinkList new;
new=(LinkList*)malloc(sizeof(LNode));
new->data=b;
if(i==1) {/*插入在链表头部*/ New->next=*L; *L=new; }
else { /*插入在第i个元素的位置*/ p=*L; while(--i>1) p=p->next;
new->next=p->next; p->next=new; }
}/*Insert */
5.已知线性表中的元素以值递增有序排列,并以单链表作存储结
构。试设计一个高效的算法,删除表中所有值大于 mink且小于 maxk的元素(若表中存在这样的元素),同时释放被删结点空间(注意:mink和maxk是给定的两个参变量。它们的值可以和表中的元素相同,也可以不同)。
【算法分析】
1)查找最后一个不大于mink的元素结点,由指针p指向;
2)如果还有比mink更大的元素,查找第一个不小于maxk的元素,由指针q指向;
3)p->next=q,即删除表中所有值大于 mink且小于 maxk的元素。
【算法源代码】
void Delete_Between(LinkList *L,int mink,int maxk)
{ p=*L;
while(p->next->data<=mink) p=p->next; /*p是最后一个不大于mink的元素*/
if(p->next) /*如果还有比mink更大的元素*/
{ q=p->next;
while(q->data
p->next=q;
}
}/*Delete_Between */
6.已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试设计一个高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间。
【算法分析】
1)初始化指针p和q,分别指向链表中相邻的两个元素;
2)当p->next不为空时,做如下处理:
①若相邻两元素不相等时,p和q都向后推一步;
②否则,当相邻元素相等时,删除多余元素。
【算法源代码】
void Delete_Equal(LinkList *L)
{ p=(*L)->next;q=p->next; /*p和q指向相邻的两个元素*/
while(p->next)
{ if(p->data!=q->data) /*若相邻两元素不相等时,p和q都向后推一步*/
{ p=p->next; q=p->next; }
else
{ while(q->data==p->data) /*当相邻元素相等时删除多余元素*/
{ r=q;
q=q->next;
free(r);
}
p->next=q;p=q;q=p->next;
}/*else*/
}/*while*/
}/*Delete_Equal */
7.试设计一个算法,对带头结点的单链表实现就地逆置。
【算法分析】
1)空表或长度为1的表,不做任何处理;
2)表长大于2时,做如下处理:
①首先将整个链表一分为二,即从链表的第一元素结点处断开;
②逐个地把剩余链表的当前元素q插入到链表的头部。
【算法源代码】
void LinkList_reverse(LinkList L)
{ if(!L->next||!L->next->next) return;
p=L->next; q=p->next; s=q->next; p->next=NULL; /*从链表的第一元素结点处断开*/
while(s->next)
{q->next=p;p=q;
q=s;s=s->next; /*把L的元素逐个插入新表表头*/
}
q->ne
xt=p; s->next=q;L->next=s;
}/*LinkList_reverse*/
8.设线性表A=(a1,a2,…,am) 和 B=(b1,b2,…,bn),试设计一个按下列规则合并A,B为线性表C的算法,即使得
C=(a1,b1,…,am,bm,bm+1 ,…,bn )当 m≤n时;
或者
C=(a1,b1,…,an,bn,an+1 ,…,am )当m>n时。
线性表A,B和C均以单链表作存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。
【算法分析】
1)初始化指针p指向链表A的当前元素,指针q指向链表B的当前元素;
2)当链表A和B均为结束时,做如下处理:
①将B的元素插入
②若A非空,将A的元素插入
③指针p和q同时后移
【算法源代码】
void merge1(LinkList A,LinkList B,LinkList *C)
{ p=A->next; q=B->next; *C=A;
while(p&&q)
{ s=p->next; p->next=q; /*将B的元素插入*/
if (s) { t=q->next; q->next=s; /*若A非空,将A的元素插入*/ }
p=s; q=t; /*指针p和q同时后移*/
}/*while*/
}/*merge1 */
9.假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请设计一个算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即 A表和B表)的结点空间构造C表。
【算法分析】按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的剩余元素。
【算法源代码】
void reverse_merge(LinkList A,LinkList B,LinkList *C)
{ LinkList pa,pb,pre;
pa=A->next;pb=B->next; /*pa和pb分别指向A和B的当前元素*/
pre=NULL;
while(pa||pb)
{ if(pa->data
{ pc=pa;q=pa->next;pa->next=pre;pa=q; }
else /*将B的元素插入新表*/
{ pc=pb;q=pb->next;pb->next=pre;pb=q; }
pre=pc;
}
*C=A; A->next=pc; /*构造新表头*/
}/*reverse_merge*/
10.已知A,B和C为三个递增有序的线性表,现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法,并分析你的算法的时间复杂度(注意:题中没有特别指明同一表中的元素值各不相同)。
【算法分析】先从B和C中找出共有元素,记为same,再在A中从当前位置开始, 凡小于same的元素均保留(存到新的位置),等于same的就跳过,到大于same时就再找下一个same。
【算法源代码】
void SqList_Intersect_Delete(SqList *A,SqList B,SqList C)
{ i=0; j=0; k=0; m=0; /*i指示A中元素原来的位置,m为移动后的位置*/
while(i<(*A
).length&&j
else{
same=B.elem[j]; /*找到了相同元素same*/
while(B.elem[j]==same) j++;
while(C.elem[k]==same) k++; /*j和k后移到新的元素*/
while(i<(*A).length&&(*A).elem
}
}/*while*/
while(i<(*A).length) (*A).elem[m++]=(*A).elem[i++]; /*A的剩余元素重新存储*/
(*A).length=m;
}/* SqList_Intersect_Delete*/
11.设L为单链表的头结点地址,其数据结点的数据都是正整数且无相同的,试设计利用直接插入的原则把该链表整理成数据递增的有序单链表的算法。
【算法分析】本题明确指出单链表带头结点,其结点数据是正整数且不相同,要求利用直接插入原则把链表整理成递增有序链表。这就要求从第二结点开始,将各结点依次插入到有序链表中。
【算法源代码】
void InsertSort (LinkList la)
{ if(la->next!=NULL) /*链表不为空表*/
{ p=la->next->next; /*p指向第一结点的后继*/
la->next->next=NULL;
/*直接插入原则认为第一元素有序,然后从第二元素起依次插入*/
while (p!=NULL)
{ r=p->next;/*暂存p的后继*/
q=la;
while (q->next!=NULL&&q->next->data
p->next=q->next;/*将p结点链入链表*/
q->next=p; p=r;}
12.设有一个双向循环链表,每个结点中除有 prior,data和 next三个域外,还增设了一个访问频度域freq。在链表被起用之前,频度域freq的值均初始化为零,而每当对链表进行一次LOCATE(L,X)的操作后,被访问的结点(元素值等于X的结点)中的频度域freq的值便增1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的结点总是靠近表头结点。试编写符合上述要求的 LOCATE操作的算法。
【算法分析】
1)在双向链表中查找数据值为x的结点,由指针p指向,若找不到,直接返回,否则执行第2步;
2)修改x结点的访问频度freq,并将结点从链表上摘下;
3)顺结点的前驱链查找该结点的位置,即找到一个结点的访问频度大于x结点的访问频度,由指针q指向;若q和p不是相邻结点,调整位置,把p插在q之后。
【算法源代码】
DuLNode * Locate_DuList(DuLinkList *L,int x)
{ p=(*L)->next;
while(p.data!=x&&p!= (*L)) p=p->next;
if(p==(*L)) return NULL; /*没找到x结点*/
p->freq
++; p->pre->next=p->next;p->next->pre=p->pre; /*将x结点从链表上摘下*/
q=p->pre;
while(q->freq<=p->freq&&p!= (*L)) q=q->pre; /*查找插入位置*/
if(q!=p->pre) /*将x结点插入*/
{ q->next->pre=p;
p->next=q->next;
q->next=p;p->preq; /*调整位置*/
}
return p;
}/*Locate_DuList */
13.已知三个带头结点的线性链表A、B和C中的结点均依元素值自小至大非递减排列(可能存在两个以上值相同的结点),编写算法对A表进行如下操作:使操作后的链表A中仅留下三个表中均包含的数据元素的结点,且没有值相同的结点,并释放所有无用结点。限定算法的时间复杂度为O(m+n+p),其中m、n和p分别为三个表的长度。
【算法分析】留下三个链表中公共数据,首先查找两表A和B中公共数据,再去C中找有无该数据。要消除重复元素,应记住前驱,要求时间复杂度O(m+n+p),在查找每个链表时,指针不能回溯。
【算法源代码】
LinkList Common(LinkList A, LinkList B, LinkList C)
{ pa=A->next;pb=B->next; pc=C->next; /*pa,pb和pc是工作指针*/
pre=A;
while(pa && pb && pc) /*当三表均不空时,查找共同元素*/
{ while(pa && pb)
if(pa->data
{u=pa;pa=pa->next;free(u);}
else if(pa->data> pb->data)pb=pb->next;
else if (pa && pb) /*处理A和B表元素值相等的结点*/
{ while(pc && pc->data
if(pc)
{if(pc->data>pa->data) /*处理pa结点,后移指针*/
{u=pa;pa=pa->next;free(u);}
else
{if(pre==A) /*结果表中第一个结点*/
{ pre->next=pa;pre=pa;pa=pa->next}
else if(pre->data==pa->data) /*重复结点不链入A表*/
{u=pa;pa=pa->next;free(u);}
else
{pre->next=pa;pre=pa;pa=pa->next;}/*将新结点链入A表 */
pb=pb->next;pc=pc->next; /* 链表的工作指针后移*/
}
}
else
if(pa==NULL)pre->next=NULL; /*若A表已结束,置A表表尾*/
else /*处理原A表未到尾而B或C到尾的情况*/
{ pre->next=NULL; /*置A表表尾标记*/
while(pa!=NULL) /*删除原A表剩余元素。*/
{u=pa;pa=pa->next;free(u);}
}
}
14.设 head为一单链表的
头指针,单链表的每个结点由一个整数域data和指针域next组成,整数在单链表中是无序的。编一函数,将 head链中结点分成一个奇数链和一个偶数链,分别由p,q指向,每个链中的数据按由小到大排列。程序中不得使用malloc申请空间。
【算法分析】本题要求将一个链表分解成两个链表,两个链表都要有序,两链表建立过程中不得使用malloc申请空间,这就是要利用原链表空间,随着原链表的分解,新建链表随之排序。
【算法源代码】
discreat(LinkList p, LinkList q, LinkList head)
{ p=NULL; q=NULL;/*p和q链表初始化为空表*/
s=head;
while (s!=NULL)
{ r=s->next; /*暂存s的后继*/
if(s->data%2==0) /*处理偶数*/
if (p==NULL)
{p=s;p->next=NULL;} /*第一个偶数结点*/
else
{ pre=p;
if(pre->data>s->data)
{s->next=pre;p=s;}/*插入当前最小值结点*/
else
{while (pre->next!=NULL)
if (pre->next->data
s->next=pre->next; /*链入结点*/
pre->next=s;
}
} else/*处理奇数链
if (q==NULL)
{q=s;q->next=NULL;} /*第一奇数结点*/
else
{pre=q;
if (pre->data>s->data)
{s->next=pre; q=s;} /*修改头指针*/
else
{while (pre->next!=NULL) /*查找插入位置*/
if (pre->next->data
s->next=pre->next; /*链入结点*/
pre->next=s;}
}/*结束奇数链结点*/
s=r; /*s指向新的待排序结点*/
}
}