第3讲 线性表的链式存储结构-1

合集下载

线性表 知识点总结

线性表 知识点总结

线性表知识点总结线性表的特点:1. 有序性:线性表中的元素是有序排列的,每个元素都有唯一的前驱和后继。

2. 可变性:线性表的长度是可变的,可以进行插入、删除操作来改变表的元素数量。

3. 线性关系:线性表中的元素之间存在明确的前驱和后继关系。

4. 存储结构:线性表的存储结构有顺序存储和链式存储两种方式。

线性表的操作:1. 查找操作:根据元素的位置或值来查找线性表中的元素。

2. 插入操作:将一个新元素插入到线性表中的指定位置。

3. 删除操作:将线性表中的某个元素删除。

4. 更新操作:将线性表中的某个元素更新为新的值。

线性表的顺序存储结构:顺序存储结构是将线性表的元素按照其逻辑顺序依次存储在一块连续的存储空间中。

线性表的顺序存储结构通常采用数组来实现。

数组中的每个元素都可以通过下标来访问,因此可以快速的进行查找操作。

但是插入和删除操作会导致元素位置的变动,需要进行大量数据搬移,效率较低。

线性表的链式存储结构:链式存储结构是将线性表的元素通过指针相连,形成一个链式结构。

每个元素包含数据和指向下一个元素的指针。

链式存储结构不需要连续的存储空间,可以动态分配内存,适合插入和删除频繁的场景。

但是链式结构的元素访问不如顺序结构高效,需要通过指针来逐个访问元素。

线性表的应用场景:1. 线性表适用于数据元素之间存在明确的前后关系,有序排列的场景。

2. 顺序存储结构适用于元素的插入和删除操作较少,对元素的随机访问较频繁的场景。

3. 链式存储结构适用于插入和删除操作较频繁的场景,对元素的随机访问较少。

线性表的操作的时间复杂度:1. 查找操作:顺序存储结构的时间复杂度为O(1),链式存储结构的时间复杂度为O(n)。

2. 插入和删除操作:顺序存储结构的时间复杂度为O(n),链式存储结构的时间复杂度为O(1)。

线性表的实现:1. 顺序存储结构的实现:使用数组来存储元素,通过下标来访问元素。

2. 链式存储结构的实现:使用链表来实现,每个元素包含数据和指向下一个元素的指针。

逻辑结构知识点总结图

逻辑结构知识点总结图

逻辑结构知识点总结图一、逻辑结构的基本概念1. 逻辑结构的定义逻辑结构是指数据元素之间的相互关系,它独立于数据的存储结构。

逻辑结构反映了数据元素之间的逻辑关系,包括集合结构、线性结构、树形结构和图形结构四种基本类型。

2. 逻辑结构的分类(1)集合结构:集合结构中的数据元素之间没有明显的层次关系,元素之间的关系是相互独立的。

(2)线性结构:线性结构中的数据元素之间存在一对一的关系,即每个元素都只有一个直接前驱和一个直接后继。

(3)树形结构:树形结构中的数据元素之间存在一对多的关系,即每个元素可以有多个直接后继,但只能有一个直接前驱。

(4)图形结构:图形结构中的数据元素之间不存在明显的层次关系,元素之间的关系是任意的。

二、线性结构1. 线性表的定义线性表是n个数据元素的有限序列,每个元素最多只有一个直接前驱和一个直接后继。

2. 线性表的顺序存储结构线性表的顺序存储结构是把线性表的元素按其逻辑顺序依次存放在一块连续的存储空间中。

3. 线性表的链式存储结构线性表的链式存储结构是通过一组以地址存放的数据元素来表示线性关系。

4. 线性表的应用线性表常被用于实现各种常见的数据结构,如栈、队列和串等。

三、树形结构1. 树的定义树是n(n≥0)个结点的有限集合,该集合满足以下条件:(1)有且仅有一个特定的结点称为根结点;(2)其余的结点可以分为m(m≥0)个互不相交的、且每个集合本身又是一棵树的子集合。

