2-3线性表链式映像 数据结构PPT(课件)

合集下载

第2章 数据结构(顺序表和线性链表)PPT课件

第2章 数据结构(顺序表和线性链表)PPT课件

DELETELIST(V,n,i)
1.if(i<1)OR(i>n) then{参数错return} 2.for j=i to n-1 step(1)
3. V[j]V[j+1] 4.end(j) 5.n n-1 7.return
2020/11/14
16
Questions:
如删除最后一个元素,作何操作?(最好情 形)
对于计算机存储空间,前后件元素不一定相邻,且前 件元素不一定在前,后件元素不一定在后.
例:C中线性表的数组和动态链表实现
2020/11/14
7
• 数据类型(data type):是指程序设计语言中允许的 变量类型。
• 注意:每一个变量必须与一个且仅与一个数据类型相联系, 规定了该变量可以设定的值的集合,及这个集合上的一组 运算。(语言不同而不同)
3
2.1.2 基本概念和术语
• 数据(data):对客观事物的符号表示,信息的载 体,可用计算机表示和处理。
• 数(figure/number)、文本(text)、图形(graph)、视频 (video)、声音(audio)和图像(image)等。
• 数据元素(data element/node/record):是数据集 合中的一个个体,是数据的基本单位。
3.return (3)插入运算
从头开始
问题描述:在头指针为head的链表中,在值为a的结点前
插入一个值为b的结点。如为空表,则b为第一个结点,
如表中无a元素,则将b插入链表的末尾。
2020/11/14
26
2020/11/14
27
INLINKST(head,a,b) 1.GETNODE(p); data(p) b;//取得一个新结点p// 2.if(head=nil)then{head p;next(p) nil;return} //空表情况// 3.if(data(head)=a)then{next(p) head; headp;return}//a为第一个 结点,改进待叙,不同:head指向第一个结点.第一个结点 变了,所以要修改head// 4.LOOKFOR(head,a,q)//寻找元素a的前趋结点q// 5.next(p)next(q);next(q)p 6.return

第2章--线性表PPT课件

第2章--线性表PPT课件

一个(尾)结点。
.
4
a1,a2,…ai-1都是ai(2≦i≦n)的前驱,其中ai-1是ai的直接 前驱; ai+1,ai+2,…an都是ai(1≦i ≦n-1)的后继,其中ai+1是ai的 直接后继。
2.1.2 线性表的逻辑结构
线性表中的数据元素ai所代表的具体含义随具体应 用的不同而不同,在线性表的定义中,只不过是一个抽 象的表示符号。
以下将对几种主要的操作进行讨论。

1 顺序线性表初始化
Status Init_SqList( SqList *L )
{ L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ;
if ( !L -> elem_array ) return ERROR ;
ListInsert ( L, i, &e )
初始条件:线性表L已存在,1≦i≦ListLength(L) ;
操作结果:在线性表L中的第i个位置插入元素e;

.
8
} ADT List
2.2 线性表的顺序存储
2.2.1 线性表的顺序存储结构
顺序存储 :把线性表的结点按逻辑顺序依次存放在 一组地址连续的存储单元里。用这种方法存储的线性表 简称顺序表。
在具体的机器环境下:设线性表的每个元素需占用L 个存储单元,以所占的第一个单元的存储地址作为数据元素 的存储位置。则线性表中第i+1个数据元素的存储位置 LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足 下列关系:
LOC(ai+1)=LOC(ai)+L
线性表的第i个数据元素ai的存储位置为:

第2章线性表-PPT精品文档

第2章线性表-PPT精品文档

