第三章 线性表的链式存储结构教案

合集下载

线性表的链式存储

线性表的链式存储

序号 0 1 2
数据域 邓玉莹配送信息 魏秀婷配送信息 刘佳佳配送信息
指针域 1 -1 0



任务2:静态链表存储结构举例并采用C语言定义
3.1.4 动态链表的实现
Head
刘佳佳配送信息 ^
Head
Head
刘佳佳配送信息
邓玉莹送信息
魏秀婷配送信息
动态链表结点定义一般形式: typedef struct node { ElemType data; /*数据域 */ struct node *next; /*指针域 */ } LNode,*LinkList;
4.定义链表变量两种定义形式: (1)LinkList Head; (2)LNode *Head;
【知识拓展】: 指针变量和结点变量的关系
(1)生成结点变量的标准函数 p=( LNode *)malloc(sizeof(LNode)); //函数malloc分配一个类型为ListNode的结点变量的空间, 并将其首地址放入指针变量p中。 (2)释放结点变量空间的标准函数 free(p); //释放p所指的结点变量空间。 (3)结点分量的访问 利用结点变量的名字*p访问结点分量 方法一:(*p).data和(*p).next 方法二:p-﹥data和p-﹥next (4)指针变量p和结点变量*p的关系 指针变量p的值——结点地址 结点变量*p的值——结点内容 (*p).data的值——p指针所指结点的data域的值 (*p).next的值——*p后继结点的地址 *((*p).next)——*p后继结点
问题思考:总结链式存储结构的特点
单链表定义的一般形式: 由分别表示a1,a2,…,an, 的n 个结点依次相链构成的链表,称为线性表的 链式存储表示,由于此类链表的每个结点中只包含一个指针域,故称为 单链表或线性链表。

数据结构线性表的链式存储结构

数据结构线性表的链式存储结构

南昌航空大学实验报告课程名称:数据结构实验名称:实验二:线性表的链式存储结构班级: 080611 学生姓名:赖凌学号: 08061101指导教师评定:签名:题目:设计并实现以下算法:给出用单链表存储多项式的结构,利用后接法生成多项式的单链表结构,实现两个多项式相加的运算,并就地逆置相加后的多项式链式。

一、需求分析⒈实现两张线性表的链式存储,合并及删除值相同元素的操作。

⒉在演示过程序中,用户敲击键盘,即可观看演示结果。