2. 二叉树的定义二叉树是每个结点最多只有两个子结点的树。

3. 树的存储结构树的存储结构可以使用顺序存储结构或链式存储结构。

4. 树的遍历树的遍历分为前序遍历、中序遍历和后序遍历三种方式。

5. 树的应用树结构常被用于实现各种数据结构,如二叉搜索树、平衡二叉树和哈夫曼树等。

四、图形结构1. 图的定义图是一个包含顶点集合V和边集合E的数据结构,其中每条边都连接一对顶点。

2. 图的存储结构图的存储结构可以使用邻接矩阵或邻接表两种方式。

海南软件职业技术学院课程授课计划

海南软件职业技术学院课程授课计划

海南软件职业技术学院课程授课计划任课教师:邓奉先教学单位:软件工程系时间:2015-2016学年度第2学期课程类型:计算机课程名称:数据结构授课对象:13软件技术502教学目标:本课程介绍软件设计中常用的线性表、栈、队列、串、数组、广义表、树、二叉树、图结构等几种基本的数据结构及其存储结构和所施加的运算与实现等。

另外,还介绍软件设计中常用的几种查找和排序算法,以及递归技术等,在介绍各项内容的同时,还涉及到算法设计与分析的基本技术和面向对象程序设计的理论与技术等内容。

通过本课程的学习,能熟练掌握上述结构及其运算的实现和性能特点,掌握各种排序和查找运算以及递归技术,并能对给定的实际问题,建立准确的问题模型,设计有效的问题求解方法,选择合理的数据结构及其运算集,设计有效的算法,从而为提高软件设计水平以及后续课程的学习打好基础。

教学重点:本课程的重点内容是如何分析现有的实际数据,从中找出规律,抽象出对应的抽象数据类型,进而设计出各种基本算法。

讲课过程中应尽量多举实例,通过举例来一步步引导学生学会如何分析数据、查找规律、抽象成数据类型和编写算法。

教学难点:本课程难点包括:哈夫曼树及其应用、最短路径、哈希表、快速排序等,必须通过学生自己多做分析和实践,才能更好地掌握。

教学方法:1.多种媒体教学在课堂教学中,多采用黑板粉笔和电子教案相结合的方式。

电子教案中包含讲课的梗概,算法,节省了大量抄写黑板的时间,用粉笔讲述算法描述和存储描述,两者结合使学生对所学知识更易理解和接受。

2.课内辅导教学辅导课上可充分采用讨论式教学方式。

对数据结构基本概念和算法的深入理解进行讨论,对学生习题中出现的典型错误进行讨论,并对某些专题进行研究式讨论。

3.理论与实际结合教学教学环境:多媒体教室。

作业要求:本教材的基础部分是学生必须掌握的知识,因此要求基础部分的习题学生必须全做,其中选取较有代表性的作为作业。

考核方式及成绩评定方法:本课程考核由平时抽查、实验报告、期末考试等部分组成。

数据结构实验报告1线性表的顺序存储结构

数据结构实验报告1线性表的顺序存储结构

数据结构实验报告1线性表的顺序存储结构数据结构实验报告1线性表的顺序存储结构第一章引言线性表是计算机中最常见的数据结构之一,它是一种有序的数据元素集合,其中的数据元素之间具有一对一的关系。

线性表的存储结构有多种方式,其中顺序存储结构是最简单的一种,它使用一段连续的存储单元来存储线性表中的元素。

第二章顺序存储结构的定义顺序存储结构是将线性表中的元素按照其逻辑顺序依次存储在一块连续的存储空间中。

顺序存储结构的特点是可以快速地访问任意位置的元素,但插入和删除操作需要移动大量的元素。

第三章顺序存储结构的实现1.存储空间的分配顺序存储结构通常使用数组来实现,数组的长度应该大于等于线性表的长度,以防止溢出。