( ) a , a, a , x , a , a i n
2、顺序表的插入
{ if (i<1 ||i>L.length+1 ) return ERROR;
P24 算法2.4
Status ListInsert_Sq(SqList &L,int i,ElemType e) //i值不合法
2.2
二、线性表的顺序存储结构定义 ——动态
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct { ElemType *elem; //存储空间基址, 体现动态性 int length; //当前长度 int listsize; //当前分配的存储容量 }SqList;
M-1 或动态申请和释放内存 数据元素不是简单类型时,可定义结构体数组 ElemType *pData; pData = (ElemType *)malloc(M*sizeof(ElemType)); free(pData); 2019/3/26
二、线性表的顺序存储结构定义 ——静态
#define MAXSIZE 100 typedef struct { ElemType elem[MAXSIZE]; int length; }SqList;
#define LISTINCREMENT 10 typedef typedef struct struct { { ElemType *elem; ElemType elem[MAXSIZE]; int length; int length; int listsize; }SqList; }SqList;

数据结构线性表ppt课件

数据结构线性表ppt课件

01
02
03
04
插入操作
在链表的指定位置插入一个新 节点,需要修改相邻节点的指
针。
删除操作
删除链表的指定节点,需要修 改相邻节点的指针。
查找操作
从链表的头节点开始,顺序遍 历链表,直到找到目标元素或
遍历到链表末尾。
遍历操作
从链表的头节点开始,顺序访 问每个节点,直到遍历到链表
末尾。
04 线性表应用举例 与问题分析
多项式表示与计算问题
01
02
03
多项式表示方法
数组表示法和链表表示法 。
数组表示法
将多项式的系数按次序存 放在一个数组中,通过下 标表示对应的幂次。
链表表示法
每个节点包含系数和指数 两个数据域,以及一个指 向下一个节点的指针域。
一元多项式相加算法设计
• 算法思想:将两个多项式中的同类项系数相加,得到新的 多项式。
删除操作
删除指定位置i的元素,需要将i之后的元素都向前移动 一个位置。
03 链式存储结构及 其实现
链式存储结构原理及特点
链式存储结构原理
使用一组任意的存储单元存储线 性表的数据元素(这组存储单元 可以是连续的,也可以是不连续 的)。
链式存储结构特点
逻辑上相邻的元素在物理位置上 不一定相邻,元素之间的逻辑关 系是通过指针链接来表示的。
...,an组成的有序序列。
性质
集合中必存在唯一的一个“第一元素 ”。
集合中必存在唯一的一个“最后元素 ”。
除最后元素之外,均有唯一的后继。
除第一元素之外,均有唯一的前驱。
线性表与数组关系
数组是线性表的一种表现和实现形式。
线性表更侧重于逻辑概念,而数组则是这种逻辑概念在计算机中的一种存储方式。

数据结构 线性表讲解ppt

数据结构  线性表讲解ppt

③ 将该位置后的元素依次向前移动一个位置;
④ 修改当前表的长度;
17
2.2 线性表的顺序表示和实现--顺序表
/*在顺序表中删除第i个元素*/ int ListDelete_sq(SqList &L,int i,ElemType &e){ int k; /*删除位置不合法*/
if(i<1||i>L.length) return ERROR;
a1 a2 a3
……
ai-1
ai L.length L.listsize
10
2.2 线性表的顺序表示和实现--顺序表
3 顺序表的基本操作
顺序表的初始化
为顺序表分配一个预定义大小的一段连续单元, 并将其初始长度设为0。
int InitList_sq(SqList &L) { L.elem=(ElemType *)malloc( LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem) return ERROR; //初始化失败 L.length=0; //置空表长度为0 L.listsize=LIST_INIT_SIZE; //置初始空间容量 return OK; // 初始化成功,返回1 } //InitList_sq
采用一组任意的存储单元来存放线性表中的数据元 素,这些存储单元可以是连续的,也可以是不连续的。 数据元素间的逻辑关系通过附加信息-指针来描述。 数据元素除了具有代表其本身信息的数据域外,还 有一个用来指示逻辑关系的指针域。这两部分信息组成 数据元素的存储映像,称为结点。
数据域 data 指针域 next
}
O(La_len×Lb_len)
5
2.2 线性表的顺序表示和实现--顺序表

第2章 线性表 (数据结构教程PPT课件)

第2章 线性表 (数据结构教程PPT课件)

3.在数组a中检索(查找)值为X的数据元素
int locate (int a[ ],int n, int x) { int i; i=0; while((i<=n-1)&&(a[i]!=x)) i++; if(i<=n-1) return (i); /*返回的是存储位置*/ else return (0);} }
(2)按值查找即定位 Locate_LinkList(L,x) Lnode * Locate_LinkList( LinkList L, datatype x) /*在单链表L中查找值为x的结点,找到后 返回其指针,否则返回空*/ { Lnode * p=L->next; while ( p!=NULL && p->data != x) p=p->next; return p; }
2.2.2 典型操作的算法实现
1. 初始化线性表L
SeqList *init_SeqList( )
{ SeqList *L; L=malloc(sizeof(SeqList)); L->last=-1; return L; }
2.在数组a第i个数据元素之(ai-1)前插入数据 元素X insert (int a[ ],int n,int i, int x) { int j; for(j=n-1;j>=i-1;j--) a[j+1]=a[j]; /* 结点移动 */ a[i-1]=x; /*新元素插入*/ n++; /*修改长度*/ }
4.删除数组a第i个数据元素(ai-1) delete (int a[ ],int n,int i) { int j; for(j=i;j<=n;j++) a[j-1]=a[j]; /* 结点移动 */ n--; /*修改长度*/ }

绪论(数据结构教程PPT课件)

绪论(数据结构教程PPT课件)
缓冲处理
在网络传输或文件读写过程中,使 用队列作为缓冲区,暂时存储待处 理的数据,以提高处理效率。
04
串、数组和广义表
串定义及基本操作
串的基本操作包括
赋值操作、连接操作、求串长、比较操作、定位操作等。
串的存储结构包括
顺序存储结构和链式存储结构。
串模式匹配算法
串模式匹配算法是指在一个主串中寻找一个子串(模式串)的位置。
函数调用
在程序执行过程中,使用 栈来保存函数调用的信息, 如函数参数、局部变量和 返回地址等。
队列定义及基本操作
01
队列(Queue)是一种特殊的线性数据结构,其操作在表 的两端进行。一端称为队头(front),另一端称为队尾 (rear)。
02
队列的基本操作包括
03
入队(enqueue):在队尾插入一个元素。
3
线性表的抽象数据类型描述
数据类型名称、数据对象集合、操作集合等
线性表顺序存储结构
01
顺序存储结构的定义
用一段地址连续的存储单元依次存储线性表的数据元素
02
顺序存储结构的基本操作实现
创建、初始化、销毁、判空、清空、求长度、获取元素、修改元素等操
作的实现方法
03
顺序存储结构的优缺点
无需为表示表中元素之间的逻辑关系而增加额外的存储空间;可以快速
线索二叉树
线索二叉树是对二叉树的每个结点增设两个标志位以及一条线索而得到的。根据线索性质的不同,线索二叉树可分为前序线 索二叉树、中序线索二叉树和后序线索二叉树三种。这里以中序线索二叉树为例来说明线索二叉树的构造方法。
中序线索二叉树的构造规则是:若将二叉树的中序遍历序列中的每个结点都看作是相应指针域为空的指针,则称这些指针为 线索,而指向其前驱或后继的指针称为线索指针。加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树 (Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种 。

数据结构课件之线性表

数据结构课件之线性表
学C
我觉得老师讲解得非常详细,特别是对于一些难以理解的概念和算法 ,通过老师的讲解和示例,我很快就掌握了。
未来发展趋势预测
线性表作为基础数据结构,其重要性不言而喻。随着大数据、人工智能等领域的不 断发展,对线性表的处理能力和效率要求也越来越高。
未来可能会出现更多针对线性表的优化算法和技术,以满足不同应用场景的需求。
存储空间动态分配,可以充分利 用计算机内存空间,实现灵活的
内存动态管理。
插入、删除等操作不需要移动大 量元素,只需要修改相应的指针
即可,因此具有较高的效率。
逻辑结构与物理结构不一定一致 ,因此可以方便地实现各种复杂
的数据结构。
链式存储结构实现方式
每个节点包含两个指针域,分别 指向其前驱节点和后继节点。
从线性表的中间位置开始,同时 向前和向后遍历,直到遍历完整 个线性表。这种遍历方式在某些
算法中有特殊应用。
03
线性表顺序存储结构
Chapter
顺序存储结构定义
顺序存储结构是用一段连续的存储空间来依次存放线性表的 各个元素。
在这种存储结构中,线性表中第一个元素的存储地址作为线 性表的起始地址,每个元素的存储地址是其逻辑序号与元素 所占存储单元大小的乘积加上起始地址。
设置初始状态
将线性表的长度设为0,表示初始 时线性表为空。
插入操作
01
02
03
确定插入位置
根据需要插入元素的位置 ,确定该位置在线性表中 的序号。
移动元素
从线性表的最后一个元素 开始,依次将每个元素向 后移动一个位置,直到达 到插入位置。
插入新元素
在插入位置处插入新元素 ,并更新线性表的长度。
删除操作
线性表的操作算法

第二章 线性表PPT课件

第二章  线性表PPT课件

(二)线性表的删除(1)
1﹑删除下标为i的 数据元素
例2.3 为在V[0]到V[99] 中删除一个元素 V[i],引用del1函数。 删除前后的线性表 的示意图如右
举例(续)
分析: ①初始条件: 数组V,
删除下标i ②删除条件:0≤i≤99 ③执行结果:1成功,0
不成功 ④N-S流程图如右:
举例(续)
(一)线性表插入操作(1)
1、在数组中下标为i的元 素前插入一个新元素。
例2.1 某C语言程序中, 整型数组V的99个元数 V[0]~V[98]组 成一个线性表。为了在V [i]位置前插入一个新元 素b,可用如下函数inst1 来实现,当插入成功时返 回1,否则返回0,所以该 函数的返回值类型是整型。 插入前后的线性表的示意 图如右:
第二章 线性表
2.1 线性表的逻辑结构 2.2 线性表的顺序存储结构 2.3线性表的链式存储结构 2.4 典型例题
线性表的特点是:在数据元素的非空有
限集中,(1)存在唯一的一个被称为 “第一个”的数据元素;(2)存在唯一
的一个被称为“最后一个”的数据元素; (3)除第一个以外,集合中的每一个数 据元素均有且只有一个前驱;(4)除最
V[99]=0; /*数组最后一个元素清0或某种结束标记*/ return 1; /*删除成功 */ }
线性表的删除操作(2)
2﹑在有序顺序表 中删除一个数据 元素
例2.4 在有序表中 删除一个值为x的 数据元素。当x的 值为78时删去前 后的线性表的
示意图如右:
举例(续)
分析: ①初始条件:数组
return 0; /*插入失败*/
} for (j=99;j>i;j--) v[j]=v[j-1];/*后移*/ v[i]=b; /*插入*/ return 1; /*插入成功 */ }

