第9章-线性表详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第9章 线性表
9.1.2 线性表的运算
(1) 置空表SETNULL(L):该运算是将线性表L置为空表。
(2) 求 长 度 LENGTH(L) : 求 线 性 表 的 长 度 。 因 此 , LENGTH(L)可看成是一个函数,函数值为线性表L的长度。
(3) 取结点GET(L, i):此函数仅当1≤i≤LENGTH(L)时有 意义,其函数值为数据元素ai(或ai的位置)。
第9章 线性表
线性表的顺序存储结构
特点
逻辑关系上相邻的两个元素在物理位置上也相邻
可以随机存取表中任意元素;其存储位置可用一 个简单直观的公式来表示
第9章 线性表
线性表的顺序存储结构
缺点
在进行插入或删除运算时,需移动大量元素;
在给长度变化较大的线性表预先分配空间时,必须 按最大空间分配,使存储空间不能得到充分利用; 表的容量难以扩充
/* 从顺序表中
{ int j;
if ((i<1)||(i>L->last+1))
{ printf (″error″);return 0;} /* 非法位置 */
else
{ for(j=i; j<=L->last; j++)
/* 第i个结点下标值是i1 */
L-> data[j1]=L-> data[j];
012345678…
17
85
9
6 10
i
第9章 线性表 int INSERT(sequenlist L, int x, int i) /* 将新结点x插入顺序 表L的第i个位置上, L是sequenlist类型的指针变量 */
{ int j;
if ((L-> last)>=maxsize1)
{ printf (″overflow″); return 0;} /* 表空间溢出 */
(8) 取直接后继NEXT(L, ai):已知ai是线性表L中的一个 数据元素,且1≤i≤n1,则存在直接后继。
还有更复杂的运算,如将两个或两个以上的线性表合并; 将一个线性表拆分;重新复制一个线性表;对线性表中的数 据元素按某个数据项递增(或递减)的顺序进行重新排列等, 这些运算均可利用上述基本运算来实现。
typedef float REAL;
第9章 线性表
9.2 线性表的顺序存储结构
顺序表是用向量实现的线性表,是一种随机存储结构。 其特点是以元素在计算机内物理位置上的紧邻来表示线性 表中数据元素之间相邻的逻辑关系。
第9章 线性表
9.2.2 顺序表的基本运算
1.插入运算 在线性表的第i (0≤i≤n)个位置上,插入一个新结点x,
第9章 线性表
9.2 线性表的顺序存储结构
顺序表
在计算机内,可以用不同的方式来表示线性表,其中最简 单和最常用的方式是用一组地址连续的存储单元依次存储线性 表的元素。
第9章 线性表
9.2 线性表的顺序存储结构
设首元素地址为b, 序号
每个元素需占用c
1
个存储单元,
2
3

i
… n
内存状态
a1 a2 a3
由于C语言中的向量(一维数组)也是采用顺序存储表示, 故可以用向量这种数据类型来描述顺序表:
第9章 线性表
typedef int datatype;/* datatype可为任何类型,假设为int */
#define maxsize 1024
数据域data是存放
typedef struct
线性表结点的向量
图9.5 单链表的一般图示法
第9章 线性表
9.3.1 单链表
单链表是由头指针确定的,单链表可以用头指针的名字来 命名。例如,若头指针名是head,则把链表称为表head。
typedef int dataype; typedef struct node
{datatype data; struct node *next;
(6) 删除DELETE(L, I ):删除线性表L的第i个结点, 使得原编号为i+1, i+2, …, n的结点变成编号为i, i+1, …, n1的结点。这里1≤i≤n,而n是原表L的长度。
第9章 线性表
(7) 取直接前趋PRIOR(L, ai):已知ai是线性表L中的一 个数据元素,且2≤i≤n,则存在直接前趋。
(4) 定位LOCATE(L, x):若线性表L中存在一个值为x的 数据元素ai,则函数值为i,即ai在线性表中的位序;若存在 多个值为x的数据元素,则函数值为最小的位序值;反之,若 不存在,则函数值为零。
第9章 线性表
(5) 插入INSERT(L, x, i):在线性表L的第i个位置 插入一个值为x的新的数据元素,使原编号为i, i+1, …, n 的数据元素变为编号为i+1, i+2, …, n+1的数据元素。这里 1≤i≤n+1,而n是原表L的长度。
第9章 线性表
9.3.2 单链表的基本运算
1.建立单链表 假设线性表中结点的数据类型是字符,逐个输入这些
字符型的结点,并以“$”为输入结束标志。动态地建立单链 表的常用方法有如下两种:
1) 头插法建表 该方法从一个空表开始,重复读入数据,生成新结点, 将数据存放到新结点的数据域中,然后将新结点插入到当前 链表的表头上,直至读入结束标志为止。
结点包括两个域: 存储数据元素信息的域称作数据域; 存储后继元素存储位置的域称作指针域
DATA NEXT
第9章 线性表
9.3.1 单链表
单链表中每个结点的存储 地址是存放在其前趋结点 的next域中。而开始结点 无前趋,故应设头指针 head指向开始结点。同时, 终端结点的指针域为空, 即NULL(也可用∧表示)。
{datatype data[maxsize];
空间,
向量的下标从0开始,
int last;
到maxsize1结束,
}sequenlist;
线性表的第i个结点存 放在向量的第i1个
数据域last指示线性表的终端 结点在向量空间中的位置,因 为向量空间的下界是0,故 last+1是当前表的长度
分量中,下标是i1, 并假设表中结点的个 数始终不超过向量空 间的大小maxsize
第9章 线性表
定义已有类型的别名
除可直接使用C提供的标准类型和自定义的类型 (结构、共用、枚举)外,也可使用typedef定义已 有类型的别名。该别名与标准类型名一样,可用来定 义相应的变量。
(1)按定义变量的方法,写出定义体; (2)将变量名换成别名; (3)在定义体最前面加上typedef。
例如: 给实型float定义1个别名REAL。 在定义体最前面加上typedef:
使长度为n的线性表 (a0, …, ai1, ai, …, an-1)
变成长度为n+1的线性表 (a0, …, ai1, x, ai, …, an-1)
第9章 线性表 图9.2 顺序表插入元素的过程
第9章 线性表
动画演示
请输入初始顺序表:1,7,8,9,6,10
请输入要插入的元素X,及序号i:5,3
}linklist; linklist *head,*p
第9章 线性表
9.3.1 单链表
p所指向的结点变量是通过标准函数生成的,即
p=malloc(sizeof(linklist));
函数malloc分配一个类型为node的结点变量的空间,并将 其地址放入指针变量p中。一旦所指的结点变量不再需要了, 又可通过标准函数free(p)释放p所指的结点变量空间。
第9章 线性表
实验一 顺序表及其应用
实验目的: 1.深入了解顺序表的存储结构。 2.熟练掌握在顺序存储结构上进行插入、删除等操作的算法。 3.通过顺序表结构及相关处理来解决一些实际问题。 实验内容:
1.试编写在顺序表上实现插入和删除的算法。
2.假设有两个按数据元素值递增有序排列的顺序表A和B,编写算法 将A表和B表归并成一个按元素值递增有序排列的顺序表C。
变成长度为n1的线性表 (a0, …, ai1, ai+1, …, an-1)
第9章 线性表 图9.3 顺序表删除元素的过程
第9章 线性表
请输入初始顺序表:1,7,8,9,6,10
请输入要删除的序号i:3
012345678…
17
8
9
6 10
i
动画演示
第9章 线性表
int DELETE (sequenlist L, int i) 删除第i个位置上的元素 */
图4是线性表(Zhao, Qian, Sun, Li, Zhou, Wu, Zheng, Wang)的单链表示 意图。
……
……
数据域 指针域 110 Zhou 200
130 Qian 135
135 Sun
170


头指针 160 head 165 165
170
Wang Zhao
Li
本概念及运算 线性表的顺序存储结构 线性表的链式存储结构
第9章 线性表
9.1 线性表的基本概念及运算
9.1.1 线性表的逻辑结构定义
线性表(Linear List)是最常用且最简单的一种数据结 构。简单地讲,一个线性表是n个数据元素的有限序列(a1, a2, …, an)。
第9章 线性表
9.3.1 单链表
链表是用一组任意的存储单元来存放线性表的元素,这 组存储单元既可以是连续的,也可以是不连续的。
因此,为了正确表示元素间的逻辑关系,在存储每个元 素值的同时,还必须存储指示其后继元素的地址(或位置) 信息。这两部分信息组成数据元素ai 的存储映像。
第9章 线性表
9.3.1 单链表
/* 结点前移 */
L-> last ; }
/* 表长减1 */
return (1);}
/* DELETE */
第9章 线性表
3. 算法分析
假设在i位置插入元素的概率Pi是相等的,Pi=1/(n+1), 而在第i个位置插入元素需移动的元素次数为n-i,则平均移动 次数为:
在顺序表中插入一个元素时平均有一半元素需移动,时 间复杂度为O(n)

