线性表的链式存储结构及其运算
线性表 知识点总结

线性表知识点总结线性表的特点:1. 有序性:线性表中的元素是有序排列的,每个元素都有唯一的前驱和后继。
2. 可变性:线性表的长度是可变的,可以进行插入、删除操作来改变表的元素数量。
3. 线性关系:线性表中的元素之间存在明确的前驱和后继关系。
4. 存储结构:线性表的存储结构有顺序存储和链式存储两种方式。
线性表的操作:1. 查找操作:根据元素的位置或值来查找线性表中的元素。
2. 插入操作:将一个新元素插入到线性表中的指定位置。
3. 删除操作:将线性表中的某个元素删除。
4. 更新操作:将线性表中的某个元素更新为新的值。
线性表的顺序存储结构:顺序存储结构是将线性表的元素按照其逻辑顺序依次存储在一块连续的存储空间中。
线性表的顺序存储结构通常采用数组来实现。
数组中的每个元素都可以通过下标来访问,因此可以快速的进行查找操作。
但是插入和删除操作会导致元素位置的变动,需要进行大量数据搬移,效率较低。
线性表的链式存储结构:链式存储结构是将线性表的元素通过指针相连,形成一个链式结构。
每个元素包含数据和指向下一个元素的指针。
链式存储结构不需要连续的存储空间,可以动态分配内存,适合插入和删除频繁的场景。
但是链式结构的元素访问不如顺序结构高效,需要通过指针来逐个访问元素。
线性表的应用场景:1. 线性表适用于数据元素之间存在明确的前后关系,有序排列的场景。
2. 顺序存储结构适用于元素的插入和删除操作较少,对元素的随机访问较频繁的场景。
3. 链式存储结构适用于插入和删除操作较频繁的场景,对元素的随机访问较少。
线性表的操作的时间复杂度:1. 查找操作:顺序存储结构的时间复杂度为O(1),链式存储结构的时间复杂度为O(n)。
2. 插入和删除操作:顺序存储结构的时间复杂度为O(n),链式存储结构的时间复杂度为O(1)。
线性表的实现:1. 顺序存储结构的实现:使用数组来存储元素,通过下标来访问元素。
2. 链式存储结构的实现:使用链表来实现,每个元素包含数据和指向下一个元素的指针。
第二章 线性表

(7)已知顺序表L中的元素有序递增,设计算法将元素x插入到L 种,并依旧保持其有序递增;设计一个高效的算法,删除顺序表 中所有值为x的元素,要求空间复杂度为O(1)。(基于顺序表基本 操作的运算) (8)(2010年13分)设将n(n>1)个整数存放到一维数组R中。试 设计一个在时间和空间两方面尽可能有效的算法,将R中保有的 序列循环左移P(0<p< n)个位置,即将R中的数据由(X0 X1 ……Xn-1)变换为(Xp Xp+1 ……Xn-1 X0 X1……Xp-1) 要求: (1)给出算法的基本设计思想。 (2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处 给出注释。 (3)说明你所设计算法的时间复杂度和空间复杂度
2 3 4 5 6
30 60 20 40
6 -1 3 1
h
10
20Βιβλιοθήκη 304050
60∧
8、例题: (1)链表不具有的特点是( )。 A.可随机访问任一元素 B.插入删除不需要移动元素 C.不必事先估计存储空间 D.所需空间与线性表长度成正比 (2)在具有n个结点的单链表中插入一个新结点并使链表仍然有 序的时间复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2) (3)对于由n个元素组成的线性表,创建一个有序单链表的时间 复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2)
(4)设A是一个线性表,采用顺序存储结构。在等概率情况下, 平均插入一个元素需要移动多少个元素?若元素插在ai和ai+1之 间的概率为(n-i)/n(n-1)/2,则平均插入一个元素需要移动多少 个元素? (5)以顺序表作为存储结构,实现线性表的就地逆置;判断回 文;设计一个时间复杂度为O(n)的算法,将顺序表中所有元素循 环左移k位;设计一个时间复杂度为O (n)的算法,将顺序表中所 有元素循环右移k位;(基于逆置操作的运算) (6)将顺序表中的元素调整为左右两部分,左边元素为奇数, 右边元素为偶数,要求算法的时间复杂度为O (n);将顺序表A拆 分为B 和C,其中B中的元素小于0,C中的元素大于0;将有序表A和 有序表B合并为C,合并后C依然是有序的。(基于对顺序表的拆分 和合并操作的运算)
cy24 线性表--循环链表解读