数据结构课件之线性表(ppt 86页)

数据结构课件之线性表(ppt 86页)

删除算法
int DelList(SeqList *L,int i,ElemType *e)
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值*/
{ int k;
if((i<1)||(i>L->last+1))
{ printf(“删除位置不合法!”); return(ERROR); }
*e= L->elem[i-1]; /* 将删除的元素存放到e所指向的变量中*/
loc(ai) =loc(a1)+(i-1)×k
8
15.10.2019
顺序存储结构示意图
存储地址
Loc(a1) Loc(a1)+(2-1)k

loc(a1)+(i-1)k

loc(a1)+(n-1)k
...
loc(a1)+(maxlen-1)k
内存空间状态
a1 a2

ai

an
9
逻辑地址
1 2

i
操作前提:L为未初始化线性表。 操作结果:将L初始化为空表。 操作前提:线性表L已存在。 操作结果:将L销毁。 操作前提:线性表L已存在 。 操作结果:将表L置为空表。
………
}ADT LinearList
6
15.10.2019
2.2 线性表的顺序存储
2.2.1 线性表的顺序存储结构 2.2.2 线性表顺序存储结构上的基本运算
17
15.10.2019
删除算法示意
将线性表(4,9,15,21,28,30,30,42,51,62)中的第5个元素 删除。
序号
1 2 3 4 5 6 7 8 9 10 4 9 15 21 28 30 30 42 51 62