ai … an …
存储地址 b
b+c
b+(i-1)*c b+(n-1)*c
Loc (ai+1)=Loc (ai)+c 一般来说,线性表的第i个元素ai的存储位置为: Loc (ai)=Loc (a1)+(i1)c 1≤i≤n
第9章 线性表
9.2 线性表的顺序存储结构
线性表的这种机内表示称为线性表的顺序存储结构或顺 序映像。只要确定了起始位置,线性表中任一数据元素都可 随机存取,所以线性表的顺序存储结构是一种随机存取的存 储结构。
第9章 线性表
第9章 线性表
线性表是由n(n≥0)个数据元素构成的有限序列。其中,将 数据元素的个数n定义为表的长度。当n=0时称为空表,通常将 非空的线性表(n>0)。
同一线性表中的元素必定具有相同的特性。 对于非空的线性表,有且仅有一个开始结点和一个终端结点, 有且仅有一个直接后继,有且仅有一个直接前趋。 线性表中结点之间的逻辑关系即是上述的邻接关系,由于该 关系是线性的,因此,线性表是一个线性结构。
else
If ((i<1)||(i>(L-> last)+2))
{ printf(″error″); return NULL;} /* 非法位置 */
else
{ for (j=L-> last; j>=i1;j )
L-> data[j+1]= L-> data[j];
/* 结点后移 */
L-> data[i1]=x;


200 Wu
205
205 Zheng 160


图4 单链表示意图
第9章 线性表
9.3.1 单链表
head
Zhao
Qian
Sun
… Wang
由于单链表只注重结点间的逻辑顺序,并不关 心每个结点的实际存储位置,因此我们通常是 用箭头来表示链域中的指针,于是链表就可以 更直观地画成箭头链接起来的结点序列。
/* 插入x,存在(L).data[i1]中 */
L-> last=L-> last+1; /* 终端结点下标加1 */
}
return(1); }
第9章 线性表
9.2.2 顺序表的基本运算
2. 删除运算 线性表的删除运算是指将表的第i(1≤i≤n)个结点
删去,使长度为n的线性表 (a0, …, ai1, ai, ai+1, …, an-1)
3.一年一班共有学生n名,编程实现对该班学生成绩的管理:
数据项:学号、姓名、语文、数学
功能: 录入、查询、统计
实验要求: 在上机前交预习报告,写出全部源程序。 实验报告格式规范,内容完整。 包括程序流程图,程序清单,实验数据及调试分析,和实验总结
第9章 线性表
9.3 线性表的链式存储结构
为了克服顺序表的缺点,可以采用链接 方式存储线性表,通常我们将链接方式存储 的线性表称为链表(Linked List)。
相关文档
最新文档