第2章_线性表B
DS02线性表习题参考解答

第2章线性表习题参考解答一、简答题1.试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。
【答】头指针:是指向链表中的第一个结点的指针。
头结点:在开始结点之前附加上的一个结点。
开始结点:链表的第一个结点。
头指针是一个指向地址的变量,用于表示一个链表的开始。
引入头结点可以更加方便的进行链表是否为空的判断,同时方便了插入和删除结点。
开始结点用于存储链表的第一个数据元素。
2.何时选用顺序表、何时选用链表作为线性表的存储结构为宜?【答】顺序表中查找元素、获取表长非常容易,但是,要插入或者删除一个元素却需要移动大量的元素;相反,链表中却是方便插入或者删除元素,在查找元素的是,需要进行遍历。
因此,当所涉及的问题常常进行查找等操作,而插入、删除相对较少的是,适合采用顺序表;当常常需要插入、删除的时候,适合采用链表。
3.为什么在单循环链表中设置尾指针比设置头指针更好?【答】在单循环链表中,设置尾指针,可以更方便的判断链表是否为空。
4.在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?【答】本题分三种情况讨论:1、单链表:当知道指针p指向某结点时,能够根据该指针找到其直接后继,但是不知道头指针,因此不能找到该结点的直接前趋,因此,无法删除该结点。
2、双链表:根据指针p可以找到该结点的直接前趋和直接后继,因此,能够删除该结点。
3、单循环链表:和双链表类似,根据指针p也可以找到该结点的直接前趋和直接后继,因此,也可以删除该结点。
5.下述算法的功能是什么?LinkList Demo(LinkList *L) /* L是无头结点单链表*/{LNode *Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while (P->next) P=P->next;P->next=Q; Q->next=NULL;}return L;} /* Demo */【答】将原来的第一个结点变成末尾结点,原来的第二个结点变成链表的第一个结点。
数据库系统l试题库及答案-第2章-线性表

知识点:线性表的逻辑结构一、填空题1.线性表是一个有限序列,结点间的关系是的。
2.线性表的存储方式分为和。
3.线性表中的数据元素可以是简单的数据类型,也可以由若干组成。
4.每个操作在层次上尚不能用具体的某种程序语言写出具体的算法,而算法只有在确立之后才可以实现。
二、选择题1.( )线性表L=(a, a,…,a),下列说法正确的是()。
A.每个元素都有一个直接前驱和一个直接后继。
B.线性表中至少要有一个元素。
C.表中诸元素的排列顺序必须是由小到大或由大到小。
D.除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。
2.( )在线性表的下列运算中,不改变数据元素之间结构关系的运算是()。
A.插入B.删除C.排序D.定位3.( )线性表是具有n 个()的有限序列(n>=0)。
A.表元素B.字符C.数据元素D.数据项E.信息项4. ( )以下不属于线性结构的是( )。
A.栈 B.队列 C.串 D.二维数组 E.二叉树三、判断题1.()同一线性表的数据元素可以具有不同的特性。
2.()线性表的长度n就是表中数据元素的个数,当n=0时,称为空表。
3.()基本操作的实现可以在逻辑结构分析之后进行。
知识点:线性表的顺序存储结构一、填空题1.在线性表的顺序存储结构中,元素间的逻辑关系是通过决定的。
2.在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与______________有关。
3.向一个长度为n的顺序表的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动个元素。
4.从一个长度为n的顺序表中删除第i个元素(1≤i≤n)时,需向前移动个元素。
5.在顺序表中访问任意一结点的时间复杂度均为,因此,顺序表也称为的数据结构。
6.线性表的顺序存储是用一组连续的空间单元实现数据元素的存储,逻辑上相邻的元素的物理位置相邻。
7.向一个长度为n的顺序表中任意位置插入一个元素所需移动的平均次数为。
吉林大学数据结构_第二章 线性表

如何找指定位置的结点?
• 与顺序表不同,单链表无法直接访问指定 位置的结点,而是需要从哨位结点开始, 沿着next指针逐个结点计数,直至到达指定 位置。
操作
• • • • 存取 查找 删除 插入
存取算法
算法Find(k.item) /*将链表中第k个结点的字段值赋给item*/ F1. [k合法?] IF (k<1) THEN (PRINT “存取位置不合法”. RETURN.) F2. [初始化] p←head. i ←0. F3. [找第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) item←data(p). ▍ 存取算法的时间复杂性分析。P30
插入算法
算法Insert(k,item) /*在链表中第k个结点后插入字段值为item的结点*/ I1.[k合法?] IF (k<0) THEN (PRINT “插入不合法”. RETURN) I2.[初始化] p←head. i ←0. I3.[p指向第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “插入不合法”. RETURN. ) I4.[插入] s<= AVAIL. data(s) ←item. next(s) ←next(p). next(p) ←s. ▍
删除算法
算法Delete(k.item) /*删除链表中第k个结点并将其字段值赋给item*/ D1.[k合法?] IF (k<1) THEN (PRINT “删除不合法”. RETURN.) D2.[初始化] p←head. i ←0. D3.[找第k-1结点] WHILE (p ≠NULL AND i<k-1) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) D4.[删除] q ← next(p). next(p) ← next(q) . item←data(q). AVAIL<=q.▍
数据结构习题及答案 (2)

第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )(A)110 (B)108(C)100 (D)120参考答案:B2. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。
(A)64(B)63 (C)63.5 (D)7参考答案:C3.线性表采用链式存储结构时,其地址()。
(A) 必须是连续的 (B) 部分地址必须是连续的(C) 一定是不连续的 (D) 连续与否均可以参考答案:D4. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()(A)s->next=p;p->next=s; (B) s->next=p->next;p->next=s;(C)s->next=p->next;p=s; (D)p->next=s;s->next=p;参考答案:B5.在一个单链表中,若删除p所指结点的后续结点,则执行()(A)p->next=p->next->next; (B)p=p->next; p->next=p->next->next;(C)p->next=p->next; (D)p =p->next->next;参考答案:A6.下列有关线性表的叙述中,正确的是()(A)线性表中的元素之间隔是线性关系(B)线性表中至少有一个元素(C)线性表中任何一个元素有且仅有一个直接前趋(D)线性表中任何一个元素有且仅有一个直接后继参考答案:A7.线性表是具有n个()的有限序列(n≠0)(A)表元素(B)字符(C)数据元素(D)数据项参考答案:C二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。
()2.如果没有提供指针类型的语言,就无法构造链式结构。
()3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。
第2章 线性表习题及参考答案

第二章线性表习题一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
2.顺序存储的线性表可以按序号随机存取。
3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。
7.线性表的链式存储结构优于顺序存储结构。
8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。
10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。
二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( ) 。
(A) 一个有限序列,可以为空;(B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空;(D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的()个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n3.线性表采用链式存储时,其地址( ) 。
(A) 必须是连续的;(B) 部分地址必须是连续的;(C) 一定是不连续的;(D) 连续与否均可以。
4.用链表表示线性表的优点是()。
(A)便于随机存取 (B)花费的存储空间较顺序存储少(C)便于插入和删除 (D)数据元素的物理顺序与逻辑顺序相同5.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。
(A)单链表 (B)双链表 (C)单循环链表 (D)带头结点的双循环链表6.循环链表的主要优点是( )。
数据结构(C++版)课后答案 (王红梅)第2章 线性表

第 2 章线性表课后习题讲解1. 填空⑴在顺序表中,等概率情况下,插入和删除一个元素平均需移动()个元素,具体移动元素的个数与()和()有关。
【解答】表长的一半,表长,该元素在表中的位置⑵顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的存储地址是()。
【解答】108【分析】第5个元素的存储地址=第1个元素的存储地址+(5-1)×2=108⑶设单链表中指针p 指向结点A,若要删除A的后继结点(假设A存在后继结点),则需修改指针的操作为()。
【解答】p->next=(p->next)->next⑷单链表中设置头结点的作用是()。
【解答】为了运算方便【分析】例如在插入和删除操作时不必对表头的情况进行特殊处理。
⑸非空的单循环链表由头指针head指示,则其尾结点(由指针p所指)满足()。
【解答】p->next=head【分析】如图2-8所示。
⑹在由尾指针rear指示的单循环链表中,在表尾插入一个结点s的操作序列是();删除开始结点的操作序列为()。
【解答】s->next =rear->next; rear->next =s; rear =s;q=rear->next->next; rear->next->next=q->next; delete q;【分析】操作示意图如图2-9所示:⑺一个具有n个结点的单链表,在指针p所指结点后插入一个新结点的时间复杂度为();在给定值为x的结点后插入一个新结点的时间复杂度为()。
【解答】Ο(1),Ο(n)【分析】在p所指结点后插入一个新结点只需修改指针,所以时间复杂度为Ο(1);而在给定值为x的结点后插入一个新结点需要先查找值为x的结点,所以时间复杂度为Ο(n)。
⑻可由一个尾指针唯一确定的链表有()、()、()。
【解答】循环链表,循环双链表,双链表2. 选择题⑴线性表的顺序存储结构是一种()的存储结构,线性表的链接存储结构是一种()的存储结构。
数据结构线性表课后答案

第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在()情况下适用于使用链式结构实现。
A.需经常修改L中的结点值B.需不断对L进行删除插入C.L中含有大量的结点D.L中结点结构复杂答案:B解释:链表最大的优点在于插入和删除时不需要移动数据,直接修改指针即可。
(7)单链表的存储密度()。
A.大于1 B.等于1 C.小于1 D.不能确定答案:C解释:存储密度是指一个结点数据本身所占的存储空间和整个结点所占的存储空间之比,假设单链表一个结点本身所占的空间为D,指针域所占的空间为N,则存储密度为:D/(D+N),一定小于1。
数据结构--线性表习题及答案

数据结构--线性表习题及答案第⼆章线性表⼀、选择题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-iB. n-i+1C. n-i-1D. i5、⾮空的循环单链表head的尾结点p满⾜()。
A. p->next==headB. p->next==NULLC. p==NULLD. p==head6、链表不具有的特点是()。
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;D. q->next=p->next;q->prior=p;p->next=q;p->next=q;8、线性表采⽤链式存储时,结点的存储地址()。
A. 必须是连续的B. 必须是不连续的C. 连续与否均可D. 和头结点的存储地址相连续9、在⼀个长度为n的顺序表中删除第i个元素,需要向前移动()个元素。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19
将全局变量及函数提前说明:
#include<stdio.h> #include<stdlib.h> typedef struct liu{char data; struct liu*next;}test; liu *p,*q,*head; //一般需要3个指针变量 int n ; // 数据元素的个数 int m=sizeof(test); /*结构类型定义好之后,每个变量
pa=La-->next; pb=Lb-->next; Lc=pc=La; //初始化 while(pa&&pb) //将pa 、pb结点按大小依次插入C中 { if(pa->data<=pb->data) {pc->next=pa; pc=pa; pa=pa->next;} else {pc->next=pb; pc=pb; pb=pb->next} } pc->next = pa?pa:pb ; //插入剩余段
附2:教材P22关于顺序表的抽象定义:
Typedef struct {
ElemType *elem; int length;
//若后面不再用,可省略结构名
//表基址 //表长(特指元素个数)
int
}SqList;
listsize;
//表当前存储容量(字节数)
16
补充:结构类型的C语言表示法 ④ 介绍三个有用的库函数(都在<stdlib.h> 中):
H
31
ZHAO 7
∴头指针的值是31
存储地址 1 7 13 19 25 31 37 43
数据域 LI QIAN SUN WANG WU ZHAO ZHENG ZHOU
指针域 43 13 1 NULL 37 7 19 25
9
上例链表的逻辑结构示意图有以下两种形式: ①
H ZHAO QIAN SUN LI WANG
3
3.顺序存储
(续上堂课)
2.3 线性表的链式表示和实现
2.3.1 链表的表示 2.3.2 链表的实现 2.3.3 链表的运算效率分析 本节小结
作 业
4
2.3.1 链表的表示
1. 链式存储特点
2. 与链式存储有关的术语
3. 补充:结构数据类型及其C语言表示法
5
1. 链式存储特点:逻辑上相邻,物理上不一定相邻
问2:结构变量test的首地址(指针p)是多少? p=(test*)malloc(m)
问3:怎样删除结构变量test?只能借助其指针删除! free(p)
17
2.3.2 链表的实现
1. 2. 3. 4. 5. 6. 单链表的建立和输出 单链表的修改 单链表的插入 单链表的删除 应用举例 其它链表形式
Pa
3
Pa 5 Pb
Pa 8
Pa
11 ^ Pb
Lb
Pb
2
Pc 2 Pc
6 Pc
3
8
9
11 ^
Lc
Pc 5 … 11 ^
29
算法实现: Void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) { //按值排序的单链表LA,LB,归并为LC后也按值排序
sum ++;
22
2. 单链表的修改(或读取)
难点:单链表中想取得第i个元素,必须从头指针出 发寻找(顺藤摸瓜),不能随机存取 。
思路:要修改第i个数据元素,关键是要先找到该结 点的指针p,然后用p->data=new_value 即可。 核心语句:见教材P29的GetElem_L函数说明
Status GetElem_L(LinkList L, int i, ElemType &e) {P=L->next; j=1; while(p&&j<i){p=p->next; ++j;} if(!p||j>i)return ERROR; e=p->data; return OK;}
数据结构课程的内容
逻辑结构唯一
存储结构不唯一
运算的实现依赖 于存储结构
1
第2章 线性表
2.1 线性表的逻辑结构
2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.4 应用举例
作业
2
上堂课要点回顾
1. 线性结构(包括表、栈、队、数组)的定义和特点: 仅一个首、尾结点,其余元素仅一个直接前驱和一个 直接后继。 2. 线性表 逻辑结构:“一对一” 或 1:1 存储结构:顺序、链式 运 算 :修改、插入、删除 特征:逻辑上相邻,物理上也相邻; 优点:随机查找快 O(1) 缺点:插入、删除慢 O(n)
讨论4. 链表的数据元素有两个域,不再是简单数据 类型,编程时该如何表示? 答: 因每个结点至少有两个分量,所以要采用结构数 据类型。
什么是结构类型?如何书写表达? ——补充C语言内容
12
3. 补充结构数据类型及其C语言表示法 以26个字母的链表为例,每个结点都有两个分量: 字符型 指针型 data *next test
首元结点是指链表中存储线性表第一个数据元素a1
的结点。
8
例: 一个线性表的逻辑结构为:
(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存 储结构用单链表表示如下,请问其头指针的值是多少?
答:头指针是指向 链表中第一个结点 的指针,因此关键 是要寻找第一个结 点的地址。
24
4. 单链表的删除
在链表中删除某元素的示意图如下: p a × b × c
p->next
(p->next) -> next
删除步骤(即核心语句): q = p->next; //保存b的指针,靠它才能指向c p->next=q->next; //a、c两结点相连 free(q) ; //删除b结点,彻底释放
思考: 省略free(q)语句行不行?
25
5.应用举例:两个链表的归并(教材P31)
算法要求: 已知:线性表 A、B,分别由单链表 LA , LB 存储, 其中数据元素按值非递减有序排列, 要求:将 A ,B 归并为一个新的线性表C , C 的数据 元素仍按值非递减排列 。设线性表 C 由单链表 LC 存储。 假设:A=(3,5,8,11),B=(2,6,8,9,11) 预测:合并后 C =( 2 , 3 , 5 , 6 , 8 , 8 , 9 , 11,11 )
4)头指针、头结点和首元结点
以教材P27 图2.5和图2.6内容为例说明。
7
何谓头指针、头结点和首元结点?
头指针 头结点 首元结点
a1
头指针是指向链表中第一个结点(或为头结点或为
首元结点)的指针。 单链表可由一个头指针唯一确定。
头结点是在链表的首元结点之前附设的一个结点;
数据域内只放空表标志和表长等信息;
18
1. 单链表的建立和输出 实例:用单链表结构来存放26个英文字母组成的线
性表(a,b,c,…,z),请写出C语言程序。 难点分析:每个数据元素在内存中是“零散”存放的, 其首地址怎么找?又怎么一一链接? 实现思路:先开辟头指针,然后陆续为每个数据元 素开辟存储空间并赋值,并及时将地址送给前面的 指针。
的长度就固定了,m求一次即可*/
20
void build()
//字母链表的生成。要一个一个慢慢链入
{ int i; head=(test*)malloc(m); //m=sizeof(test) 前面已求出 p=head; for(i=1;i<26;i++) //因尾结点要特殊处理,故i≠26 { p->data=i+„a‟-1; // 第一个结点值为字符a p->next=(test*)malloc(m); //为后继结点开新空间! p=p->next;} //让指针变量P改为指向后继结点 p->data=i+„a‟-1; //最后一个元素要单独处理 p->next=NULL ;} //单链表尾结点的指针域要置空! 新手特别容易忘记!!
26
用链表可表示为:
La 头结点
3
Lb
5 6
8 8
11 9
/\
2
11
/\
Lc
2 8
8
3
9
5
11
6
11
/\
27
算法分析:
算法主要包括:搜索、比较、插入三个操作: 搜索:需要两个指针搜索两个链表;
比较:比较结点数据域中数据的大小;
插入:将两个结点中数据小的结点插入新链表。
28
Pa、Pb用于搜索La和Lb, Pc指向新链表当前结点 La
14
练习: 设p为指向链表的第i个元素的指针,则第i个元素的 数据域写为 p->data ,指针域写为 p->next 。
ai的值
ai+1的地址
至此应可看懂教材P28对于单链表的抽象描述,和
教材P22关于顺序表的抽象定义。
15
附1:教材P28对于单链表的抽象描述:
Typedef struct Lnode { ElemType data; struct Lnode *next; }Lnode, *LinkList; //数据域 //指针域 // *LinkList为Lnode类型的指针
23
3. 单链表的插入
在链表中插入一个元素的示意图如下: p a b p a b
p->next
插入步骤(即核心语句): Step 1:s->next=p->next; Step 2:p->next=s ; 思考:步骤1和2能互换么?