⒊程序执行的命令包括:(1)构造线性链表A (2)构造线性链表B (3)求两张表的并(4)删除C中值相同的元素二、概要设计⒈为实现上述算法,需要线性表的抽象数据类型:ADT LinkList List {数据对象:D={a i:|a i∈ElemSet,i=1…n,n≥0}数据关系:R1={<a i-1,a i>|a i-1,a i∈D,i=2,…n≥0}基本操作:Status InitList( LinkList &L)//操作结果:构造一个空的线性链表L。

Status MakeNode ( Link &p, ElemType e );// 分配由p指向的值为e 的结点,并返回OK;若分配失败,则返回ERRORStatus Append (LinkList &L,Link s);//将指针s所指(彼此以指针相链接)的一串结点链接在线性链表L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点Status ListEmpty(LinkList L);//若线性链表L为空表,则返回TRUE,否则返回ERROR。

Int ListLength(LinkList L);//返回线性链表中L最后一个结点的位置。

ElemType GetCurElem(Link p);//已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值Position GetHead (LinkList L);//返回线性链表L中头结点的位置Position GetLast( LInkList L);//返回线性链表L中最后一个结点的位置}ADT LinkList2. 本程序有三个模块:⑴主程序模块void main(){初始化;{接受命令;显示结果;}}⑵线性链表单元模块:实现线性链表抽象数据类型;⑶结点结构单元模块:定义线性链表中的结点结构。

第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 单链表运算的实现

武汉软件工程职业学院《数据结构讲义》第04讲-线性表的链式存储结构

武汉软件工程职业学院《数据结构讲义》第04讲-线性表的链式存储结构

1.掌握线性链表、单链表、静态链表的概念。

2.掌握线性链表的表示及实现方法。

➢ 教学重点:线性链表之单链表的表示及实现方法。

➢ 教学难点: 线性链表的概念。

➢ 授课内容2.3 线性表的链式存储结构由于顺序表的存贮特点是用物理上的相邻实现了逻辑上的相邻,它要求用连续的存储单元顺序存储线性表中各元素,因此,对顺序表插入、删除时需要通过移动数据元素来实现,影响了运行效率。

本节介绍线性表链式存储结构,它不需要用地址连续的存储单元来实现,因为它不要求逻辑上相邻的两个数据元素物理上也相邻,它是通过“链”建立起数据元素之间的逻辑关系来,因此对线性表的插入、删除不需要移动数据元素。

2.3.1单链表链表是通过一组任意的存储单元来存储线性表中的数据元素的,那么怎样表示出数据元素之间的线性关系呢?为建立起数据元素之间的线性关系,对每个数据元素a i ,除了存放数据元素的自身的信息 a i 之外,还需要和a i 一起存放其后继 a i+1 所在的存贮单元的地址,这两部分信息组成一个“结点”,结点的结构如图2.6 所示,每个元素都如此。

存放数据元素信息的称为数据域,存放其后继地址的称为指针域。

因此n 个元素的线性表通过每个结点的指针域拉成了一个“链子”,称之为链表。

因为每个结点中只有一个指向后继的指针,所以称其为单链表。

链表是由一个个结点构成的,结点定义如下: typedef struct node{ datatype data;struct node *next;} LNode ,*LinkList ; 定义头指针变量: LinkList H ;如图2.7是线性表 (a 1,a 2,a 3,a 4,a 5,a 6,a 7,a 8) 对应的链式存储结构示意图。

第四讲 线性表的链式存储结构图2.6 单链表结点结构 data next当然必须将第一个结点的地址160 放到一个指针变量如 H 中,最后一个结点没有后继, 其指针域必需置空,表明此表到此结束,这样就可以从第一个结点的地址开始“顺藤摸瓜”,找到每个结点。

线性表的链式存储结构

线性表的链式存储结构

19
1. 初始化链表 :即只有一个头结点,并且头结点的 初始化链表CL:即只有一个头结点, next域指向它自身。 域指向它自身。 域指向它自身 int InitList(LinkList *CL) { CL->head=(*LNode)malloc(sizeof(LNode)); if (CL->head) {CL->head->next=CL->head; return OK;} //让next域指向它自身 让 域指向它自身 else return ERROR ; }
16
10. 在链表 中第 个数据元素之前插入数据元素 在链表L中第 个数据元素之前插入数据元素e 中第i个数据元素之前插入数据元素 int ListInsert(LinkList *L,int i,EntryType e) { LNode *p,*s; int j; if (i<1||i>ListLength(L)+1) return ERROR; s=(LNode*)malloc(sizeof(LNode));//s为存放 的结点 为存放e的结点 为存放 if (s==NULL) return ERROR; s->data=e; for (p=L->head,j=0;p&&j<i-1;p=p->next;j++); //寻找第 个结点 寻找第i-1个结点 寻找第 s->next=p->next; p->next=s; //将s结点插入 将 结点插入 return OK; }//P25图2-9。 图 。
8
2. 销毁链表 :删除链表中包括头结点在内所有结点。 销毁链表L:删除链表中包括头结点在内所有结点。 void DestoryList(LinkList *L) { LNode *p; while (L->head){ //依次删除链表中的所有结点 依次删除链表中的所有结点 依次

2-4线性数据结构链式存储结构

2-4线性数据结构链式存储结构

ZHAO
QIAN
SUN
LI
NULL
To link ‘ZHAO’ and ‘QIAN’:
Head pointer ptr = 0110
list_ptr N1, N2 ;
N1 = (list_ptr)malloc(sizeof(struct list_node));
Definition:
节点的位置NN12-在=>d(la每istat_次=pt‘Zr运)HmAa行Ollo’ 时;c(sizeof(struct list_node));
} return status; }
也可用复合条件将循环改写 为:
while(p && p->data != elem ){
i++; p=p->next; }
数据结构@UESTC 电子科技大学 ·计算机科学 ·数据结构与算法 ·
思考: 能不能用递归程序实现?
数据结构@UESTC 电子科技大学 ·计算机科学 ·数据结构与算法 ·
循环条件分析:
p = (*L)->next ; i=1; while (p && i<pos ) { i++;p=p->next;}
条件1防止pos>表长,条件2控制取第pos个,并防止了pos<1
两个条件有6种组合:
1.p== NULL && i<pos 空表且pos>1 或pos>表长+1,range_error
}
return status;
}
数据结构@UESTC 电子科技大学 ·计算机科学 ·数据结构与算法 ·
③ 单链表上的删除操作 删除单链表第i个元素: List_Remove(ListPtr L, int pos)

数据结构-线性表链式存储结构

数据结构-线性表链式存储结构

04 线性表链式存储结构的实 现
C语言实现
创建链表
通过动态内存分配,创建链表节 点并逐个连接起来,形成链表。
插入节点
在链表指定位置插入节点,需要 更新插入位置节点的指针域,使 其指向新插入的节点。
删除节点
删除链表中的指定节点,需要更新被 删除节点前一个节点的指针域,使其 指向被删除节点的下一个节点。
01
遍历链表
从头节点开始,依次访问链表中的每 个节点,输出节点的数据值。
05
03
插入节点
在链表指定位置插入节点,需要更新 插入位置节点的引用,使其指向新插 入的节点。
04
删除节点
删除链表中的指定节点,需要更新被 删除节点前一个节点的引用,使其指 向被删除节点的下一个节点。
Python语言实现
在Python中,可以使
THANKS FOR WATCHING
感谢您的观看
适用场景
链式存储结构适用于需要频繁进行插入、删除等操作的数据结构,如动态数组、队列、链表等。
展望
01 02 03
未来发展方向
随着大数据和云计算的普及,数据结构的应用场景越来越 广泛,链式存储结构作为其中的一种重要形式,未来将有 更多的应用场景和优化空间。例如,针对大数据场景下的 链式存储结构优化、新型的链式数据结构等都是值得研究 的方向。
06 总结与展望
总结
定义与特点
链式存储结构是线性表的另一种存储方式,它通过在数据元素之间建立指针链接,实现了数据元素的逻辑顺序与物理 顺序的分离。相比于顺序存储结构,链式存储结构具有更好的动态性,能够方便地插入、删除等操作。
基本操作
链式存储结构支持的主要操作包括插入、删除、查找等,这些操作的时间复杂度通常为O(1)、O(n)、O(n),其中n为链表 长度。

第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)。
L->head->next=p->next;//删除p结点
free(p);//释放p结点占据的存储空间
}
}
(4)求链表L的长度
int ListLength(LINK_LISTL)
{
NODE *p;
int len;
for(p=L.head, len=0;p->next==NULL; p=p->next,len++);
链式存储结构的特点
(1)线性表中的数据元素在存储单元中的存放顺序与逻辑顺序不一定一致;
(2)在对线性表操作时,只能通过头指针进入链表,并通过每个结点的指针域向后扫描其余结点,这样就会造成寻找第一个结点和寻找最后一个结点所花费的时间不等,具有这种特点的存取方式被称为顺序存取方式。
在C语言中,实现线性表的链式存储结构的类型定义
return(len);
}
(5)判链表L空否。
int IsEmpty(LINK_LIST L)
{
if (L.head->next==NULL) return TRUE;
else return FALSE;
}
(6)通过e返回链表L中第i个数据元素的内容
void GetElem(LINK_LIST L,int i,EntryType *e)
typedef strcut node{//结点类型
EntryType item;
struct node *next;
}NODE;
typedef struct{//链表类型
NODE *head;
}LINK_LIST;
典型操作的算法实现
(1)初始化链表L
intInitList(LINK_LIST *L)
NODE *LocateELem(LINK_LIST L,EntryType e)
{
NODE *p;
for (p=L.head->next;p&&p->item!=e;p=p->next);//寻找满足条件的结点
return(p);
}
(8)返回链表L中结点e的直接前驱结点
NODE *PriorElem(LINK_LIST L,NODE* e)
线性表的链式存储结构
线性表的应用举例
线性表顺序存储结构的特点
它是一种简单、方便的存储方式。它要求线性表的数据元素依次存放在连续的存储单元中,从而利用数据元素的存储顺序表示相应的逻辑顺序,这种存储方式属于静态存储形式。
暴露的问题
在做插入或删除元素的操作时,会产生大量的数据元素移动;
对于长度变化较大的线性表,要一次性地分配足够的存储空间,但这些空间常常又得不到充分的利用;
存储地址
内容
直接后继存储地址
100
b
120
...
...
...
首元素位置
120
c
160
...
...
..
144
a
100
...
...
...
160
d
NULL
...
...
...
术语
表示每个数据元素的两部分信息组合在一起被称为结点;
其中表示数据元素内容的部分被称为数据域(data);
表示直接后继元素存储地址的部分被称为指针或指针域(next)。
{
NODE *p;
while (L->head){//依次删除链表中的所有结点
p=L->head; L->head=L->head->next;
free(p);
}
}
(3)清空链表L
voidClearList(LINK_LIST *L)
{
NODE *p;
while (L->head->next){
p=L->head->next;//p指向链表中头结点后面的第一个结点
{
NODE *p;
if (L.head->next==e) return NULL;//检测第一个结点
for (p=L.head;p->next&&p->next!=e;p=p->next);
if (p->next==e) return p;
esle return NULL;
}
(9)返回链表L中结点e的直接后继结点
NODE *NextElem(LINK_LIST L,NODE* e)
{
NODE *p;
for(p=L.head->next;p&&p!=e;p=p->next);
if (p) p=p->next;
return p;
}
(10)在链表L中第i个数据元素之前插入数据元素e
int ListInsert(LINK_LIST *L,int i,EntryType e)
{
NODE *p;
int j;
if (i<1||i>ListLength(L)) exit ERROR;//检测i值的合理性
for (p=L.head,j=0; j!=i;p=p->next,j++);//找到第i个结点
*e=p->item;//将第i个结点的内容赋给e指针所指向的存储单元中
}
(7)在链表L中检索值为e的数据元素
{
NODE *p,*s;
int j;
if (i<1||i>ListLength(L)+1) return ERROR;
s=(NODE*)malloc(sizeof(NODE));
if (s==NULL) return ERROR;
s->item=e;
for (p=L->head,j=0;p&&j<i-1;p=p->next;j++);//寻找第i-1个结点
线性表的容量难以扩充。
第一节 线性表的链式存储结构
线性表的链式存储结构是指用一组任意的存储单元(可以连续,也可以不连续)存储线性表中的数据元素。为了反映数据元素之间的逻辑关系,对于每个数据元素不仅要表示它的具体内容,还要附加一个表示它的直接后继元素存储位置的信息。假设有一个线性表(a,b,c,d),可用下图所示的形式存储:
单链表简化的图形描述形式
其中,head是头指针,它指向单链表中的第一个结点,这是单链表操作的入口点。由于最后一个结点没有直接后继结点,所以,它的指针域放入一个特殊的值NULL。NULL值在图示中常用(^)符号表示。
带头结点的单链表
为了简化对链表的操作,人们经常在链表的第一个结点之前附加一个结点,并称为头结点。这样可以免去对链表第一个结点的特殊处理。如下图所示:
{
L->he存储单元
if (L->head) {L->head->next=NULL;return OK;}
else return ERROR ;
}
(2)销毁链表L
voidDestoryList(LINK_LIST *L)
相关文档
最新文档