电子2-3线性表

电子2-3线性表

InitList( &L );
//建空表,初始化
DestoryList( &L );
//撤销表,释放内存
int LengthList( L ); //求表中元素个数,即表长
POSITION LocateElem (L,ElemType e,compare() );
PriorElem( L, cur_e, &pre_e ); //求当前元素e的前驱
2020/10/22
10
11 物料管理
2.2.1 顺序表的表示
数据结构
线性表的顺序表示又称为顺序存储结构或顺序映像。
顺序存储定义:把逻辑上相邻的数据元素存储在物 理上相邻的存储单元中的存储结构。
特点:逻辑上相邻的元素,物理上也相邻
顺序存储方法:用一组地址连续的存储单元依次存储线
性表的元素。
可以利用数组V[n]来实现
L.elem = newbase ;
//重置新基址
L.listsize = L.listsize + LISTINCREMENT ; } //增加表尺寸
realloc (*p, newsize)函数的意思是:新开一 片大小为newsize的连续空间,并把以*p为 首址的原空间数据都拷贝进去。
2020/10/22
数据结构
线性表的定义:用数据元素的有限序列表示
(a1, a2, … ai-1,ai, ai+1 ,…, an)
线性起点
下标,是元素的 序号,表示元素 在表中的位置
2020/10/22
数据元素
ai的直接前趋 ai的直接后继 线性终点
n=0时称为 空表
n为元素总
个数,即表 长。n≥0