存储空间的分配可以使用静态分配或动态分配两种方式来实现。

2.线性表的初始化初始化线性表时,需要设置线性表的长度和当前元素的个数。

3.线性表的增删改查操作●插入操作:________在指定位置插入一个元素时,需要将插入位置之后的元素依次后移,给待插入的元素腾出位置。

●删除操作:________删除指定位置的元素时,需要将删除位置之后的元素依次前移,覆盖删除位置上的元素。

●修改操作:________修改指定位置的元素时,直接对该位置上的元素进行修改即可。

●查找操作:________根据指定的元素值,查找其在顺序存储结构中的位置。

4.线性表的遍历操作遍历操作可以按照顺序访问线性表中的每个元素,可以使用循环结构实现遍历操作。

第四章顺序存储结构的优缺点分析1.优点:________可以快速地访问任意位置的元素,节省存储空间。

2.缺点:________插入和删除操作需要移动大量的元素,不适用于频繁插入和删除的场景。

第五章实验过程和结果分析在本次实验中,我们以顺序存储结构为基础,实现了线性表的增删改查操作,并进行了遍历操作。

通过实验,我们发现顺序存储结构在查询操作上有较好的性能,但在插入和删除操作上的性能较差。

第六章附件本文档涉及的附件详见附件文件。

第3章线性表的链式存储

