Chapter 2 Linear List数据结构 入门课件 第二章
合集下载
第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
数据结构第二章线性表.ppt

构造原理
用一组地址连续的存储单元依次存储线性表的数据元素,数 据元素之间的逻辑关系通过数据元素的存储位置直接反映。
k个单元 (a1,a2,a3,... ...,an)
a1 a2 a3
……
an
LOC(ai)
d1+k=d2 d3
………
dn
所谓一个元素的地址是指该元素占用的
若干(连续的)存储单元的第一个单元的地址。
LOC(a5)=100+(5-1)*4=116
线性表 11
顺序存储结构示意图
(a1,a2,a3,... ...,an)
当前已经占用的空间
尚未使用的空间
a1 a2 a3 … … an-1 an
01 2
n-2 n-1 n
……
n+1
M-1
事先分配给线性表的空间
线性表 12
一般来说,长度为n的线性表(a1,a2,…,an)在计算机中 的结构如下:
INSERT(L,x,i)。 6.删除线性表中第i个数据元素DELETE(L,i)。 7.对线性表中的数据元素进行升序或者降序排序。 8.将两个或两个以上的线性表合并成为一个线性表。 9.将一个线性表分解为两个或两个以上的线性表路】 依次输出线性表中的每个元素的值。
编写在线性表A中删除线性表B中出现的元素的算法。
1 3 57 9
12346
579
【算法思路】 依次检查线性表B中的每个元素,看它是否在线性表
A中。若在A中,则将其从A中删除。
线性表
5
void delete(Sqlist *A,Sqlist *B) {
int i,k;
datatype x;
for(i=1;i<=LENGTH(B);i++) {
用一组地址连续的存储单元依次存储线性表的数据元素,数 据元素之间的逻辑关系通过数据元素的存储位置直接反映。
k个单元 (a1,a2,a3,... ...,an)
a1 a2 a3
……
an
LOC(ai)
d1+k=d2 d3
………
dn
所谓一个元素的地址是指该元素占用的
若干(连续的)存储单元的第一个单元的地址。
LOC(a5)=100+(5-1)*4=116
线性表 11
顺序存储结构示意图
(a1,a2,a3,... ...,an)
当前已经占用的空间
尚未使用的空间
a1 a2 a3 … … an-1 an
01 2
n-2 n-1 n
……
n+1
M-1
事先分配给线性表的空间
线性表 12
一般来说,长度为n的线性表(a1,a2,…,an)在计算机中 的结构如下:
INSERT(L,x,i)。 6.删除线性表中第i个数据元素DELETE(L,i)。 7.对线性表中的数据元素进行升序或者降序排序。 8.将两个或两个以上的线性表合并成为一个线性表。 9.将一个线性表分解为两个或两个以上的线性表路】 依次输出线性表中的每个元素的值。
编写在线性表A中删除线性表B中出现的元素的算法。
1 3 57 9
12346
579
【算法思路】 依次检查线性表B中的每个元素,看它是否在线性表
A中。若在A中,则将其从A中删除。
线性表
5
void delete(Sqlist *A,Sqlist *B) {
int i,k;
datatype x;
for(i=1;i<=LENGTH(B);i++) {
数据结构讲义(第二章线性表x)

顺序表——线性表的顺序存储结构 例:(34, 23, 67, 43) 34 23 67 43
存储要点
用一段地址连续的存储单元
依次存储线性表中的数据元素
§2.2 线性表的顺序存储
顺序表——线性表的顺序存储结构 例:(34, 23, 67, 43)
34 23 67 43
用什么属性来描述顺序表?
存储空间的起始位置 顺序表的容量(最大长度)
时间复杂度为O(n)。
2.2.2顺序表的实现
顺序表的实现——删除 (a1,…,ai-1,ai,ai+1,…,an) … length- - ; (a1,…,ai-1,ai+1,…,an )
例:线性表 (4,9,15,21,28,30,30,42,51,62),删除28。
1 顺序表 移动元素 4 4 2 9 9 3 15 15
§2.2 线性表的顺序存储
顺序表——线性表的顺序存储结构 例:(34, 23, 67, 43) 34 23
67
43
如何实现顺序表的内存分配?
顺序表
一维数组
§2.2 线性表的顺序存储
顺序表
一般情况下,(a1,a2,…, ai-1,ai , …, an)的顺序存储:
0 … i-2 i-1 … n-1 Max-1
数据元素的逻辑特性:
数据元素之间的先后顺序为“一对一”的关系。 ai-1领先于ai 则ai-1是ai的直接前驱元素 ai-1落后于ai 则ai是ai-1的直接后继元素 除a1外,每个元素有且仅有一个直接前驱元素 除an外,每个元素有且仅有一个直接后继元素 线性表中数据元素的个数n(n≥0)称为线性表的长 度(n=0时,该线性表称为空表)
data[0] data[1] data[2]
存储要点
用一段地址连续的存储单元
依次存储线性表中的数据元素
§2.2 线性表的顺序存储
顺序表——线性表的顺序存储结构 例:(34, 23, 67, 43)
34 23 67 43
用什么属性来描述顺序表?
存储空间的起始位置 顺序表的容量(最大长度)
时间复杂度为O(n)。
2.2.2顺序表的实现
顺序表的实现——删除 (a1,…,ai-1,ai,ai+1,…,an) … length- - ; (a1,…,ai-1,ai+1,…,an )
例:线性表 (4,9,15,21,28,30,30,42,51,62),删除28。
1 顺序表 移动元素 4 4 2 9 9 3 15 15
§2.2 线性表的顺序存储
顺序表——线性表的顺序存储结构 例:(34, 23, 67, 43) 34 23
67
43
如何实现顺序表的内存分配?
顺序表
一维数组
§2.2 线性表的顺序存储
顺序表
一般情况下,(a1,a2,…, ai-1,ai , …, an)的顺序存储:
0 … i-2 i-1 … n-1 Max-1
数据元素的逻辑特性:
数据元素之间的先后顺序为“一对一”的关系。 ai-1领先于ai 则ai-1是ai的直接前驱元素 ai-1落后于ai 则ai是ai-1的直接后继元素 除a1外,每个元素有且仅有一个直接前驱元素 除an外,每个元素有且仅有一个直接后继元素 线性表中数据元素的个数n(n≥0)称为线性表的长 度(n=0时,该线性表称为空表)
data[0] data[1] data[2]
数据结构 第二章 线性表

2020/3/25
7
第二章 线性表
int ListLength(L) //求线性表的长度 初始条件:线性表L存在 操作结果:返回L中数据元素个数,若L为空,则返回0
Status ListIsEmpty(L) //判断线性表是否为空 初始条件:线性表L存在 操作结果:若L为空表,则返回TRUE,否则返回FALSE
针对后一种方法,利用刚才定义的线性表基本操作来实现: 首先利用求线性表长度运算,分别求出两个集合的元素个数, 然后利用取元素运算,从Lb中逐个取出元素,利用查找算法确 定是否在La中,没有不在,再利用插入算法,将该元素插入到 La。
2020/3/25
10
void Union(List &La,List Lb) { //两个集合的并。将Lb中不在La中的元素插入到La m = ListLength(La); n = ListLength(Lb);
假设线性表的每个元素需占用k存储单元,那以在
顺序存储结构中,该线性表的第i+1个数据元素ai+1的 存储位置与ai的存储位置之间存在如下关系:
LOC(ai+1)=LOC(ai)+k 即:用物理上的相邻实现数据元素之间的逻辑相邻
关系。 如果第一个数据元素的存储位置用LOC(a1)表示(称
为首地址或基地址),那么线性表的第i个元素ai的存 储位置可以表示为:
}SqList;
指针方式表示的动态顺序存储结构:
#define ListInitSize 100 //线性表的初始大小
#define ListIncrement 10 //线性表存储空间的分配增量
typedef struct{
ElemType *data; //存储空间基地址,由data指示
数据结构2线性表

Templete <class type> listNode<type> * list<type>::find(int i){ If( i<-1) return NULL; If(i==-1) return first; listNode<type> *p=first->link; int j=0; while(p!=NULL && j<i) { p=p–>link; j++; } return p; }
第二章 数组
2.1 线性表
2.2
顺序表 2.3 单链表 2.4线性链表的其他变形 2.5单链表的应用:多项式及其运 算
2.1线性表
线性表(Linear List) :由n(n≧0)个数据元素(结 点)a1,a2, …an组成的有限序列。其中数据元 素的个数n定义为表的长度。当n=0时称为空 表,常常将非空的线性表(n>0)记作: (a1, a2,…an) ( )
线性表的链式表示和实现
顺序存储 线性表存储结构 非顺序存储 链表
顺序表的优点:取数方便快速。 缺点:删除、插入平均要移o(n)个元素。 适应性 不强。
链表:是指用一组任意的存储单元来存 放线性表的结点,这组存储单元可以是 零散分布在内存中的任意位置上的。 任意的存储单元如何存放线性表 例:(a1,a2,a3,a4) 链表中的结点结构: data link
12 15 33 45 67 89 57 78
0 1 2 3 4 5 6 7
程序实现
Templet <class type> int Seqlist<type> ::Find(type &x ) const{ Int i=0; while(i<=last && data[i]!=x) i++; If (i>last) return -1; //没找到 Else return i; //找到 }
数据结构导论 第2章 线性表

线性表(linear list) 第二章 线性表
线性表是一种线性结构,线性结构的特点是数据元 素之间是一种线性关系,数据元素“一个接一个的 排列”。 线性结构是n(n>=0)个结点的有穷序列。对于 n>0的线性结构表示成: (a1,a2,… ai-1,ai,ai+1,…an) a1称为起始结点 an称为终端结点 起始结点, 终端结点; 起始结点 终端结点 ai-1 称为 ai 的直接前趋 i+1 称为 ai 的直接后继 直接前趋,a 直接后继。 直接前趋 直接后继
4.查找(定位) locate(L,x): .查找(定位) :
依次将顺序表L中的每个元素与给定的值x进行比 较。若找到则返回其序号(下标+1),否则返回0。 int locate (sqlist L, datatype x) { int i; for ( i=0; i<st; i++) if (L.data[i]==x) return (i+1); return(0); }
void insert (sqlist *L, datatype x, int i ) { if (i<1 || i>L->last+1) error (“插入位置错误”); else if (L->last==maxsize) error (“溢出”); else { for (j=L->last-1; j>=i-1; j--) //往后移动元素 //往后移动元素 L->data[j+1]=L->data[j]; L->data[i-1]=x; //插入x L->last++; //修改表长 } }
常见的线性表的基本运算有以下几个: 常见的线性表的基本运算有以下几个:
线性表是一种线性结构,线性结构的特点是数据元 素之间是一种线性关系,数据元素“一个接一个的 排列”。 线性结构是n(n>=0)个结点的有穷序列。对于 n>0的线性结构表示成: (a1,a2,… ai-1,ai,ai+1,…an) a1称为起始结点 an称为终端结点 起始结点, 终端结点; 起始结点 终端结点 ai-1 称为 ai 的直接前趋 i+1 称为 ai 的直接后继 直接前趋,a 直接后继。 直接前趋 直接后继
4.查找(定位) locate(L,x): .查找(定位) :
依次将顺序表L中的每个元素与给定的值x进行比 较。若找到则返回其序号(下标+1),否则返回0。 int locate (sqlist L, datatype x) { int i; for ( i=0; i<st; i++) if (L.data[i]==x) return (i+1); return(0); }
void insert (sqlist *L, datatype x, int i ) { if (i<1 || i>L->last+1) error (“插入位置错误”); else if (L->last==maxsize) error (“溢出”); else { for (j=L->last-1; j>=i-1; j--) //往后移动元素 //往后移动元素 L->data[j+1]=L->data[j]; L->data[i-1]=x; //插入x L->last++; //修改表长 } }
常见的线性表的基本运算有以下几个: 常见的线性表的基本运算有以下几个:
数据结构(第二章 线性表)
◆ 线性表中的结点可以是记录型元素,每个元素含有多个数 据项 ,每个项称为结点的一个域 。每个元素有一个可以唯 一标识每个结点的数据项组,称为关键字。
例4 : 某校2001级同学的基本情况:{(‘2001414101’,‘张里户’, ‘男’,06/24/1983), …, (‘2001414102’,‘李利辣’,‘女’, 08/12/1984) }
-当n=0时,称为空表。 -当n>0时,将非空的线性表记作: (a1,a2,…an) 其中,a1称为线性表的第一个(首)结点,an称为线性表的最 后一个(尾)结点。相邻数据元素存在序偶关系。 a1,a2,…ai-1都是ai(2≦i≦n)的前驱,其中ai-1是ai的直接 前驱; ai+1,ai+2,…an都是ai(1≦i ≦n-1)的后继,其中ai+1是ai 的直接后继。
Status Init_SqList( SqList *L ) { L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ; if ( !L -> elem_array ) return ERROR ; else { L->length= 0 ; return OK ; } }
2.2 线性表的顺序表示和实现
顺序表的基本操作
2 顺序线性表的插入 在线性表 L= (a1,…a i-1,ai, ai+1,…,an) 中的第
i(1≦i≦n)个位置上插入一个新结点e,使其成为线性表: L=(a1,…a i-1,e,ai,ai+1,…,an)
实现步骤 (1) 将线性表L中的第i个至第n个结点后移一个位置。 (2) 将结点e插入到结点ai-1之后。 (3) 线性表长度加1。
例4 : 某校2001级同学的基本情况:{(‘2001414101’,‘张里户’, ‘男’,06/24/1983), …, (‘2001414102’,‘李利辣’,‘女’, 08/12/1984) }
-当n=0时,称为空表。 -当n>0时,将非空的线性表记作: (a1,a2,…an) 其中,a1称为线性表的第一个(首)结点,an称为线性表的最 后一个(尾)结点。相邻数据元素存在序偶关系。 a1,a2,…ai-1都是ai(2≦i≦n)的前驱,其中ai-1是ai的直接 前驱; ai+1,ai+2,…an都是ai(1≦i ≦n-1)的后继,其中ai+1是ai 的直接后继。
Status Init_SqList( SqList *L ) { L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ; if ( !L -> elem_array ) return ERROR ; else { L->length= 0 ; return OK ; } }
2.2 线性表的顺序表示和实现
顺序表的基本操作
2 顺序线性表的插入 在线性表 L= (a1,…a i-1,ai, ai+1,…,an) 中的第
i(1≦i≦n)个位置上插入一个新结点e,使其成为线性表: L=(a1,…a i-1,e,ai,ai+1,…,an)
实现步骤 (1) 将线性表L中的第i个至第n个结点后移一个位置。 (2) 将结点e插入到结点ai-1之后。 (3) 线性表长度加1。
数据结构课件:第2章 线性表、堆栈和队列
2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式栈的比较 2.5.5 堆栈的应用
堆栈的顺序存储
使用数组存放栈元素,栈的规模必须小于或等 于数组的规模,当栈的规模等于数组的规模时, 就不能再向栈中插入元素。
栈顶所在数组元素的下标: int top;
堆栈空: top = -1 堆栈满: top = MaxStackSize-1
第二章 线性表、堆栈和队列
2.1 线性表的定义和基本操作 2.2 线性表的顺序存储结构 2.3 线性表的链接存储结构 2.4 复杂性分析 2.5 堆栈 2.6 队列
2.5 堆 栈
2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式栈的比较 2.5.5 堆栈的应用
// 存放堆栈元素的数组
int top ;
// 栈顶所在数组元素的下标
public:
AStack ( int MaxStackSize ) // 构造函数
{ size = MaxStackSize ; stackArray = new T [MaxStackSize] ; top = -1 ; }
~AStack ( ) { delete [ ] stackArray ; } // 析构函数
另外,链式栈中不需要哨位结点。
链式栈LStack的类定义 template < class T > class LStack{
private : SLNode <T> * top ; // 栈顶指针指向表头
public : LStack ( ) { top = NULL ; } // 构造函数 ~LStack ( ) { clear ( ) ; } // 析构函数
堆栈的顺序存储
使用数组存放栈元素,栈的规模必须小于或等 于数组的规模,当栈的规模等于数组的规模时, 就不能再向栈中插入元素。
栈顶所在数组元素的下标: int top;
堆栈空: top = -1 堆栈满: top = MaxStackSize-1
第二章 线性表、堆栈和队列
2.1 线性表的定义和基本操作 2.2 线性表的顺序存储结构 2.3 线性表的链接存储结构 2.4 复杂性分析 2.5 堆栈 2.6 队列
2.5 堆 栈
2.5.1 堆栈的定义和主要操作 2.5.2 顺序栈 2.5.3 链式栈 2.5.4 顺序栈与链式栈的比较 2.5.5 堆栈的应用
// 存放堆栈元素的数组
int top ;
// 栈顶所在数组元素的下标
public:
AStack ( int MaxStackSize ) // 构造函数
{ size = MaxStackSize ; stackArray = new T [MaxStackSize] ; top = -1 ; }
~AStack ( ) { delete [ ] stackArray ; } // 析构函数
另外,链式栈中不需要哨位结点。
链式栈LStack的类定义 template < class T > class LStack{
private : SLNode <T> * top ; // 栈顶指针指向表头
public : LStack ( ) { top = NULL ; } // 构造函数 ~LStack ( ) { clear ( ) ; } // 析构函数
数据结构第2章 线性表
大长度*/
};
当初始化此类型的一个线性表时,要使list指针指向大小为MaxSize的动 态数组空间。
2.2.2 顺序存储下的线性表的操作实现
1. 初始化线性表L,即进行动态存储空间分配并置L为一个空表 void InitList(struct List *L,int ms) { /*检查ms是否有效,若无效则退出运行*/ if(ms<=0) {printf("ms值非法!\n"); exit(1);} /*置线性表空间大小为ms*/ L->MaxSize=ms; /*动态存储空间分配,若分配失败则退出运行*/ L->list=malloc(ms*sizeof(ElemType)); if(!L->list) { printf("动态存储分配失败!\n"); exit(1); /*执行此函数则中止程序运行,此函数在stdlib.h中有定义*/ } /*初始置线性表为空*/ L->size=0; }
5. 向有序线性表L中插入元素x,使得插入后仍然有序 有序线性表是指按元素值从小到大顺序排列的线性表,如(23,36,45,49,56,73,80) 就是一个有序线性表。向有序线性表中插入一个新元素后要保证仍然是有序的,需要进 行的插入过程为: (1) 检查表空间是否用完,若是则分配更大的存储空间; (2) 采用顺序查找的方法查找出x的插入位置; (3) 从表尾到插入位置止,把所有位置上的元素均后移一个位置; (4) 把新元素写入到空出的位置上; (5) 线性表的长度增1。 算法描述为: void InsertOrderList(struct List *L, ElemType x) { int i,j; /*若数组空间用完则重新分配更大的存储空间*/ if(L->size==L->MaxSize) againMalloc(L); /*顺序查找出x的插入位置*/ for(i=0; i<L->size; i++) if(x<L->list[i]) break; /*从表尾到下标i元素依次后移一个位置,把i位置空出*/
};
当初始化此类型的一个线性表时,要使list指针指向大小为MaxSize的动 态数组空间。
2.2.2 顺序存储下的线性表的操作实现
1. 初始化线性表L,即进行动态存储空间分配并置L为一个空表 void InitList(struct List *L,int ms) { /*检查ms是否有效,若无效则退出运行*/ if(ms<=0) {printf("ms值非法!\n"); exit(1);} /*置线性表空间大小为ms*/ L->MaxSize=ms; /*动态存储空间分配,若分配失败则退出运行*/ L->list=malloc(ms*sizeof(ElemType)); if(!L->list) { printf("动态存储分配失败!\n"); exit(1); /*执行此函数则中止程序运行,此函数在stdlib.h中有定义*/ } /*初始置线性表为空*/ L->size=0; }
5. 向有序线性表L中插入元素x,使得插入后仍然有序 有序线性表是指按元素值从小到大顺序排列的线性表,如(23,36,45,49,56,73,80) 就是一个有序线性表。向有序线性表中插入一个新元素后要保证仍然是有序的,需要进 行的插入过程为: (1) 检查表空间是否用完,若是则分配更大的存储空间; (2) 采用顺序查找的方法查找出x的插入位置; (3) 从表尾到插入位置止,把所有位置上的元素均后移一个位置; (4) 把新元素写入到空出的位置上; (5) 线性表的长度增1。 算法描述为: void InsertOrderList(struct List *L, ElemType x) { int i,j; /*若数组空间用完则重新分配更大的存储空间*/ if(L->size==L->MaxSize) againMalloc(L); /*顺序查找出x的插入位置*/ for(i=0; i<L->size; i++) if(x<L->list[i]) break; /*从表尾到下标i元素依次后移一个位置,把i位置空出*/