2)链表: n 个结点由指针链组成一个链表。 它是线性表的链式存储映像, 称为线性表的链式存储结构。 3)单链表、双链表、循环链表: • 结点只有一个指针域的链表,称为单链表或线性链表 • 有两个指针域的链表,称为双链表(但未必是双向链表) • 首尾相接的链表称为循环链表。
拓展:静态链表 静态链表借用一维数组来描述线性链表。数组中 的一个分量表示一个结点,同时使用游标(指示器cur即 为伪指针)代替指针以指示结点在数组中的相对位置。 数组中的第0个分量可以看成头结点,其指针域指示静 态链表的第一个结点。 这种存储结构仍然需要预先分配一个较大空间,但 是在进行线性表的插入和删除操作时不需要移动元素, 仅需要修改“指针”,因此仍然具有链式存储结构的主 要优点。
下图给出了一个静态链表的示例。图(a)是一个修改之前的 静态链表,图(b)是删除数据元素“陈华”之后的静态链表,图(c) 插入数据元素“王华”之后的静态链表,图中用阴影表示修改 的游标。
数据域 0 1 2 3 4 5 6 7 8 9 (a) 张斌 刘丽 李英 陈华 王奇 董强 王萍 游标域 1 2 3 4 5 6 7 0 0 1 2 删除“陈华” 3 4 5 6 7 8 9 (b) 张斌 刘丽 李英 陈华 王奇 董强 王萍 数据域 游标域 1 2 3 5 5 6 7 0 0 1 在 “刘丽” 之后 2 插入“王华” 3 4 5 6 7 8 9 (c) 王奇 董强 王萍 王华 6 7 0 3 张斌 刘丽 李英 数据域 游标域 1 2 8 5
例:实现将两个线性表heada(a1,a2,a3,…an)和 headb(b1,b2,b3,…bn)链接成一个线性表的运算。 假设线性表为单循环链表。 linklist connect(linklist heada,linklist headb) //若heada,headb分别指向表头结点 { linklist p=heada->next; while (p->next!=heada) p=p->next; //p指向表a的尾结点 p->next=headb->next; //链接表a、b while (p->next!=headb) p=p->next; free(headb); p->next=heada; 讨论: return(heada); 有没有更快的方法? }
第3章线性表的链式存储

(a) 空循环链表
L
a1
a2
...
an
(b) 非空循环链表
3.1.3 双向链表
在单链表结点中只有一个指向其后继结点的next 指针域,而找其前驱则只能从该链表的头指针开始,顺 着各结点的next指针域进行查找,也就是说找后继的时 间复杂度是O(1),找前驱的时间复杂度是O(n)。如果也 希望找前驱像后继那样快,则只能付出空间的代价:每 个结点再加一个指向前驱的指针域prior,结点的结构修 改为下图,这样链表中有两个方向不同的链,用这种结 点组成的链表称为双向链表。
1.带头结点的单链表 2.不带头结点的单链表
3.3.3 单链表插入操作的实现
单链表的插入操作是指在表的第i个位置结点处插入 一个值为data的新结点。插入操作需要从单链表的第一个结 点开始遍历,直到找到第i个位置的结点。插入操作分为在 结点之前插入的前插操作和在结点之后插入的后插操作。
1.前插操作 2.后插操作
2.整数型单链表算法
3.不带头结点的单链表算法
3.2.2 尾插法单链表的创建实现
用头插法实现单链表的创建,比较简单,但读入的 数据元素的顺序与生成的链表中元素的顺序是相反的。若希 望两者次序一致,则用尾插法创建单链表。为了快速找到新 结点插入到链表的尾部位置,所以需加入一个尾指针r用来 始终指向链表中的尾结点。初始状态:头指针L和尾指针r均 为空,把各数据元素按顺序依次读入,申请结点,将新结点 插入到r所指结点的后面,然后r指向新结点,直到读入结束 标志为止。
3.2.2 尾插法单链表的创建实现
L
插入P前的尾指针 插入P后的尾指针
r
3
4
P1
x^
2
3.3 单链表运算的实现
线性表的存储结构定义及基本操作

一、实验目的:. 掌握线性表的逻辑特征. 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算. 熟练掌握线性表的链式存储结构定义及基本操作. 理解循环链表和双链表的特点和基本运算. 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力二、实验内容:(一)基本实验内容(顺序表):建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:. 创建一个新的顺序表,实现动态空间分配的初始化;. 根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;. 根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);. 利用最少的空间实现顺序表元素的逆转;. 实现顺序表的各个元素的输出;. 彻底销毁顺序线性表,回收所分配的空间;. 对顺序线性表的所有元素删除,置为空表;. 返回其数据元素个数;. 按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;. 按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;. 判断顺序表中是否有元素存在,对判断结果进行返回;. 编写主程序,实现对各不同的算法调用。
2.实现要求:对顺序表的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价;. “初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;. “位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;. “位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;. “逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;. “输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;. “销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;. “置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;. “求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;. “按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值. “按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;. “判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
线性表的链式存储结构实验报告