数据结构线性表ppt课件(2024)

数据结构线性表ppt课件(2024)
2024/1/30
顺序存储定义
用一段地址连续的存储单元依次 存储线性表的数据元素。
存储方式
逻辑上相邻的元素,其物理存储 位置也相邻。
8
顺序表基本操作实现
初始化操作
创建一个空表,分配存储空间。
插入操作
在指定位置插入一个元素,需移动插入位置后的所有元素。
删除操作
删除指定位置的元素,需移动删除位置后的所有元素。
数据结构线性表ppt课 件
2024/1/30
1
目录
2024/1/30
• 线性表基本概念与特点 • 顺序存储结构及其实现 • 链式存储结构及其实现 • 线性表应用与案例分析 • 线性表性能分析与优化策略 • 总结回顾与拓展延伸
2
01
线性表基本概念与特点
2024/1/30
3
线性表定义及性质
线性表定义:由n(n>=0)个具有相 同类型的数据元素(结点)a1,a2,
动态分配
如果使用动态数组或链表实现线性表,空间复杂度为O(n),其中n为当前线性表中的元素数量。这种 实现方式可以灵活应对元素数量的变化。
2024/1/30
26
优化策略探讨
使用更高效的数据结构
例如,可以使用哈希表或二叉搜索树等数据结构 来优化查找操作的时间复杂度。
批量操作优化
对于批量插入、删除或查找操作,可以通过一次 性处理多个元素来减少操作次数,从而提高效率 。
任何一种逻辑结构都可以用多种存储结构表示。
03
5
线性表基本操作
插入操作
在指定位置插入一 个元素。
查找操作
查找指定元素的位 置。
初始化操作
建立一个空的线性 表。
2024/1/30
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 顺指针向后查找,直到 p 指向第 i 个元素 // 或 p 为空
if ( !p || j>i )
return ERROR; // 第 i 个元素不存在
e = p->data;
// 取得第 i 个元素
return OK; } // GetElem_L
算法时间复杂度为:
O(ListLength(L))
操作步骤:
一、建立一个“空表”;
二、输入数据元素an, 建立结点并插入;
三、输入数据元素an-1, 建立结点并插入;
an
an an-1
四、依次类推,直至输入a1为止。
void HCreateList_L(LinkList &L, int n) {
// 逆序输入 n 个数据元素,建立带头结点的单链表
if (!p || j > i-1)
return ERROR;
……
// i 大于表长或者小于1
} // LinstInsert_L
算法的时间复杂度为: O(ListLength(L))
s = new LNode; s->data = e; s->next = p->next; return OK;
}
练习:写出表尾插入法建立单链表的算法。
} // HCreateList_L
算法的时间复杂度为: O(Listlength(L))
void TCreateList_L(LinkList &L, int n) {
// 顺序输入 n 个数据元素,建立带头结点的单链表 L = (LinkList) malloc (sizeof (LNode));
本操作为:移动指针,比较 j 和 i .
Status GetElem_L(LinkList L, int i, ElemType &e) { // L是带头结点的链表的头指针,以 e 返回第 i 个元素
p = L->next; j = 1; // p指向第一个结点,j为计数器
while (p && j<i) { p = p->next; ++j; }
L->next = NULL; // 先建立一个带头结点的空单链表
q= L;
// q始终指向表尾结点
for (i =1; i ≤ n ; ++i) { p = (LinkList) malloc (sizeof (LNode)); scanf(&p->data); // 输入元素值 p->next = NULL; q->next = p; // 插入 q=p; // q始终指向表尾结点
2.3 线性表类型的实现 ----链式映象
头指针
头结点
头头线指结性点针表的为指空针表域时为,空
空指针
a1 a2 … ... an ^
以线性表中第一个数据元素 a 1 的存 储地址作为线性表的地址,称作线性表 的头指针。
有时为了操作方便,在第一个结点之前 虚加一个“头结点”,以指向头结点的 指针为链表的头指针。
空”,而是“后继是否为头结点”。
2. 双向链表
typedef struct DuLNode { ElemType data; // 数据域 struct DuLNode *prior; // 指向前驱的指针域 struct DuLNode *next; // 指向后继的指针域
} DuLNode, *DuLinkList;
指向后继的指针。
q = p->next; p->next = q->next;
e = q->data; free(q);
p
q
ai-1
ai
ai+1
Status ListDelete_L(LinkList L, int i, ElemType &e) { // 删除以 L 为头指针(带头结点)的单链表中第 i 个结点
找到线性表中第i-1个结点,然后修改 其指向后继的指针。
Status ListInsert_L(LinkList L, int i, ElemType e) { // L 为带头结点的单链表的头指针,本算法 // 在链表中第i 个结点之前插入新的元素 e p = L; j = 0;
while (p && j < i-1) { p = p->next; ++j; } // 寻找第 i-1 个结点
若在指针p所指结点之前插入结点,如何实现此插入算法?
p
ai-1
ai
e
s s->prior = p-> prior ; p-> prior = s;
s->next =p ; s-> prior ->next = s;
双向链表插入结点时算法有多种,关键是不要断链: 只要不先执行 p-> prior = s 语句 即可。
双向循环链表
空表
非空表
a1
a2 … ... an
双向链表的操作特点:
“查询” 和单链表相同
“插入” 和“删除”时需要同时 修改两个方向上的指针。
插入
p
ai-1
ai
e
s s->next = p->next; p->next = s; s->next->prior = s; s->prior = p;
算法的时间复杂度为: O(ListLength(L))
单链表的生成
链表是一个动态的结构,它不需要 预分配空间,因此生成链表的过程 是一个结点“逐个插入” 的过程。
1、由表头插入:得到逆序 --- 头插法 2、由表尾插入:得到正序 --- 尾插法
例如:逆位序输入 n 个数据元素的值, 建立带头结点的单链表。
1.增加“表长”、“表尾指针” 和 “当前 位置的
2.指将针基”本操三作个中数的据“域位;序 i ”改变为“指针 p ”。
四、其它形式的链表
1. 循环链表
最后一个结点的指针域的指针又指 回第一个结点的链表。
a1 a2 … ... an
和单链表的差别在于,判别链表中最
后一个结点如的条何件判不再空是?“后继是否为
p = L; j = 0; while (p->next && j < i-1) { p = p->next; ++j; }
// 寻找第 i 个结点,并令 p 指向其前趋
if (!(p->next) || j > i-1) return ERROR; // 删除位置不合理
q = p->next; p->next = q->next; // 删除并释放结点 e = q->data; free(q); return OK; } // ListDelete_L
// 生成新结点 p->next = s; // 插入
ai-1
ai
p
e
s
线性表的操作ListDelete (&L, i, &e)
在链表中的实现:
有序对<ai-1, ai> 和 <ai, ai+1> 改变为 <ai-1, ai+1>
ai-1
ai
ai+1
在单链表中删除第 i 个结点的基本操
作为:找到线性表中第i-1个结点,修改其
} //} TCreateList_L
算法的时间复杂度为: O(Listlength(L))
用上述定义的单链表实现线性表的操作时, 存在的问题:
1.单链表的表长是一个隐含的值; 2.在单链表的最后一个元素之后插入元素时,
需遍历整个链表; 3.在链表中,元素的“位序”概念淡化,结点的
“位置”概念加强。 改进链表的设置:
// 生成含 n 个数据元素的链表
线性表的操作
GetElem(L, i, &e)
在单链表中的实现:
L
21 18 30 75 42 56 ∧
pp p
i=3
j 123 j=i,则p->data e
分析:单链表是一种 顺序存取 的结
构,为找第 i 个数据元素,必须先找到 第 i-1 个数据元素。
因此,查找第 i 个数据元素的基
L = (LinkList) malloc (sizeof (LNode));
L->next = NULL; // 先建立一个带头结点的空单链表
for (i = n; i > 0; --i) {
p = (LinkList) malloc (sizeof (LNode)); scanf(&p->data); // 输入元素值 p->next = L->next; L->next = p; // 插入
线性表的操作 ListInsert(&L, i, e)
在单链表中的实现:
有序对 <ai-1, ai> 改变为 <ai-1, e> e
可见,在链表中插入结点只需要修改 指针。但同时,若要在第 i 个结点之前 插入元素,修改的是第 i-1 个结点的指 针。
因此,在单链表中第 i 个结点之前进 行插入的基本操作为:
删除 ai-1
ai
ai+1
p
ai-1
ai
ai+1
p->next = p->next->next; p p
p->next->prior = p;
p->next ->next -> prior = p; p->next = p->next->next;
相关文档
最新文档