当前位置:
文档之家› 第九章-线性表的基本概念及运算
第九章-线性表的基本概念及运算
储 址 内 状 元 序 存 地 存 态 素 号
是用一组地址连续的存储单元 依次存储线性表的元素。 依次存储线性表的元素。 线性表的第i个元素 线性表的第 个元素ai的存储位 个元素 置为 Loc(ai)=Loc(a1)+(i−1)∗c − ∗ 1≤i≤ ≤i≤n ≤i≤ 起始位置或基地址: 起始位置或基地址:Loc(a1) 线性表的这种机内表示称做线性 表的顺序存储结构 顺序映象。 顺序存储结构或 表的顺序存储结构或顺序映象。
软件技术基础
机电工程学院
单 链 表
数据域 指针域 M 200 M 135 170 M NULL 130 110 M 205 160
下图是线性表( 图是线性表( zhao, qian, sun, li, zhou, wu, zheng, wang)的单链表示 ) 意图。 意图。
头指针 head 165
软件技术基础
机电工程学院
删除运算的实现
int DELETE(sequenlist ∗L,int i) {int j; if ((i<1)||(i>L->last)) { print (“error”);return 0;} else if (L->last<0) { print (“empty list”);return 0;} else { for(j=i;j<=L->last; j++) L->data(j−1)=L->data[j]; − L->last−− } −−; −− return (1); }
软件技术基础
机电工程学院
线性表的实例 线性表的实例
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++;} }/* PUREG */
软件技术基础
机电工程学院
线性表的逻辑Βιβλιοθήκη 征 线性表的逻辑特征对于非空的线性表,有且仅有一个开始结点 对于非空的线性表,有且仅有一个开始结点 a1,有且仅有一个终端结点 n。 终端结点a ,有且仅有一个终端结点 有且仅有一个直接后继 当i=1,2,…,n−1时,ai有且仅有一个直接后继 − 时 ai+1;当i=2,3,…,n时,ai有且仅有一个直接 有且仅有一个直接 ; 时 有且仅有一个 前趋a 。 前趋 i−1。 线性表中结点之间的逻辑关系即是上述的 线性表中结点之间的逻辑关系即是上述的 逻辑关系 邻接关系; 邻接关系; 线性表是一个线性结构。 线性表是一个线性结构。 线性结构
软件技术基础
机电工程学院
建立单链表建立单链表-尾插法建表
linklist ∗CREATLISTR() {char ch; linklist ∗head,∗s,∗r; ∗ ∗ head=NULL; r=head; while ((ch= getchar())!=‘$’) {s=(linklist∗)malloc(sizeof(linklist)) ∗ s→data=ch; s→next=NULL; if (r==NULL) head=s; else r→next=s; r=s; } return head; }
插入运算
先移动后插入
移 动 后 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
插 入 前 0 a1 1 a2 M a i− 1 ai a i+ 1 M an
i− 2 插 入 x i
la s t n − 1
la s t
∑ p (n - i +1)
i i =1
线性表中删除一个元素所需移动元素次数的期望 平均次数) 值(平均次数)为 n EDE=
∑ q (n - i)
i i =1
机电工程学院
软件技术基础
插入、删除算法分析 插入、删除算法分析
假设在线性表的任何位置上插入或删除元素的 概率相等,则pi=1/n+1 , qi=1/n , 故 概率相等,
软件技术基础
机电工程学院
线性表的链式存储结构
将链接方式存储的线性表称为链表 链表分类: 链表分类: 分类 实现方式 o 动态链表 o 静态链表 链接方式 o 单链表 o 循环链表 o 双链表
软件技术基础
机电工程学院
单 链 表
链表是用一组任意的存储单元来存放线性表的 元素,这组存储单元既可以是连续的, 元素,这组存储单元既可以是连续的,也可以 是不连续的。 是不连续的。 存储数据元素信息的域称作数据域;存储后继 存储数据元素信息的域称作数据域; 数据域 元素存储位置的域称作指针域 指针域, 元素存储位置的域称作指针域,指针域中存储 的信息称指针 指针或 的信息称指针或链。 链表的每个结点中只包含一个指针域,故将这 链表的每个结点中只包含一个指针域, 种链表称为单链表 单链表。 种链表称为单链表。
/* 将新结点 插入顺序表 将新结点x插入顺序表 L的第 个位置上 */ 的第i个位置上 的第 /* 表空间溢出 */ /* 非法位置 */
/* 结点后移 */ /*插入 ,存在(∗L).data[i−1] 插入x, ∗ − 中终端结点下标加1 中终端结点下标加 */
软件技术基础
机电工程学院
删除运算
1 EIS== n ∑ n +1(n - i +1) 2 i=1
n+1
1 n -1 EDE= ∑ (n - i) = 2 i =1 n
n
软件技术基础
机电工程学院
顺序表的优缺点
顺序表的优点: 顺序表的优点: 逻辑相邻的物理位置相邻 随机存取表中任意元素; 随机存取表中任意元素; 顺序表的缺点: 顺序表的缺点: 在做插入或删除运算时,需移动大量元素; 在做插入或删除运算时,需移动大量元素; 线性表按最大空间预先分配; 线性表按最大空间预先分配; 表的容量难以扩充。 表的容量难以扩充。
机电工程学院
线性表的实例 线性表的实例
UNION(Linear_list ∗LA, Linear_list ∗LB) { int i=1,N=LENGHTU(LA); while (i<LENGTH(LB)) { x=GET(LB,i); K=SEARCH(LA,x); if(K==-1) { INSERT(LA,X,N+1); N=N+1: } i=i+1; } }
删除运算 删除运算
直接移动数据元素
删 除 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
删 除 前 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
机电工程学院
软件技术基础
插入运算的实现
int INSERT(sequenlist ∗L,int x,int i) { int j; if ((L->last)>=maxsize−1) − { print (“overflow”);return 0;} else if ((i<1)||(i>(L->last)+2) { print (“error”);return NULL;} else if (i=1&& L->last<0) {L->data[i−1]=x; − L->last=L->last+1; } else { for (j=L->last; j>=i−1;j−− −−) − −− L->data[j+1]= L->data[j]; L->data[i−1]=x; − L->last=L->last+1; } retum(1);}
p:linklist ∗ p:node
结点存储单元分配 p=malloc(sizeof(linklist)); ;
结点存储单元释放 free(p)
∗ (∗ p).next ∗ L ∧
(∗ p).data ∗
软件技术基础
(∗ p).next ∗
机电工程学院
两种建立单链表方法图示
头插法建表图示
c ④ ③ ① s d ② b a ∧
第九章 线 性 表
本章主要内容
线性表的基本概念 线性表的顺序存储结构及其运算 线性表的链式存储结构及其运算
软件技术基础
机电工程学院
线性表的基本概念
线性表的逻辑结构定义
线性表是由n( ≥ )个数据元素a 线性表是由 (n≥0)个数据元素 1,a2,…,an构 成的有限序列。其中,数据元素的个数n定义 成的有限序列。其中,数据元素的个数 定义 为表的长度。 时称为空表, 为表的长度。当n=0时称为空表,通常将非空 时称为空表 的线性表( :(a 的线性表(n>0)记作:( 1,a2,…,an)。 )记作:( 数据元素a 的具体含义, 数据元素 i的具体含义,在不同的情况下可以 不同。 不同。 同一线性表中的元素必定具有相同的特性。 同一线性表中的元素必定具有相同的特性。
软件技术基础
/* 删除线性表L中重复 删除线性表L 出现的多余结点 */ /*每次循环使当前第 结 每次循环使当前第i结 每次循环使当前第 点是无重复值的结点*/ 点是无重复值的结点 /* 取当前第 个结点 */ 取当前第i个结点 /* 取当前第 个结点 */ 取当前第j个结点 /* 删除当前第 个结点 */ 删除当前第j个结点