数据结构课件-线性表顺序表
第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
数据结构线性表顺序表课件可编辑全文
1 n
in1(ni)n21
O(n)
O(n)
最好情况 在n+1处插入,不需移动 删除第n个,不需移动
第33页,此课件共48页哦
线性表应用举例
• 例1:合并线性表 • 例2:归并线性表
第34页,此课件共48页哦
例1:合并线性表
• 假设有两个集合 A 和 B 分别用两个线性表 LA
和 LB 表示,即:线性表中的数据元素即为集合
关于数据结构线性表 顺序表
第1页,此课件共48页哦
线性结构四大特点
第一个元素无直接前驱 最后一个元素无直接后继 除第一个元素外,其他每个数据元素都 有唯一一个直接前驱
除最后一个元素外,其他每个数据元素都 有唯一一个直接后面
第2页,此课件共48页哦
线性表
• 定义 最基本、最常用的线性结构。若n(n≥0)个数据
顺序表---- 基本算法
(8)删除
在顺序表中删除指定位置的数据 元素,删除成功,表长减1。
第24页,此课件共48页哦
线性表操作
ListDelete(&L, i, &e)的实现:
首先分析:
删除元素时,
线性表的逻辑结构发生什么变化?
第25页,此课件共48页哦
(a1, …, ai-1, ai, ai+1, …, an) 改变为 (a1, …, ai-1, ai+1, …, an)
第40页,此课件共48页哦
问题分析:
LC中的数据元素或是LA中的数据元素,或是 LB中的数据元素。则先设LC为空表,然后将 LA或LB中的元素逐个插入到LC中。为使LC表 按值非递减有序排列,可设两个整型变量i、 j,分别指向LA和LB,比较i、j所指元素的大小 ,决定哪个元素插入LC。插入后,在LA 或LB 中顺序后移。
数据结构之线性表课件
1) 在单链表上找到插入位置,即找到第i个结点。 可以用遍历的方法,即从表头起顺次访问单链
表的结点,直至找到第i个结点。 2) 生成一个以x为值的新结点。 可通过C的库函数malloc(size)来产生。 3) 将新结点链入单链表中。 需要改变相关结点的指针 ,如下面的图所示。
H
a1
an ^
空表
……
为了编程方便,一般在单链表的第一个 结点之前加一个“头结点”,如:
head
a1
an ^
当为空表时,即head->next=null, 如下图。
head
^
指针的概念
假设p是一个pointer类型,应正确区分指针型 变量、指针、指针所指的结点和结点的内容 这四个密切相关的不同概念:
2.1线性表的逻辑结构
线性表的定义 线性表是由n个结点a1,a2,…..,an 组成的有 限序列,当n=0时,线性表为空,即为空表。 若n>0, 则a1是第1个结点,an是最后一个结点。
其形式化的定义为: S=(D,R) 其中:D是由n个元素组成的集合, R是定义在集合D上的一种关系。
2.1线性表的逻辑结构
2. 元素的删除(Delete)
在顺序表L=(a1,a2,… ,ai,…,an)中删除第i个结 点,使成为
L=(a1,a2,…,ai-1, ai+1,…, an)
基本思想:要求删除第i个数据元素,由于线性 表元素在数组中必须连续排列,中间不能有空 单元,故将此元素删除后,它后面的所有元素 都需要向前移动一个单元,且数据元素总数由 原来的n减少到n-1.
数据结构之线性表课件
第二章 线性表
知 识 点
数据结构第二章线性表.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++) {
《数据结构》课程课件第二章线性表
Step2:数据域赋值
插入后: Step3:插入(连接)
X q
(1)式和(2)式的顺序颠倒,可以吗?
4、插入元素(在第i个元素之前插入元素e)
为什么时间复杂度不再是O(1)?
第i-1个元素
第i个元素
p
s
新插入元素
5、删除p所指元素的后继元素
P
删除前:
P->next P->next->next
删除:
五、线性表ADT的应用举例
Void mergelist(list La,list Lb,list &Lc)
{ //已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc中的元素也按值非递减排列
例: 将两个各有n个元素的有序表归并成一个有序表, 其最小的比较次数是( )。 A、n B、2n-1 C、2n D、n-1
三、线性表的ADT
四、线性表的分类
五、线性表ADT的应用举例
例1:已知有线性表L,要求删除所有X的出现
五、线性表ADT的应用举例
例2: 已知有两个分别有序的线性表(从小到大),要 求合并两个线性表,且合并后仍然有序。——归并 方法1: 合并,再排序O((m+n)2)
方法2: 归并,利用分别有序的特点O((m+n))
二、线性表上常见的运算
8、删除 Delete(L,i):删除线性表的第i个元素 删除前 a1 a2 … ai-1 ai ai+1 … an 删除后 a1 a2 … ai-1 ai+1 … an 9、判断是否为空 Empty(L):线性表空,则返回TRUE, 否则FALSE 10、输出线性表 Print(L):输出线性表的各个元素 11、其它操作 复制、分解、合并、分类等
大学数据结构课件2.线性表
线性表顺序存储结构的主要优缺点
主要优点: 主要优点 算法简单,空间单元利用率高; 算法简单,空间单元利用率高; 主要缺点: 主要缺点 1. 插入和删除时需要移动较多的数据元素,所以在频 插入和删除时需要移动较多的数据元素, 繁时行插入、删除操作时效率较低。 繁时行插入、删除操作时效率较低。 2.需要预先确定数据元素的最大个数。并预先占用一 需要预先确定数据元素的最大个数。 需要预先确定数据元素的最大个数 片地址连续的存储空间。 片地址连续的存储空间。 3. 如果插入数据元素量超过预先分配的存储空间时, 如果插入数据元素量超过预先分配的存储空间时, 要临时扩大有很大困难。 要临时扩大有很大困难。
elem [100] length=0
elem [0]=1 Elem[1]=2 … Elem[4]=5 … Elem[9]=10 length=10
Insert(&myList, i, i+1); Delete(&myList, 4); for(i = 0; i < Length(myList); i++) Get(myList, i, &x); }
程序设计如下: 程序设计如下: void main(void) {Sqlist myList; int i , x; Initiate(&myList); for(i = 0; i < 10; i++)
#include <stdio.h> #include "Sqlist.h" #define MAXSIZE 100 typedef int ElemType;
数据域 指针域
或
data next
2.3.1 结点结构与指针变量
《数据结构》课件
第二章 线性表
1
线性表的顺序存储结构
2
线性表的顺序存储结构使用数组来存储元素,
可以快速随机访问元素。
3
线性表的常见操作
4
线性表支持常见的操作,包括插入、删除、 查找等,可以灵活地操作其中的元素。
线性表的定义和实现
线性表是一种数据结构,它包含一组有序的 元素,可以通过数组和链表来实现。
线性表的链式存储结构
线性表的链式存储结构使用链表来存储元素, 支持动态扩展和插入删除操作。
第三章 栈与队列
栈的定义和实现
栈是一种特殊的线性表,只能在一 端进行插入和删除操作,遵循后进 先出的原则。
队列的定义和实现
队列是一种特殊的线性表,只能在 一端进行插入操作,在另一端进行 删除操作,遵循先进先出的原则。
栈和队列的应用场景和操作
哈希表是一种高效的查找数据结构, 通过哈希函数将关键字映射到数组 中,实现快速查找。
排序算法包括冒泡排序、插入排序 和快速排序等,可以根据数据规模 和性能要求选择合适的算法。
结语
数据结构的学习心得 总结
学习数据结构需要掌握基本概念 和常见操作,通过实践和练习加 深理解和熟练度。
下一步学习计划的安 排
在掌握基本数据结构的基础上, 可以进一步学习高级数据结构和 算法,提升编程技能。
相关学习资源推荐
推荐一些经典的数据结构教材和 在线学习资源,如《算法导论》 和LeetCode等。
栈和队列在计算机科学中有许多应 用,如函数调用、表达式求值和作 业调度等。
第四章 树与二叉树
树的定义和性质
树是由节点和边组成的一种非线性数据结构,每个 节点可以有多个子节点。
二叉树的遍历方式
二叉树的遍历方式包括前序遍历、中序遍历和后序 遍历,可以按不同顺序输出节点的值。
数据结构线性表ppt课件
线性表的分类
线性表 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 线性表抽象数据类型
线性表的定义
线性表---顺序表链表
线性表---顺序表链表⼀、线性表 1、线性表中的元素是⼀对⼀的关系,除了第⼀个与最后⼀个元素之外其他数据元素都是⾸尾相连的。
如果是⼀对多就⽤树来表⽰,如果是多对多就⽤⽹状来表⽰。
2、线性表的两种存储结构顺序表:⽤顺序结构保存数据,数据在内存中是连续的。
链表:⽤链式存储结构保存数据,数据在内存中是不连续的。
⼆、顺序表 1、顺序表:顺序表⼀般使⽤数组实现,顺序表的相关操作与数组相关,⼀般都是移动数组元素顺序表封装所需要的三个属性:存储空间的起始位置。
数组date的存储位置就是线性表存储空间的存储位置。
线性表的最⼤存储容量。
数组长度MAXSIZE.线性表的的当前长度。
length注意:数组的长度与线性表的当前长度是不⼀样的。
数组的长度是线性表的存储空间的总长度,⼀般初始化后不变。
⽽线性表的当前长度是线性表中元素的个数,其⼤⼩是会改变的。
2、顺序表的C++代码实现:模板类的代码1 #include<iostream>2using namespace std;34const int MaxSize = 100;5 template <class DataType>6class SeqList7 {8public:9 SeqList(){length=0;}10 SeqList(DataType a[],int n);11 ~SeqList(){}12int Length(){return length;}13 DataType Get(int i);14int Locate(DataType x);15void Insert(int i,DataType x);16 DataType Delete(int i);17void PrintList();18private:19 DataType data[MaxSize]; //顺序表使⽤数组实现20int length; //存储顺序表的长度21 };2223 template <class DataType>24 SeqList<DataType>::SeqList(DataType a[],int n)25 {26if(n>MaxSize) throw"wrong parameter";27for(int i=0;i<n;i++)28 data[i]=a[i];29 length=n;30 }3132 template <class DataType>33 DataType SeqList<DataType>::Get(int i)34 {35if(i<1 && i>length) throw"wrong Location";36else return data[i-1];37 }3839 template <class DataType>40int SeqList<DataType>::Locate(DataType x)41 {42for(int i=0;i<length;i++)43if(data[i]==x) return i+1;44return0;45 }4647 template <class DataType>48void SeqList<DataType>::Insert(int i,DataType x)//插⼊过程中应注意元素移动的⽅向必须从最后⼀个元素开始移动,如果表满了发⽣上溢出,如果插⼊位置不合理,则引发位置异常。
(数据结构课件)线性表(顺序存储)
• 10、函数名:DeleteList
时间复杂度分析:
(1) 当pos==0时 :查找值等于item的第一个元素(假定 该元素的数组下标为i),则需比较i+1次;然后从数组下 标i+1到n-1的元素依次前移共n-i-1次;总操作次数为n,故 算法的时间复杂度为O(n)。
(2) 当删除指定位置元素时:不需要查找过程,只需考虑 前移次数。 最好情况:删除表尾元素 O(1) 最坏情况:删除表头元素 O(n) 平均情况:前移(n-1)/2次 O(n)
11、函数名:SortList
形参:顺序表L 返回值:无 功能:对表中n个元素进行排序。 说明:
1)采用插入排序方法; 2)该算法的时间复杂度为O(n2)。
• 插入排序方法的思想:
分为有序表和无序表。 • 初始:有序表为空,无序表有n个元素 • 每次操作:从无序表中取第一个元素插入到有序表中,则
无序表中减少一个元素,有序表中增加一个。 • 最后:无序表为空,有序表中有n个元素。
常用的头文件包含语句:
• #include <iostream.h> //包含cout,cin,cerr函数的说明 • #include <stdlib.h> //包含exit,rand等函数的说明 • #include <iomanip.h> //包含setw等函数的说明 • #include <string.h> //包含所有字符串函数的说明,如
(2) 当pos==-1时 :插入到表尾。 (3) 当1≤pos≤n+1时 :插入到pos位置处。 步骤: 1)判断pos值是否有效; 2)对三种情况分别求出要插入的位置; 3)判断表是否已满,若满则分配空间; 4)从表尾到插入位置,元素依次后移一个位置; 5)插入item; 6)表长+1。
数据结构课件之线性表(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
线性表之顺序表
线性表之顺序表线性表之顺序表顺序表定义线性表的顺序存储⼜称顺序表。
它是⽤⼀组地址连续的存储单元依次存储线性表当中的数据元素。
从⽽使得逻辑上相邻的两个元素在物理位置上也相邻。
第1个元素存储在线性表的起始位置,第i个元素的存储位置后⾯紧接的存储的也就是第i+1个元素。
因此,顺序表的特点是表中元素的逻辑顺序与其物理顺序相同其顺序存储结构如下数组下表顺序表内存地址0a1LOC(A)1a2LOC(A)+sizeof(ElemType)2a3LOC(A)+2*sizeof(ElemType)3a4LOC(A)+3*sizeof(ElemType)...┊┊MaxSize-1┊LOC(A)+(MaxSize-1)*sizeof(ElemType)假设线性表L存储的起始位置是LOC(A),sizeof(ElemType)是每个数据元素所占存储空间的⼤⼩,ElemType表⽰的是数据的类型,如果存的是整形,就是int。
(注意线性表中的位序是从1开始的,数组中元素的下表是0)顺序表类型描述如下#define MaxSize 50type struct{ElemType data[MaxSize];int length = 0;}SqList;当然⼀位数组可以是静态分配的,也可以选择⽤动态分配#define MaxSize 50type struct{ElemType *data;int length = 0;}SqList;C语⾔初始动态分配如下L.data = (ElemType*)malooc(sizeof(ElemType)*MaxSize)顺序表上的基本操作如下,上代码插⼊操作bool ListInsert(SqList; &L, int i, ElemType e){//本函数实现在第i个位置插⼊元素eif(i < 1 || i > L.length + 1) //判断i是否越界return false;if(L.length >= MaxSize) //存储空间已满,不能插⼊return false;for(int j = L.length; j >= i; j--) // 将第i个元素及后⾯的元素往后移,为元素e腾地⽅L.data[j] = L.data[j-1];L.data[i-1] = e;L.length++;return true;}删除操作bool ListDelete(SqList; &L, int i, ElemType &e){//本函数实现删除第i个元素,并将被删除的元素⽤引⽤变量e返回if(i < 1 || i > L.length) //判断i是否越界return falsee = L.data[i-1];for(int j = i; j < L.length; j++)L.data[j-1] = L.data[j];L.length--;return true;}查找操作int LocateElem(SqList; &L, ElemType e){//本函数实现查找元素e在表中的位序,查找失败返回0for(int i = 0; i < L.length; i++)if(L.data[i] == e)return i+1;return e;}总代码#include<stdio.h>#define MaxSize 100typedef struct{int data[MaxSize];int length = 0;}SqList;bool ListInsert(SqList &L, int i, int e){//本函数实现在第i个位置插⼊元素eif(i < 1 || i > L.length + 1) //判断i是否越界return false;if(L.length >= MaxSize) //存储空间已满,不能插⼊return false;for(int j = L.length; j >= i; j--) // 将第i个元素及后⾯的元素往后移,为元素e腾地⽅ L.data[j] = L.data[j-1];L.data[i-1] = e;L.length++;return true;};bool ListDelete(SqList &L, int i, int &e){//本函数实现删除第i个元素,并将被删除的元素⽤引⽤变量e返回if(i < 1 || i > L.length) //判断i是否越界return false;e = L.data[i-1];for(int j = i; j < L.length; j++)L.data[j-1] = L.data[j];L.length--;return true;}int LocateElem(SqList &L, int e){//本函数实现查找元素e在表中的位序,查找失败返回0for(int i = 0; i < L.length; i++)if(L.data[i] == e)return i+1;return 0;}int main(){int a;SqList L;ListInsert(L, 1, 10);ListInsert(L, 2, 20);ListInsert(L, 3, 15);ListInsert(L, 4, 18);printf("15在顺序表的位序是: %d\n", LocateElem(L, 15));ListDelete(L, 3, a);printf("删除了顺序表第3个元素, 值为: %d\n", a);if(LocateElem(L, 15) == 0)printf("顺序表中不存在15这个值\n");elseprintf("15在顺序表的位序是: %d\n", LocateElem(L, 15));return 0;}输出:15在顺序表的位序是: 3删除了顺序表第3个元素, 值为: 15顺序表中不存在15这个值后⾯会慢慢讲解链表。
线性表(顺序表)
提示: 1 各算法用函数实现,在主函数中调用这些函数; 2 先从最简单的例子开始
2 插入运算
学号 01 02 03 … 30
成绩 78 90 84 … 83
学号 01 02 03 04 … 31
成绩 78 90 87 84 … 83
下标 插入前 0 1 …
插入x
移动后 a1 a2 … ai-1 ai … an-1 an
插入后 a1 a2 … ai-1 x ai … an-1 an last
最常见的数据组织方式:表格形式的数据
编号 名称 SO2含量 水质指标 悬浮物指标
宗地号
周长
面积
使用者
土地等级
点号
等级
X
Y
H
学号
姓名
性别
籍贯
年龄
成绩
2.1 线性表的基本概念和运算
2.1.1 逻辑结构定义 定义:线性表是由n(n≥0)个数据元素 1,a2,……, 数据元素a 定义:线性 数据元素 an构成的有限序列 有限序列。n为表的长度,n=0时称为空表。 有限序列 非空的线性表(n>0)记作( a1,a2,……,an )。 数据元素可以有不同的含义,但同一线性表中 的元素必须具有相同的特性。
线性表
程序 = 数据结构+算法 线性结构:线性表,栈,队列 数据结构 非线性结构:树,图 数据结构的研究内容: 数据结构的研究内容: • 逻辑结构:数据元素间的客观联系 • 存储结构:数据在计算机内部的存储方法 • 算法研究
在各种程序设计与软件开发中都要涉及到对数 据的组织、存储、管理和处理
在环境领域:不同环境监测点的监测指标统计 在土地领域:不同宗地的属性 在测绘领域:外业测绘信息的存储,各测点三维坐 标的存储
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号 01 02 03 …
成绩 78 90 84 …
精选ppt
11
插入 insertElem(&L,index,e):在index位置插入值 为e的元素 insertElem(list, 3, 87)
学号 01 02 03 … 30
成绩 78 90 84 … 83
学号 01 02
03 04 … 31
清空表 clearList(&L) 求长度 listLength(L) 取结点 getElem(L, index,&e) 定位 locateElem(L,x) 插入 insertElem(&L,index,e) 删除deleteElem(&L,index,&e) 取直接前趋 priorElem(L, cur_e,&prior_e ) 取直接后继 nextElem(L, cur_e,&next_e )
线性表
1
精选ppt
程序 = 数据结构+算法
线性结构:线性表,栈,队列 数据结构
非线性结构:树,图
数据结构的研究内容:
• 逻辑结构:数据元素间的客观联系
• 存储结构:数据在计算机内部的存储方法
• 算法研究
精选ppt
2
在各种程序设计与软件开发中都要涉及到对数 据的组织、存储、管理和处理
在环境领域:不同环境监测点的监测指标统计 在土地领域:不同宗地的属性 在测绘领域:外业测绘信息的存储,各测点三维坐
13
• 取直接前趋 priorElem(L, cur_e,&prior_e) • 取直接后继 nextElem(L, cur_e,&next_e)
学号 01 02 03
04 … 30
成绩 78 90 87
84 … 83
精选ppt
PRIOR(L, 87)
NEXT(L, 87)
14
对线性表的所有复杂操作都可以由以上操作完成
typedef struct
{ datatype data[maxsize]; int length;
定义线性表结构
} sequencelist;
相当于:
数据域:存放结点
精选ppt
7
2.1.2 线性表的ADT表示
ADT List{
数数2,据据…对关…象系n}::LR=={{a〈i | aaii-∈1,元ai素〉集| a合i-1,,ia=i∈1,元2素,集…合n,,ni≥=01}, 基本操作:{
构造空表initList(&L) 销毁线性表destroyList(&L)
else j++;
}
i++;
}
}
精选ppt
16
THE NEXT IS
线性表的存储结构及相应算法的实现
• 顺序存储:顺序表 数组
• 链接存储:链表
指针
精选ppt
17
2.2 线性表的顺序存储结构
2.2.1 顺序表 用一组连续的存储单元依次存储线性表的元素
Loc(ai+1)=Loc(ai) + c Loc(ai)=Loc(a1) + (i-1)*c 1≤i≤n c为线性表每个元素占用的存储单元
}
}
精选ppt
8
2.1.3 线性表的运算 清空表 clearList(&L)
clearList(list);
学号 成绩
精选ppt
9
• 取结点 getElem(L, index,&e) getElem (list,2,&e )
序号 01 02 03 …
成绩 78 90 84 …
精选ppt
10
•定位 locateElem(L,x) locateElem (list, 84) == 3
随机存取结构
精选ppt
18
存储地址
元素序号
b a1 1
b+c a2 2
b+2c a3 3
…
b+(i-1)*c ai i …
b+(n-1)*c an n
b+n*c
备用区
精选ppt
19
用C语言中的向量(一维数组)描述顺序表 typedef int datatype; /*int可以用其它类型代替*/ #define maxsize 1024 /*不加分号,1024可改变*/
数据元素可以有不同的含义,但同一线性表中 的元素必须具有相同的特性。
精选ppt
6
学号 01 02 …
30
姓名 杨晨 李铁 … 祁宏
性别 男 男 … 男
籍贯 北京 辽宁 … 上海
年龄 20 19 … 20
成绩 87 91 … 95
➢在非空的线性表,有且仅有一个开始结点a1,它没 有直接前趋,而仅有一个直接后继a2(或没有后继); ➢有且仅有一个终端结点an,它没有直接后继,而仅 有一个直接前趋a n-1 (或没有前趋) ; ➢其余的内部结点ai(2≦i≦n-1)都有且仅有一个直接 前趋a i-1和一个直接后继a i+1。
可以在循环外把listLength(L)
while(i<listLength(list))的值保存起来在后面使用吗?
{
getElem(list, i,&x);
j=i+1;
while(j<=lisamp;y);
if(x==y) deleteElem(list,j);
标的存储
精选ppt
3
最常见的数据组织方式:表格形式的数据
编号 名称 SO2含量 水质指标 悬浮物指标
宗地号 周长 面积 使用者 土地等级
精选ppt
4
点号 等级
X
Y
H
学号 姓名 性别 籍贯 年龄 成绩
精选ppt
5
2.1 线性表的基本概念和运算
2.1.1 逻辑结构定义
定义:线性表是由n(n≥0)个数据元素a1,a2,……, an构成的有限序列。n为表的长度,n=0时称为空表。 非空的线性表(n>0)记作( a1,a2,……,an )。
成绩 78 90
87 84 … 83
精选ppt
12
• 删除deleteElem(&L,index) deleteElem (list,3)
学号 01 02 03
04 … 30
成绩 78 90 87
84 … 83
学号 成绩 01 78 02 90
04 84 …… 30 83
精选ppt
学号 成绩 01 78 02 90 03 84 …… 29 83
e.g 清除线性表L中多余的重复结点 • 从i=1开始,每次取第i个元素getElem (L,i,&e) • 对第i个元素后的所有元素进行比较,若值相同则 删除
• 判断完后将i++,继续执行,直到i=listLengh(L)
精选ppt
15
Purge(Linear_List list)
{
int i =1, j, x, y;