第2章线性表ppt课件

合集下载

数据结构课件第2章线性表

数据结构课件第2章线性表

27
线性表的顺序存储结构适用于数据 元素不经常变动或只需在顺序存取设备 上做成批处理的场合。为了克服线性表 顺序存储结构的缺点,可采用线性表的 链式存储结构。
28
2.3 线性表的链式存储结构
线性表的链式存储表示 基本操作在单链表上的实现 循环链表 双向链表 线性表链式存储结构小结
2.3.1 线性表的链式存储表示 29
2.1.1 线性表的定义
6
一个线性表(linear_list)是 n(n≥0)个具有相同属性的数 据元素的有限序列,其中各元素有着依次相邻的逻辑关系。
线性表中数据元素的个数 n 称为线性表的长度。当 n = 0 时 该线性表称为空表。当 n > 0 时该线性表可以记为:
(a1,a2,a3,…,ai,…,an)
数据域 指针域
结点 data next
31
(2) 线性表的单链表存储结构
通过每个结点的指针域将线性表中 n 个结点按其逻辑顺序链 接在一起的结点序列称为链表,即为线性表 ( a1, a2, a3, …, ai, …, an ) 的链式存储结构。如果线性链表中的每个结点只有一个指针域, 则链表又称为线性链表或单链表 (linked list)。
17
(2) 算法编写
#define OK 1
#define ERROR 0
Int InsList ( SeqList *L, int i, ElemType e ) /*在顺序线性表 L 中第 i 个位置插入新的元素 e。*/ /* i 的合法值为 1≤i ≤L->last+2*/ {
int k; if ( i < 1) ||( i > L->last+2)) /*首先判断插入位置是否合法*/ { printf(“插入位置i值不合法”);

第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课件
➢ 数组(Array)存储具有相同数据类型的元素集合。 一维数组占用一块内存空间,每个存储单元的地 址是连续的,计算第i个元素地址所需时间复杂度 是一个常量, 与元素序号i无关。
线性表的分类
线性表 ADT
顺序存储结构 (元素连续存储、
继承
顺序表类
排序顺序表类
随机存取结构)
继承
链式存储结构
(元素分散存储)
单链表 双链表
单链表类 循环单链表 双链表 循环双链表类
排序单链表类
继承 排序循环双链表类
线性表的存储结构
2.2 线性表的顺序存储和实现
线性表的顺序存储结构
数组 :是实现顺序存储结构的基础。
数据结构
第 2 章 线性表
线性结构
线性结构是最常用、最简单的一种数据结构。而线性 表是一种典型的线性结构。其基本特点是线性表中的数据 元素是有序且是有限的。
线性结构基本特征: ① 存在一个唯一的被称为“第一个”的数据元素; ② 存在一个唯一的被称为“最后一个”的数据元素; ③ 除第一个元素外,每个元素均有唯一一个直接前驱; ④ 除最后一个元素外,每个元素均有唯一一个直接后 继。
其中LinearList称为线性表的名称 每个ai(n-1≥i≥0)称为线性表的数据元素,可以是整数、
浮点数、字符或类 表中相邻元素之间存在着顺序关系:将 ai-1 称为 ai 的前
驱(Predecessor),ai+1 称为 ai 的后继 (Successor)。a0没有前驱元素,an-1没有后继元素 具体n的值称为线性表中包含有数据元素的个数,也称 为线性表的长度(Length) 当n的值等于0时,表示该线性表是空表
2.1 线性表抽象数据类型
线性表的定义

第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
由于C语言函数的参数仅能向被调函数传值,这个值在返 回时也不会改变,因此在上面的算法中,采用指针变量v做形 参,虽然从被调函数返回时指针v值不变,但是v地址中所代表 的结构体的内容发生了变化。这就是所谓的传址调用。
假设在主函数中已经建立了线性表结构体s,并且要在第3 个位置插入88,语句如下:
insert ( &s,3,88);
其他特 VIP专享精彩活动

VIP专属身份标识
开通VIP后可以享受不定期的VIP随时随地彰显尊贵身份。
专属客服
VIP专属客服,第一时间解决你的问题。专属客服Q全部权益:1.海量精选书免费读2.热门好书抢先看3.独家精品资源4.VIP专属身份标识5.全站去广告6.名
以用来说明结构体变量:
Sqlist1 a; 在正式使用a之前必须为数据成员elem分配足够的空间。 语句如下:
a.elem=(Sqlist1 *)malloc(MAXSIZE*sizeof(Sqlist1)); 对结构体内elem子域的访问与前文有所不同。在输入/输出时 的情况,也与前文有所不同。在程序运行结束之前,这些动态 分配的存储空间还要释放归还给系统,语句如下:
(5) Insert(L,i,x) 在线性表中第i个元素之后(或之前)插入一个新元素x;
(6) Delete(L,i) 删除线性表中的第i个元素;
(7) Empty(L)
判断线性表是否为空;
(8) Clear(L)
将已知的线性表清理为空表;
第2章 线 性 表
在上述的操作运算中,最基本最重要的是插入、删除。 线性表的其他复杂操作和运算还有:对有序表的插入和删除; 按某种要求重排线性表中各元素的顺序;按某个特定值查找 线性表中的元素;两个线性表的合并等。

《第二章线性表》PPT课件

《第二章线性表》PPT课件
en = e; // en为最后一次La插入的值 } // La中不存在和 e 相同的数据元素,则插入
例 2-3
归并两个"其数据元素按值非递减有序 排列"的有序表 LA 和 LB,求得有序表 LC 也具有同样特性.
设 La = <a1, …, ai, …, an>, Lb = <b1, …, bj, …,
ListInsert<Lc, ++k, ai>; ++i; } else { // 将 bj 插入到 Lc 中
ListInsert<Lc, ++k, bj>; ++j; }
void MergeList<List La, List Lb, List &Lc> { // 本算法将非递减的有序表 La 和 Lb 归并为 LcInitList<Lc>; // 构造空的线性表 Lc
是最后一个元素,则用next_e 返回它的后继,否则操作失 败,next_e无定义。
GetElem< L, i, &e >
〔求线性表中某个数据元素〕
初始条件:线性表 L 已存在,
且 1≤i≤LengthList(L)
操作结果:用 e 返回L中第 i 个元素的值。
LocateElem< L, e, compare< > >
bj 插入到 LC 中; 4.重复 2 和 3 两步,直至 LA 或 LB 中元素
被取完为止; 5.将 LA 表或 LB 表中剩余元素复制插入到
LC 表中.
// La 和 Lb 均非空,i = j = 1, k = 0 GetElem<La, i, ai>; GetElem<Lb, j, bj>; if <ai <= bj> { // 将 ai 插入到 Lc 中
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EElelemmTTyyppee e*elelemm[M;AXSIZE]; iinninttt lellneisgnttsghitz;he;; }}SSqqLLiisstt;;
2、顺序表的插入
定义:线性表的插入是指在第i(1i n+1)个元素 之前插入一个新的数据元素x,使长度为n的线性表 变为n+1的线性表。
数据结构课程的起点:
什么是 线性结构?
2.1
线性结构的特点:
非空线性表中, (1)存在唯一的一个被称为“第一个”的结点 (2)存在唯一的一个被称为“最后一个”的结点 (3)除第一个之外,表中的每个结点均有且只有
一个前驱结点 (4)除最后一个之外,表中的每个结点均有且只
有一 个后继结点
线性结构反映结点间的逻辑关系是 一对一 (1:1) 的。
typed} eEfleinmt TEylepme;Type; 备 #define M 1000 用 空 ElemType data[M]; 间
或动态M申-1请和释放内存
ElemType *pData数;据元素不是简单类型时,可定义结构体数组
pData = (ElemType *)malloc(M*sizeof(ElemType));
a 1 , a 2 , , a i - 1 , a i , a n
( ) a 1 , a 2 , , a i -1 , x , a i , a n
实现步骤: 将第n至第i 位的元素向后移动一个位置; 将要插入的元素写到第i个位置; 表长加1。 注意事先应判断:
L.Length=0;
//空表长度为0
L.listsize=LIST_INIT_SIZE ; //初始存储容量
return OK; }
#define MAXSIZE 100 #define LIST_INIT_SIZE 100 t#tyydppeeefddineeeff LssIttSrruTucIcNttCREMENT 10 {{
第二章 线性表
本章学习要点:
深入掌握线性表的逻辑结构及相关概念。 深入掌握线性表的两种存储结构。
采用顺序存储方法来表示线性关系,得到顺序表;采用链式存储方式来 表示线性关系,得到链表。体会这两种存储方式之间的差异及其各自的 优缺点。
深入掌握顺序表上各种基本运算的实现过程。 深入掌握链表上各种基本运算的实现过程。 灵活运用顺序表和链表的特点解决应用问题。
P23 算法2.3
1、顺序表的初始化(算法2.3)
//构造空的线性表L,如果成功则返回OK,否则返回失败信息
Status InitList_Sq(SqList &L)
{ L.elem=(ElemType *)malloc(LIST_INIT_SIZE *
sizeof(ElemType ));
if(!L.elem) exit(OVERFLOW); //存储分配失败
newbase=(ElemType *) realloc
(L.elem,(L.listsize+LISTINCREMENT) *sizeof(ElemType ));
if (! newbase) exit(OVERFLOW); //存储分配失败
L.elem=newbase;
//新基址
L.listsize+=LISTINCREMENT; }
因此:LOC( M[3] ) = 98 + 5 ×(4-1) =113
数组下标
内存
元素序号
0
a1
1
1
a2
2 typedef struct card {
int num;
char name[20];
char author[10];
char publisher[30];
n-1
an
n
float price;
q=&(L.elem[i-1]);
fr2e0e19(/p12D/2 ata);
二、线性表的顺序存储结构定义 2.2 ——静态
#define MAXSIZE 100
typedef struct {
ElemType elem[MAXSIZE]; int length; }SqList;
二、线性表的顺序存储结构定义 2.2 ——动态
#define LIST_INIT_SIZE 100
2.1 线性表的类型定义 2.1
线性表(linear_list)
---- n(n>=0)个具有相同特征数据元素的有限序列。
是最简单且最常用的一种数据结构。
(a1, a2, … ai-1,ai, ai+1 ,…, an)
线性起点
数据元素
ai的直接前趋 ai的直接后继 线性终点
下标,是元素的 序号,表示元素 在表中的位置
插入位置i 是否合法?表是否已满?
2、顺序表的插入
P24 算法2.4
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{ if (i<1 ||i>L.length+1 ) return ERROR; //i值不合法
if (L.Length>=L.listsize) { //当前存储空间已满,增加分配
//线性表存储空间的初始分配量
#define LISTINCREMENT 10
//线性表存储空间的分配增量
typedef struct
{
ElemType *elem; //存储空间基址,
体现动态性
int length;
//当前长度
int listsize;
//当前分配的存储容量
}SqList;
三、顺序表的基本操作
注意:同一线性表中ຫໍສະໝຸດ 元素必定具有相同特性 !例1 一个一维数组M,下标的范围是0
到9,每个数组元素用相邻的5个字节 存储。存储器按字节编址,设存储数组 元素M[0]的第一个字节的地址是98, 则M[3]的第一个字节的地址是 113
解:地址计算通式为:
LOC(ai) = LOC(a1) + L *(i-1)
n=0时称为 空表
n为元素总
个数,即表 长。n≥0
2.1
例1 分析26 个英文字母组成的英文表是什么结构。 ( A, B, C, D, …… , Z)
分析: 数据元素都是同类型(字母), 元素间 关系是线性的。
2.1 例2 分析学生情况登记表是什么结构。
分析:数据元素都是同类型(记录),元素间关系是线性的。
相关文档
最新文档