实验一:线性表的链式存储结构【问题描述】某项比赛中,评委们给某参赛者的评分信息存储在一个带头结点的单向链表中,编写程序:(1)显示在评分中给出最高分和最低分的评委的有关信息(姓名、年龄、所给分数等)。
(2)在链表中删除一个最高分和一个最低分的结点。
(3)计算该参赛者去掉一个最高分和一个最低分后的平均成绩。
【基本要求】(1)建立一个评委打分的单向链表;(2)显示删除相关结点后的链表信息。
(3)显示要求的结果。
【实验步骤;】(1)运行PC中的Microsoft Visual C++ 6.0程序,(2)点击“文件”→“新建”→对话窗口中“文件”→“c++ Source File”→在“文件名”中输入“X1.cpp”→在“位置”中选择储存路径为“桌面”→“确定”,(3)输入程序代码,程序代码如下:head=create(PWRS);printf("所有评委打分信息如下:\n");print(head);//显示当前评委打分calc(head);//计算成绩printf("该选手去掉 1 最高分和 1 最低分后的有效评委成绩:\n");print(head);//显示去掉极限分后的评委打分}void input(NODE *s) #include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <iostream.h>#include <conio.h>#define NULL 0#define PWRS 5 //定义评委人数struct pw //定义评委信息{ char name[6];float score;int age;};typedef struct pw PW;struct node //定义链表结点{struct pw data;struct node * next;};typedef struct node NODE;//自定义函数的声明NODE *create(int m); //创建单链表int calc(NODE *h); //计算、数据处理void print(NODE *h); //输出所有评委打分数据void input(NODE *s);//输入评委打分数据void output(NODE *s);//输出评委打分数据void main(){NODE *head;float ave=0;float sum=0;{printf("请输入评委的姓名: ");scanf("%S",&s->);printf("年龄: ");scanf("%d",&s->data.age);printf("打分: ");scanf("%f",&s->data.score);printf("\n");}void output(NODE *s){printf("评委姓名: %8s ,年龄: %d,打分: %2.2f\n",s->,s->data.age,s->data.score);}NODE *create(int m){NODE *head,*p,*q;int i;p=(NODE*)malloc(sizeof(NODE));head=p;q=p;p->next=NULL;for(i=1;i<=m;i++){p=(NODE*)malloc(sizeof(NODE));input(p);p->next=NULL;q->next=p;q=p;}return (head);}void print(NODE *h){ for(int i=1;((i<=PWRS)&&(h->next!=NULL));i++){h=h->next;output(h); }printf("\n");}int calc(NODE *h){NODE *q,*p,*pmin,*pmax;float sum=0;float ave=0;p=h->next; //指向首元结点pmin=pmax=p; //设置初始值sum+=p->data.score;p=p->next;for(;p!=NULL;p=p->next){if(p->data.score>pmax->data.score) pmax=p;if(p->data.score<pmin->data.score) pmin=p;sum+=p->data.score;}cout<<"给出最高分的评委姓名:"<<pmax-><<"年龄: "<<pmax->data.age<<"分值:"<<pmax->data.score<<endl;cout<<"给出最低分的评委姓名:"<<pmin-><<"年龄: "<<pmin->data.age<<"分值:"<<pmin->data.score<<endl;printf("\n");sum-=pmin->data.score;sum-=pmax->data.score;for (q=h,p=h->next;p!=NULL;q=p,p=p->next){if(p==pmin){q->next=p->next; p=q;}//删除最低分结点if(p==pmax) {q->next=p->next; p=q;}//删除最高分结点}ave=sum/(PWRS-2);cout<<"该选手的最后得分是:"<<ave<<endl;return 1;}实验结束。
《数据结构》课程课件第二章线性表

