第二章 线性表
编程题 判断题 和部分选择题 在最后
1. 线性结构反映结点间的逻辑关系是 1:1,相邻数据元素之间存在序偶关系。
2. 线性结构包括:线性表(最典型、最常用)、栈、队列、字符串和数组。
3. 线性结构的特点:在数据元素的非空有限集中
存在唯一的一个被称作 “第一个” 的数据元素;
存在唯一的一个被称作 “最后一个” 的数据元素;
除第一个外,集合中的每个数据元素均只有一个直接前驱;
除最后一个之外,集合中每个数据元素均只有一个直接后继。
4. 线性表:n个具有相同特性的数据元素的有限序列
5. 同一线性表中的元素必定具有相同特性
6. 进一步说明:⑴ 线性表的基本操作根据实际应用而定;⑵ 复杂的操作可以通过基本操作的组合来实现;⑶ 对不同的应用,操作的接口可能不同。
7. 线性表的顺序存储表示:指的是用一组地址连续的存储单元依次存储线性表中的数据元素。
特点:(1)逻辑上相邻的数据元素,物理上也相邻;
(2)当表中首元素在存储器中的位置已知时,则可求出线性表中其他元素的存放位置。
8.
9. 顺序表的基本操作
(1). 初始化顺序表L
(2). 销毁顺序表L
(3). 清空顺序表L
(4). 求顺序表L的长度
(5). 判断顺序表L是否为空
(6). 获取顺序表L中的某个数据元素内容
(7). 检索值为e的数据元素
(8). 在顺序表L中插入一个数据元素
(9). 删除顺序表L中第i个数据元素
10. 在顺序表中插入一个数据元素:当插入的位置为第i个结点时,需要移动 n-i+1 个元素。
11. 删除顺序表中第i个数据元素:当删除的位置为第i个结点时,需要移动 n-i 个元素。
12.
13. 线性表链式存储结构的特点:
(1)用一组任意的存储单元存储线性表的数据元素。
存储结点的地址可以连续或不连续
即:逻辑上相邻的数据元素在物理上不一定相邻
(2)为此,对线性表中的每一个数据元素,都需用两部分来存储:
一部分用于存放数据元素本身的信息,称为数据域(Data Field);
另一部分用于存放直接前驱或直接后继的地址(指针),称为指针域(Link Field)。
14. 结点(Node):由数据域和指针域两部分组成。
15. 链表的类型:单链表(一个指针域);双链表(两个指针域);循环链表(首尾相接)。
16.
17. 如何表示空表?
无头结点:头指针为NULL时;有头结点:当头结点的指针域为空时。
18. 在链表中设置头结点有什么好处?
(1)便于首元结点的处理
增加了头结点后,首元结点的地址保存在头结点的指针域中,则对链表的第一个数据元素的操作与其他数据元素相同,无需进行特殊处理
(2)便于空表和非空表的统一处理
增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针。
对于不带头结点的单链表,插入或删除操作需要区分操作的位置是第一个结点还是其他结点。两种情况的操作不同,第一种情况需要更改头指针。
19.
20. 获得后继元素
21.
22. 单链表基本操作的实现
23. 单链表的建立
24. 链表的运算时间效率分析
查找:因线性链表只能顺序存取,即在查找时要从头指针找起,查找的时间复杂度为 O(n);
插入和删除:因线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为 O(1);
但是对于指定位置的插入和删除操作,由于要从头查找前驱结点,所耗时间复杂度为 O(n) 。
25. 链表的优缺点
优点:数据元素的个数可以自由扩充;
插入、删除等操作不必移动数据,只需修改链接指针,修改效率较高
缺点:存储密度小;
存取效率不高,必须采用顺序存取,即存取数据元素时,只能按链表的顺序进行访问(顺藤 摸瓜)。
26. 循环链表:将单链表中最后一个结点的指针域指向头结点,整个链表形成一个环。
特点:从表中任一结点出发均可找到表中其他结点
27. 循环链表与单链表的区别:查找结束条件
单链表 ----- p ->next == NULL
循环链表----- p->next == head
28. 循环链表如何查找开始结点和终端结点?
开始结点:head->next 终端结点: p->next == head
开始结点:rear->next->next 终端结点:rear
29.
30. 双向循环链表:
(a) 空双向循环链表 L->next=L L->prior=L
(b) 非空双向循环链表 d->next->prior = d->prior->next = d
31.
32.
33.
34. 线性表的合并 & 多项式运算
35. 线性表的逻辑顺序与物理顺序总是一致的。 F
线性表的顺序存储表示优于链式存储表示。 F
线性表若采用链式存储表示时,所有结点的地址可连续可不连续。 T
每种数据结构都应具备三种基本运算:插入、删除和搜索。 T
线性表的特点是每个元素都有一个前驱和一个后继。 F
顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。 F
36. 线性表( a1,a2,…,an)有两种存储结构:(A)和(B)。(A)存储密度较大,(B)存储利用率较高,(A)可随机存取,(B)不可随机存取,(B)插入和删除操作比较方便。
A:顺序存储结构 B:链式存储结构
37. 带头结点的双循环链表L中只有一个元素结点的条件:L->next->next==L
38. 在单链表L中,指针p所指结点有后继结点的条件是:p->next!=NULL
39. 若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用( A )存储方式最节省时间。
A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表
编程题
1. 写出顺序创建单链表的程序,即按从a1到an顺序创建。
2. 已知一个带头结点的单链表L,请编程求该单链表中数据元素的个数。
3. 设有一带头结点的单链表,编程将链表颠倒过来,即(a1...an)逆置为(an...a1),要求不用另外的数组或结点完成.
4.请写一个算法将顺序存储结构的线性表(a1...an)逆置为(an...a1),要求使用最少的附加空间。
1.void CreateList_R(LinkList &L,int n){
LinkList r,p;
L=new LNode;
L->next=NULL;
r=L;
for(int i=0;i<n;++i){
p=new LNode; //生成新节点
cin>>p->data;
p->next=NULL;
r->next=p; //插入到表尾
r=p; //r指向新的尾节点
}
}
2.
int Listlength(LinkList L)
{
int sum=0;
LinkList p=L->next;
while(p)
{
p=p->next;
sum++;
}
return sum;
}
3.
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函数*/
4.请写一个算法将顺序存储结构的线性表(a1...an)逆置为(an...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;
}
}∥算法结束