2线性表1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EIS = ∑ p i (n - i + 1)
i =1
•
任何位置上插入元素的概率相等,则
pi = 1
n
故
1 n (n - i + 1) = EIS = ∑ 2 i =1 n + 1
23
n +1
删除运算 删除运算
逻辑关系 原来线性表
ai+1的直接前驱
(a1,a2,…, ai-1,ai, ai+1,…, an) 删除后线性表 (a1,a2,…, ai-1,ai+1,…, an)
n-1 n maxsize-1
20
顺序表的基本运算
1. 插入运算
插 入 前 0 a1 1 a2 M a i− 1 ai a i+ 1 M an
先移动后插入
移 动 后 a1 a2 M a i− 1 ai M a n−1 an 插 入 后 a1 a2 M a i− 1 x ai M a n−1 an
i− 2 插 入 x i
其他?
利用线性表的基本运算实现清除L中多余的重复 利用线性表的基本运算实现清除 中多余的重复 节点 ???
13
中多余的重复节点。 例:利用线性表的基本运算实现清除L中多余的重复节点。 利用线性表的基本运算实现清除 中多余的重复节点
PURGE(Linear_list *L) { int i=1,j,x,y; while (i<LENGTH(L)) { x=GET(L,i); j=i+1; while (j<=LENGTH(L)) { y=GET(L,j); if (x==y) DELETE(L,j); else j++; } i++; } }
ai+1的直接前驱
24
删除运算 删除运算
存储结构
0 … i-2 i-1 i i+1 L->last n-1 maxsize-1
a1
…
ai-1
ai
ai+1 ai+2 … an … …
L->last
a1
0
…
…
ai-1 ai+1 ai+2 …
i-2 i-1 i
wk.baidu.com
an … …
n-1 n maxsize-1
25
8
线性表的举例
ai的直接后继
(a1,a2,…, ai-1,ai, ai+1,…, an)
开始结点
ai的直接前驱
终端结点
9
线性表的举例
[实例 实例1] 实例
C的直接后继
(A, B, C, D,…, Z)
开始结点
C的直接前驱
终端结点
10
线性表的举例
[实例 实例2] 实例
学号 02042001 02042002 02042003 02042004
数据删除 (2) )
按姓名查询 (3) )
打印
31
数据结构
线性表应用实例
# define M 100 / * 顺序表的最大长度*/ typedef struct {int number; char name[20]; char sex; char addr[20]; } node; typedef struct { node stu[M]; int last; } sequenlist; sequenlist *L;
34
小结
ai的直接前驱
(a1,a2,…, ai-1,x,ai, ai+1,…, an)
19
插入运算 插入运算
存储结构
0 … i-2
x
i-1 i
L->last n-1 maxsize-1
a1
…
ai-1
ai
ai+1 … an … … …
L->last
a1
0
…
…
ai-1
i-2
x
i-1
ai
i
… an-1 an …
33
数据输出
线性表应用实例
void output(sequenlist *L) { int i; printf(”Number Name Sex Address\n” ); for (i=0; i<=L->last;i++) { printf(”%6d”, L->stu[i].number ); printf(”%S”, L->stu[i].name ); printf(”%c”, L->stu[i].sex ); printf(”%s\n”, L->stu[i].address ); } }
线性表的顺序存储结构
/* datatype可为任何 类型,这里假设为int */ #define maxsize 1024 / * 线性表可能的最 大长度,这里假设为1024 */ typedef struct { datatype data[maxsize]; int last; } sequenlist; sequenlist *L; typedef int datatype;
注
当n=0时称为空表
数据元素ai的具体含义,在不同的情况下 可以不同。
同一线性表中的元素必定具有相同 的特性。
7
线性表的逻辑特征
对于非空的线性表,有且仅有一个开始结点 a1,有且仅有一个终端结点an。 当i=1,2,…,n−1时,ai有且仅有一个直接后继 ai+1;当i=2,3,…,n时,ai有且仅有一个直接前 趋ai-1。 线性表中结点之间的逻辑关系即是邻接关 系; 线性表是一个线性结构。
26
删除运算的实现
int DELETE (sequenlist ∗L, int i) /* 从顺序表中删除第i个 位置上的元素 */ { int j; if ((i<1)||(i>L->ast+1)) { printf (″error″); return 0; } /* 非法位置 */ else { for (j=i; j<=L->last; j++) /* 第i个结点下标值是i−1 */ L-> data(j−1)=L-> data[j]; /* 结点前移 */ L-> last− −; /* 表长减1 */ } return (1); }
学生成绩登记表。
姓名 张益搏 李建峰 刘沁峰 性别 男 男 男 成绩
…
…
…
…
数据元素
表中的每一个学生记录
5
线性表的基本概念
线性表的逻辑结构定义 表的长度
线性表是由n( ≥ ) 线性表是由 (n≥0)个数据元素 a1,a2,…,an构成的 有限序列 。
记作:(a1,a2,…,an) (n>0)
6
线性表的基本概念
Loc(ai)=Loc(a1)+(i−1)∗c − ∗
15
顺序表
线性表的这种机内表示称做线性表的顺序 存储结构或顺序映象。
线性表的顺序存储结构是一种随机存取的存储结构。 线性表的顺序存储结构是一种随机存取的存储结构。 随机存取的存储结构
顺序表:线性表的顺序存储结构,即用向量 顺序表 实现的线性表
16
EDE = ∑ p i (n - i)
i =1
•
任何位置上插入元素的概率相等,则
pi = 1
n
故
EDE
1 n -1 (n - i) = =∑ 2 i =1 n + 1
28
n +1
线性表的优缺点
顺序表的优缺点: 优点:可以随机存取表中任意元素;其存储 位置可用一个简单直观的公式来表示。 缺点: 1. 在进行插入或删除运算时,需移动大量元 素; 2. 在给长度变化较大的线性表预先分配空间 时,必须按最大空间分配,使存储空间不 能得到充分利用; 3. 表的容量难以扩充。
la s t n − 1
la s t
21
插入运算的实现
/* 将新结点x插入顺序表L的 第i 个位置上, L是sequenlist类型的指针变量 */
int INSERT(sequenlist ∗L, int x, int i) { int j; if ((L-> last)>=maxsize−1) { printf (″overflow″); return 0; } /* 表空间溢出 */ else If ((i<1)||(i>(L-> last)+2)) { printf(″error″); return 0; } /* 非法位置 */ else { for (j=L-> last; j>=i−1;j− −) L-> data[j+1]= L-> data[j]; /* 结点后移 */ L-> data[i−1]=x; /* 插入x,存在(∗L).data[i−1]中 */ L-> last=L->last+1; /* 终端结点下标加1 */ } 22 return(1); }
算法分析
• 从上面算法可看出,顺序表的插入运算,其时间主要耗费在移动元素上, 而移动元素的个数不仅依赖于表长n,而且还与插入的位置i有关。 在第i个位置上插入一个元素的移动元素的次数为 假设
• • •
n − i +1
pi 是在第i个位置上插入一个元素的概率,
则在长度为n的线性表中插入一个元素时所需移动元素次数的期望值(平均 次数)为 n +1
29
线性表应用实例
问题描述
现有若干学生的学籍档案信息,要求 现有若干学生的学籍档案信息 要求 编写一个应用软件实现对其进 行日常管理,以实现学生档案信 行日常管理 以实现学生档案信 息的插入和删除,并能够根据学 息的插入和删除 并能够根据学 号查询。 号查询。
30
线性表应用实例
程序结构
主函数
数据插入 (1) )
32
数据打印
线性表应用实例
int locate(sequenlist *L,char string) { int i,j; for(i=0;i<=L->last;i++) if (strcmp(L->stu[i].name,string)==0) { printf(”\n Number: %6d”, L->stu[i].number ); printf(” n Name: %S”, L->stu[i].name ); printf( ”\n Sex: %c”, L->stu[i].sex ); printf( ”\n Address: %s\n”, L->stu[i].address ); return(1); }; if (i> L->last ) { printf(”Not find! \n”); return(0); } }
14
顺序表
用一组地址连续的存储单元依次存储线性表的元素
储 址 内 状 元 序 存 地 存 态 素 号 b b+c M b+(i−1)∗c − ∗ M b+(n−1)∗c − ∗ b+n∗c ∗ a1 a2 … ai … an 1 2 M i M n 用 备 区
线性表(a1,a2,……,an) 起始位置或基地址:Loc(a1) 每个元素占用:c个空间 线性表的第i (1≤i≤n) 个元 素 ai的存储位置为
17
线性表的顺序存储结构
空表 表满 表长 第i个 元素 赋值 L->last=-1 L->last=maxsize-1 len=L->last+1 L->data[i-1]=1
18
插入运算 插入运算
逻辑关系 原来线性表
ai的直接前驱
(a1,a2,…, ai-1,ai, ai+1,…, an) 插入后线性表
软件技术基础
第2讲 讲
1
上讲主要内容
• 软件 • 数据结构
概念 复杂度
2
线 性 表
本讲主要内容
线性表的基本概念 顺序表
3
线性表的举例
[实例 实例1] 实例
线性表
英文字母表(A, B, C, …, Z)
数据元素
表中的每一个英文字母
4
线性表的举例
[实例 实例2] 实例
线性表
学号 02042001 02042002 02042003
开始结点
姓名 张益搏 李建峰 刘沁峰 刘俊林 性别 男 男 男 男 成绩
003的直接前驱
…
02042062
…
王娣
… 女
003的直接后继
…
终端结点
11
线性表的运算1
置空表SETNULL(L) 求长度LENGTH(L) 取结点GET(L,i) 定位LOCATE(L,x)
12
线性表的运算2
插入INSERT(L,x,i) 删除DELETE(L,i) 取直接前趋PRIOR(L,ai) 取直接后继NEXT(L,ai)
删除运算
2.删除运算
删 除 前 0 a1 1 a2 M i− 2 a i− 1 i− 1 ai i a i+ 1 M a n -1 la s t an
直接移动数据元素
删 除 a1 a2 M a i− 1 a i+ 1 M a n -1 an 删 除 后 (移 动 ) a1 a2 M a i− 1 a i+ 1 a i+ 2 M an la s t
27
算法分析
• 从上面算法可看出,顺序表的删除运算,其时间主要耗费在移动元素上, 而移动元素的个数不仅依赖于表长n,而且还与删除的位置i有关。 在第i个位置上删除一个元素的移动元素的次数为 假设
• • •
n−i
pi 是在第i个位置上删除一个元素的概率,
则在长度为n的线性表中删除一个元素时所需移动元素次数的期望值(平均 次数)为 n +1