第3章线性表的链式存储
L
(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.数据元素之间具有一对一的关系,即除了第一个和一个数据元素外,其他数据元素都是首尾相连的。

2.线性表具有唯一的第一个元素和一个元素,分别称为表头和表尾。

3.线性表的长度是指表中数据元素的个数,长度为零的线性表称为空表。

三、线性表的分类根据线性表的存储方式,可以将线性表分为顺序存储结构和链式存储结构两大类。

1.顺序存储结构:顺序存储结构是将线性表中的数据元素按照逻辑顺序依次存放在一组地质连续的存储单元中。

顺序存储结构具有随机访问的特点,可以通过下标快速访问表中的任意一个元素。

顺序存储结构的线性表又可以分为静态顺序表和动态顺序表两种。

2.链式存储结构:链式存储结构是通过指针将线性表中的数据元素连接起来,形成一个链表。

链表中的每个节点包含一个数据元素和一个或多个指针,指向下一个或前一个节点。

链式存储结构具有动态性,可以根据需要动态地分配和释放节点空间。

链式存储结构的线性表又可以分为单向链表、双向链表和循环链表等。

四、线性表的基本操作线性表作为一种数据结构,具有一系列基本操作,包括:1.初始化:创建一个空的线性表。

2.插入:在线性表的指定位置插入一个数据元素。

3.删除:删除线性表中指定位置的数据元素。

4.查找:在线性表中查找具有给定关键字的数据元素。

5.更新:更新线性表中指定位置的数据元素。

6.销毁:释放线性表所占用的空间。

7.遍历:遍历线性表中的所有数据元素,进行相应的操作。

8.排序:对线性表中的数据元素进行排序。

9.合并:将两个线性表合并为一个线性表。

五、线性表的应用1.程序语言中的数组:数组是一种典型的顺序存储结构的线性表,常用于存储具有相同类型的数据元素。

线性表的链式存储结构实验报告

线性表的链式存储结构实验报告

实验报告课程名称:数据结构与算法分析实验名称:链表的实现与应用实验日期:班级:数媒1401 姓名:范业嘉学号一、实验目的掌握线性表的链式存储结构设计与基本操作的实现。

二、实验内容与要求⑴定义线性表的链式存储表示;⑵基于所设计的存储结构实现线性表的基本操作;⑶编写一个主程序对所实现的线性表进行测试;⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。

⑸设计一个一元多项式计算器,要求能够:①输入并建立多项式;②输出多项式;③执行两个多项式相加;④执行两个多项式相减;⑤(选做)执行两个多项式相乘。

三、数据结构设计1.按所用指针的类型、个数、方法等的不同,又可分为:线性链表(单链表)静态链表循环链表双向链表双向循环链表2.用一组任意的存储单元存储线性表中数据元素,用指针来表示数据元素间的逻辑关系。

四、算法设计1.定义一个链表void creatlist(Linklist &L,int n){int i;Linklist p,s;L=(Linklist)malloc(sizeof(Lnode));p=L;L->next=NULL;for(i=0;i<n;i++){s=(Linklist)malloc(sizeof(Lnode));scanf("%d",&s->data);s->next=NULL;p->next=s; p=s;}}2.(1)两个链表的合并void Mergelist(Linklist &La,Linklist &Lb,Linklist &Lc) {Linklist pa,pb,pc;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){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;free(Lb);}(2)两个链表的并集Linklist unionlist(Linklist &La,Linklist &Lb){Linklist p1,p2,head,q,s;int flag;head=q=(Linklist)malloc(sizeof(Lnode));p1=La->next;while(p1){flag=0;p2=Lb->next;while(p2){if(p1->data==p2->data){flag=1;break;}p2=p2->next;}if(flag==0){s=(Linklist)malloc(sizeof(Lnode));s->data=p1->data;q->next=s;q=s;}p1=p1->next;}q->next=Lb->next;return head;}3.(1)一元多项式的加法List addpoly(List pa,List pb) //一元多项式的加法{int n;List pc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(struct Linklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){if(pa->expn>pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}else if(pa->expn<pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}else{n=pa->coef+pb->coef;if(n!=0){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=n;s->next=NULL;p->next=s;p=s;}pb=pb->next;pa=pa->next;}}while(pa!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}while(pb!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}return pc;}(2)一元多项式的减法List subpoly(List pa,List pb) //一元多项式的减法{int n;List pc,s,p;pa=pa->next;pb=pb->next;pc=(List)malloc(sizeof(struct Linklist));pc->next=NULL;p=pc;while(pa!=NULL&&pb!=NULL){if(pa->expn>pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}else if(pa->expn<pb->expn){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=-pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}else{n=pa->coef-pb->coef;if(n!=0){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=n;s->next=NULL;p->next=s;p=s;}pb=pb->next;pa=pa->next;}}while(pa!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pa->expn;s->coef=pa->coef;s->next=NULL;p->next=s;p=s;pa=pa->next;}while(pb!=NULL){s=(List)malloc(sizeof(struct Linklist));s->expn=pb->expn;s->coef=-pb->coef;s->next=NULL;p->next=s;p=s;pb=pb->next;}return pc;}(3)一元多项式的乘法void mulpolyn(polynomail pa,polynomail pb,polynomail &pc) {LNode *p,*q,*s,*hc;p=pa->next;q=pb->next;hc=pc;while(p!=NULL){while(q!=NULL){s=(polynomail)malloc(sizeof(LNode));hc->next=s;hc=hc->next;hc->coef=q->coef*p->coef;hc->expn=q->expn+p->expn;q=q->next;}p=p->next;q=pb->next;}hc->next=NULL;}五、测试结果2.3.六、心得体会(包括对于本次实验的小结,实验过程中碰到的问题等)1.首先书上给的链表输入是倒序的,写的时候想都没想就抄上去了,结果运行时发现问题,可是上网百度依然没有把问题解决,导致最后输出链表倒序的,并且链表的合并并集依旧是倒序的。

第3章 线性表及其存储结构

第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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7
②尾插建表法 算法思想: 算法思想: 将新结点插入到当前链表的表尾上, 将新结点插入到当前链表的表尾上,可增加一 个尾指针r,使其始终指向链表的尾结点。 个尾指针 ,使其始终指向链表的尾结点。
H A B C
r
③ 尾插建表可使生 成的结点次序和 输入的顺序相同 ①
p

D ^

LNode *CreateList() {Char ch; /*逐个插入字符,以“$“为结束符,返回单链表头指针 逐个插入字符, 为结束符, 逐个插入字符 为结束符 返回单链表头指针*/ LNode *head,*p,*r; head=NULL; /*链表开始为空 链表开始为空*/ 链表开始为空 r=NULL; /*尾指针初值为空 尾指针初值为空*/ 尾指针初值为空 ch=getchar(); /*读入第一个结点的值 读入第一个结点的值*/ 读入第一个结点的值 while(ch!=‘$’) /*“$“为输入结束符 为输入结束符*/ 为输入结束符
H H
k0 ^
k1

kn-1 ^
带头结点的单链表
单链表的描 述
typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList
/*结点类型定义 结点类型定义*/ 结点类型定义 /*数据域 数据域*/ 数据域 /*next为指针域 为指针域*/ 为指针域

an ^
空表: 头指针为空。 空表 头指针为空。 头结点: 头结点 其指针域 指向表中第一个结点的指 针。 单链表:每个结点只有一个链域。 单链表:每个结点只有一个链域。 单链表的描述:单链表由头指针唯一确定, 单链表的描述:单链表由头指针唯一确定, 因此单链表可以用头指针的名字来命名。 因此单链表可以用头指针的名字来命名。 例如:若头指针为head,则可把链表称为 例如:若头指针为 则可把链表称为 “表head”。 。
head a1 a2

an ^
线性链表逻辑状态
结点的组成
数据域
指针域
数据域: 表示数据元素自身值。 数据域 表示数据元素自身值。 指针域(链域) 表示与其它结点关系。 指针域(链域): 表示与其它结点关系。
单链表:每个结点只有一个链域。 单链表:每个结点只有一个链域。 开始结点:(无前趋)用头指针指向之。 开始结点 (无前趋)用头指针指向之。 最后一个结点(尾结点 指针为空(无后继), 尾结点):指针为空 最后一个结点 尾结点 指针为空(无后继), 表示。 用^或Null表示。 或 表示 表中其它结点:由其前趋的指针域指向之 由其前趋的指针域指向之。 表中其它结点 由其前趋的指针域指向之。 h a1 a2
(2) 查找运算
按值查找: 按值查找: 在链表中, 查找第一个值为x的结点 若有, 的结点, 在链表中 , 查找第一个值为 的结点 , 若有 , 则 返回首次找到的值为x的结点的存储位置 的结点的存储位置; 返回首次找到的值为 的结点的存储位置;否则返回 Null. 算法思想: 算法思想: 从开始结点出发,顺链逐个结点的值和给定值x作 从开始结点出发,顺链逐个结点的值和给定值 作 比较。 比较。 算法描述( 算法描述(略)
2.3 链接表示
1、单链表(线性链表) 、单链表(线性链表) 用一组任意的存储单元存放线性表的数据元素。 用一组任意的存储单元存放线性表的数据元素。 任意的存储单元存放线性表的数据元素 链表的特点: 链表的特点: 链表中结点的逻辑次序和物理次序不一定相同。即: 链表中结点的逻辑次序和物理次序不一定相同。 逻辑上相邻未必在物理上相邻。 逻辑上相邻未必在物理上相邻。结点之间的相对位置由 链表中的指针域指示, 链表中的指针域指示,而结点在存储器中的存储位置是 随意的。 随意的。
指针p与指向的结点关系示意图 指针 与指向的结点关系示意图 data next p 结点 (*p)
P: 指向链表中某一结点的指针 *p: 表示由指针 所指向的结点 表示由指针p所指向的结点
ቤተ መጻሕፍቲ ባይዱ
单链表的基本运算 (1)建立单链表 )
①头插法建表: 头插法建表: 思想:从一个空表开始,重复读入数据,生成新结点, 思想:从一个空表开始,重复读入数据,生成新结点, 将读入数据存放在新结点的数据域中, 将读入数据存放在新结点的数据域中,然后将新结点插 入到当前链表的表头上,直到读入结束标志为止。 入到当前链表的表头上,直到读入结束标志为止。 H
带头结点的单链表
H
^ 空表
H
头结点
开始结点
a1 … an
^
非空表
无论链表是否为空, 无论链表是否为空,其头指针是指向头结点的 非空指针, 非空指针,所以表的第一个结点和其它结点的 操作一致。 操作一致。
/*带头结点的尾插法建立单链表,返回表头指针* /*带头结点的尾插法建立单链表,返回表头指针*/ 带头结点的尾插法建立单链表 LNode * CreateList() {Char ch; LNode *head,*p,*r; ;/*生成头结点 ));/*生成头结点* head=malloc(sizeof(LNode ));/*生成头结点*/ /*尾指针初值指向头结点 尾指针初值指向头结点* r=head; /*尾指针初值指向头结点*/ ch=getchar(); /*“ 为输入结束符* /*“$“为输入结束符*/ while(ch!=‘$’) p=( *) 生成新结点* {p=(LNode *)malloc(sizeof(LNode )); /生成新结点*/ p->data=ch; /*新结点插入表尾 新结点插入表尾* r->next=p; /*新结点插入表尾*/ /*尾指针 指向新的表尾* 尾指针r r=p; /*尾指针r指向新的表尾*/ /*读下一结点 读下一结点* ch=getchar(); /*读下一结点*/ } r->next=Null; return head; 13 } /* CreateList */
(3) 插入运算
在结点a和 之间插入一个数据元素 在结点 和b之间插入一个数据元素 x p p a b s x a
typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList LinkList P,S;
b
s=(LNode*)malloc(sizeof(LNode )); s->data=x; s->next=p->next; p->next=s;
9
头、尾插法建表分析: 尾插法建表分析: 尾插法建表由于没有生成(附加) 头、尾插法建表由于没有生成(附加) 头结点, 头结点,因此开始结点和其它结点的插入 处理并不一样,原因是开始结点的位置存 处理并不一样, 放在头指针中, 放在头指针中,而其余结点的位置是在其 前趋结点的指针域 。
10
③尾插法建表的改进算法 思想: 思想: 在第一个结点之前附设头结点 头结点, 在第一个结点之前附设头结点,使第一 个结点和其余结点的插入操作一致。 个结点和其余结点的插入操作一致。 头结点的数据域: 头结点的数据域:可有可无 头结点的指针域:指向第一个结点的指针。 头结点的指针域:指向第一个结点的指针。
While(q->next!=p) q=q->next; /*找*p的前趋结点*/ s->next=p;q->next=s; /*将*s插入*p之前*/ }
16
④ C ③ B A ^
P

D②
注:头插法生成的链表中结 点的次序和输入的顺序相反。 点的次序和输入的顺序相反。
LNode *CreateList() { Char ch; LNode *head,*p; head=Null; /*链表开始为空*/ ch=getchar(); /*读入第一个结点的值*/ while(ch!=‘$’) {p=(LNode*)malloc(sizeof(LNode));/生成新结点*/ p->data=ch; p->next=head; 逐个插入字符, 逐个插入字符,以 head=p; 为结束符, “$“为结束符,返 为结束符 ch=getchar(); 回单链表头指针 } return head; }
附:在带头结点的单链表head中,将值为x的新结点插入 *P之前。 INSERTBEFORE(head,p,x) LNode *head,*p; datatype x; {LNode *q; s=(LNode*)malloc(sizeof(LNode )); s->data=x; q=head;
/*从头指针开始*/
{ p=(LNode*)malloc(sizeof(LNode )); /生成新结点 生成新结点*/ 生成新结点
p->data=ch; if (head==NULL) head=p; else r->next=p; r=p
ch=getchar();
}
If(r!=NULL) r->next=NULL; return head; } /* CreateList */
相关文档
最新文档