Step2:数据域赋值
插入后: Step3:插入(连接)
X q
(1)式和(2)式的顺序颠倒,可以吗?
4、插入元素(在第i个元素之前插入元素e)
为什么时间复杂度不再是O(1)?
第i-1个元素
第i个元素
p
s
新插入元素
5、删除p所指元素的后继元素
P
删除前:
P->next P->next->next
删除:
五、线性表ADT的应用举例
Void mergelist(list La,list Lb,list &Lc)
{ //已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc中的元素也按值非递减排列
例: 将两个各有n个元素的有序表归并成一个有序表, 其最小的比较次数是( )。 A、n B、2n-1 C、2n D、n-1
三、线性表的ADT
四、线性表的分类
五、线性表ADT的应用举例
例1:已知有线性表L,要求删除所有X的出现
五、线性表ADT的应用举例
例2: 已知有两个分别有序的线性表(从小到大),要 求合并两个线性表,且合并后仍然有序。——归并 方法1: 合并,再排序O((m+n)2)
方法2: 归并,利用分别有序的特点O((m+n))
二、线性表上常见的运算
8、删除 Delete(L,i):删除线性表的第i个元素 删除前 a1 a2 … ai-1 ai ai+1 … an 删除后 a1 a2 … ai-1 ai+1 … an 9、判断是否为空 Empty(L):线性表空,则返回TRUE, 否则FALSE 10、输出线性表 Print(L):输出线性表的各个元素 11、其它操作 复制、分解、合并、分类等
第3章 线性表及其存储结构

链式存储结构,既可用来表示线性结构, 也可用来表示非线性结构。线性表的链式存 储结构,称为线性链表。 对线性链表而言,它不要求逻辑上相邻的 元素在物理位置上也相邻。其存储单元既可 以是连续的,也可以是不连续的,甚至可以 零散分布在内存中的任何位置上。 通常,为了适应线性链表的存储,计算机 的存储空间被划分成一个一个的小块,每一 小块占若干字节,这些小块就是存储结点。 存储结点的结构,如图 3-2 所示。
在稍微复杂的线性表中,一个数据元素还 可以由若干个数据项组成。例如,某班的学 生情况登记表是一个复杂的线性表,表中每 一个学生的情况就组成了线性表中的每一个 元素,每一个数据元素包括学号、姓名、性 别、入学成绩4个数据项。
3.2线性表的顺序存储及其运算
3.2.1 线性表的顺序存储 线性表的顺序存储结构称为顺序表。
第3章 线性表及其存储结构
3.1线性表的基本 概念 3.2线性表的顺序 存储及运算 3.3线性表的链式 存储及运算
3.1 线性表的基本概念
线性表是由 n (n≥0)个数据元素 a1 ,a2 ,…,an 组成的一个有限序列。表中的每一个数据元 素,除了第一个外,有且只有一个前件;除 了最后一个外,有且只有一个后件。即线性 表或是一个空表或可以表示为:
(a1 ,a2 ,…,ai ,…,an)其中 ai(i=1,2,…,n) 是属于数据对象的元素,通常也称其为线性 表中的一个结点。
数据元素在线性表中的位置,只取决于它们 自己的序号 。 非空线性表的结构特征为: ① 有且只有一个根结点a1 ,它无前件;
② 有且只有一个终端结点an ,它无后件;
③ 除根结点与终端结点外,其他所有结点 有且只有一个前件,也有且只有一个后件。线 性表中结点的个数n称为线性表的长度。当 n=0时,称为空表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
讨论1. 在链表中设置头结点有什么好处?
答:头结点即在链表的首元结点之前附设的一个结点,该结
点的数据域可以为空,也可存放表长度等附加信息,其作用是 为了对链表进行操作时,可以对空表、非空表的情况以及对首 元结点进行统一处理,编程更方便。
讨论2. 如何表示空表?
4
一、 单链表的存储结构
1、单链式及表示方法 (1)单链表:构成链表的结点只有一个指向直接后继结点 的指针。其结构特点:逻辑上相邻的数据元素在物理上 不一定相邻。 如何实现? 通过指针来实现! 让每个存储结点都包含两部分:数据域和指针域
样式: 数据域 指针域 或 data next
数据域:存储 元素数值数据
node.data='a';node.next=q
方式2:p指向结点首地址,然后 p->data='a'; p->next=q;
方式3: p指向结点首地址,然后 (*p).data='a'; (*p).next=q
答:因每个结点至少有两个分量,且数据类型通常不一致,所 以要采用结构数据类型。
以26个字母的链表为例,每个结点都有两个分量:
字符型 指针型 p ‘a’
q ‘b’
p
data *next 设每个结点用变量node表示,其指
针用p表示,两个分量分别用data和
node
*next表示,这两个分量如何赋值?
方式1: 直接表示为
head
a1
循环链表示意图: head
a2
……
an
8
4)头指针、头结点和首元结点的区别 示意图如下:
head
info
a1
a2
…
an ^
头指针 头结点 首元结点
头指针是指向链表中第一个结点(或为头结点、或为首元 结点)的指针;
头结点是在链表的首元结点之前附设的一个结点;数据域 内只放空表标志和表长等信息,它不计入表长度。
2.3 线性表的链式存储结构及其运算
一、单链表的存储结构 二、 单 链表的操作实现 三、链表的运算效率分析
1
2.3 线性表的链式表示和实现
线性表的顺序表示的特点是用物理位置上的 邻接关系来表示结点间的逻辑关系,这一特点 使我们可以随机存取表中的任一结点,但它也 使得插入和删除操作会移动大量的结点.为避免 大量结点的移动,我们介绍线性表的另一种存 储方式, 链式存储结构,简称为链表(Linked List)。
由 其直接前驱结点的链域的值 指示。
7
(2) 与链式存储有关的术语:
1)结点:数据元素的存储映像。由数据域和指针域两部分组成;
2)链表: n 个结点由指针链组成一个链表。它是线性表的链式 存储映像,称为线性表的链式存储结构。
3)单链表、双链表、多链表、循环链表: • 结点只有一个指针域的链表,称为单链表或线性链表; • 有两个指针域的链表,称为双链表(但未必是双向链表); • 有多个指针域的链表,称为多链表; • 首尾相接的链表称为循环链表。
若设计的单链表带头结点,则无论是在第一 个数据元素结点前插入还是在其他数据元素结点 前插入都不会改变头指针的数值。
若设计的单链表不带头结点,则在第一个数据 元素结点前插入与在其他数据元素结点前插入其 算法的处理方法不同。在单链表中删除一个结点 时类似。因此,单链表一般构造成带头结点的单 链表。
13
讨论: 链表的数据元素有两个域,不再是简单数据类 型,编程时该如何表示?
data link
3
其中:data域是数据域,用来存放结点的值。 next是指针域(亦称链域),用来存放结点的直接 后继的地址(或位置)。
链表正是通过每个结点的链域将线性表的n个结 点按其逻辑次序链接在一起的。由于上述链表的每 一个结只有一个链域,故将这种链表称为单链表 (Single Linked)。
6
链表存放示意图如下:
head
a1
a2
……
an \
例:请画出26个英文字母表的链式存储结构。 解:该字母表的逻辑结构为:( a, b, … ,y, z)
该字母表在内存中链式存放的样式举例如下:
讨论1 :每个存储结点都包含两部分:数据域和 指针域(链域) 。 讨论2:在单链表中,除了首元结点外,任一结点的存储位置
指针域:存储直接后继的 存储位置
设计思想:牺牲空间效率换取时间效率
5
定义单链表结点的结构体如下: typedef struct Node {
DataType data; struct Node *next; }SLNode; 其中,data域用来存放数据元素,next域用来存放指向下 一个结点的指针。
答:无头结点时,当头指针的值为空时表示空表; 有头结点时,当头结点的指针域为空时表示空表。
头指针
头指针 头结点
^
^
无头结点
有头结点
头结点不计入链 表长度!
10
2、带头结点单链表和不带头结点单链表的比较 例: 一个线性表的逻辑结构为:
(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其 存储结构用单链表表示如下,请问其头指针的值是多少?
存储地址 1 7 13 19 25 31 37 43
数据域 LI
QIAN SUN WANG WU ZHAO ZHENG ZHOU
指针域 43 13 1
NULL 37 7 19 25
答:头指针是指向链 表中第一个结点的指 针,因此关键是要寻 找第一个结点的地址。
H
31
ZHAO 7
称:头指针H的值是31
11
上例链表的逻辑结构示意图有以下两种形式:
①
H
ZHAO
QIAN
SUN
LI
ZHOU
②
H
WU ZHAO
ZHENG
WANG /\
QIAN
SUN
LI
ZHOU
WU
ZHENG
WANG /\
区别:① 无头结点 ② 有头结点
头结点不计入 链表长度!
12
对比带头结点的单链表的插入、删除过程和 不带带头结点的单链表的插入、删除过程,可以 得知:
2
2.3.1 线性链表
链表是指用一组任意的存储单元来依次存放线性 表的结点,
特点:这组存储单元即可以是连续的,也可以是 不连续的,甚至是零散分布在内存中的任意位置 上的。链表中结点的逻辑次序和物理次序不一定 相同。
为了能正确表示结点间的逻辑关系,在存储每 个结点值的同时,还必须存储指示其后继结点的 地址(或位置)信息,这个信息称为指针 (pointer)或链(link)。这两部分组成了链表中 的结点结构: