数据结构-chapter2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6
} ADT List
2.2 线性表的顺序表示和实现
一、顺序表的表示 采用顺序存储结构存储的线性表
顺序存储定义:把逻辑上相邻的元素存储在物理 位置上相邻的存储单元中。
简言之:逻辑相邻,物理也相邻
顺序存储方法:用一组地址连续的存储单元依次 存放线性表的数据元素。
7
2.2 线性表的顺序表示和实现
已知:L=(a1,a2,… ai-1,ai,ai+1,…an) b b+1 b+2 b+(i-1) a1 a2 … ai-1 ai ai+1 … an 占k个存储单元
an由由n个元素构成的有限序列记为n为线性表的长度当n0时l为空表n为线性表的长度当n0时l为空表ai的直接前驱ai的直接后继同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系n是有限大同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系是有限大同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系n是有限大21线性表的类型定义5例例1
21
答:头指针是指向链表中第一 个结点的指针,因此关键是要 寻找第一个结点的地址。
H 31
ZHAO 7
称:头指针H的值是31
2.3 线性表的链式表示和实现
例2:现有一个有五个元素的线性表L={23,17,47,05, 31},若它以链式结构存储在下列100~119号地址空间 中,每个结点由数据(占2个字节)和指针(占2个字 节)组成,如下图所示。 问:其中指针X,Y,Z的值分别为多少?该线性表的首结点 起始地址为多少?末结点的起始地址为多少?
• 移动元素的个数取决于插入或删除元素的位置 若在尾结点之后插入,需要后移0次 若在首结点之前插入,需要后移n次 插入位置共有n+1种可能 移动次数的合计=0+1+2+…+n =n(n+1)/2 … 平均移动次数= n(n+1)/2 ÷ (n+1)=n/2
17
2.2 小节
1、线性表的定义 L=(a1,a2,…,an)
b+(i-1)*k
b+(maxlen-1) Loc(a1)表示线性表第1个元素a1的存储位置, 存储单元的个数 若每个元素占用 k个存储单元 Loc(ai+1 ) = Loc(ai ) +k Loc(ai ) = loc(a1 ) +(i-1)*k
8
2.2 线性表的顺序表示和实现
线性表顺序存储结构的特点
9
2.2 线性表的顺序表示和实现
线性表的动态分配顺序存储结构
先为顺序表空间设定一个初始分配量,一旦因插入元素而空 间不足时,可为顺序表增加一个固定长度的空间增量。 存储结构描述如下(见教材P22): #define LIST_INIT_SIZE 100 //存储空间的初始分配量 #define LISTINCREMENT 10//存储空间的分配增量 Typedef struct{ ElemType *elem; //表基址(用指针*elem表示) int length; //表长度(表中有多少个元素) int listsize; //当前分配的表尺寸(字节单位) }SqList;
注意:i的取值范围1≤i≤n+1
12
2.2 线性表的顺序表示和实现
③ 实现算法(教材P24)
Status ListInsert_Sq(SqList &L, int i, ElemType e){ if( i < 1 || i > L.length+1) return ERROR; // 检验i 值的合法性
sizeof(x)的意思是: 计算变量x的长度(字节数) malloc (m)函数的意思是:新开一片 大小为m字节的连续空间,并把该 区首址作为函数值。
11
2.2 线性表的顺序表示和实现
二、线性表的顺序存储实现 插入、删除、查找 1、插入 ai-1和ai的逻辑关系发生变化
① 含义:在线性表的第i个元素之前插入一个新的 数据元素 ② 实现步骤 • 将第n到第i个元素依次向后移动一个位置 共(n-i+1)个元素 • 将要插入的元素保存到第i个位置上 • 将表长n加1
realloc (*p, newsize)函数的意思是:新开一片大小为newsize的连 续空间,并把以*p为首址的原空间数据都拷贝进去。
13
2.2 线性表的顺序表示和实现
q = &(L.elem[i-1] ); // q为插入位置 for ( p = & L.elem[L.length-1] ; p>=q ; --p ) *(p+1) = *p ; //插入位置及之后的元素统统后移, p为元素位置 *q= e ; //插入e ++L.length ; //增加1个数据元素,则表长+1 return OK ; } //ListInsert_Sq
100
答:X=
104
Y=
108
112
Z= 末址=
116
, 。
119
首址=
22
2.3 线性表的链式表示和实现
单链表的抽象数据类型描述如下(参见教材P28):
Typedef struct Lnode { ElemType data; //数据域 struct Lnode *next; //指针域 }Lnode, *LinkList; // *LinkList为Lnode类型的指针
1、逻辑上相邻的物理元素,其物理位置上也相邻 2、若已知线性表中第1个元素的存储位置,则线性表中任意 一个元素的位置都可由公式计算得出。 即,线性表的顺序存储结构是一种随机存取的存储结构。 例:一个一维数组M,下标范围是0到9,每个数组元素用 相邻的5个字节存储。存储器按字节编址,设存储数组元素 M[0]的第一个字节的地址是98,则M[3]的第一个字节的地 址是 113 。
一、线性表的定义 由n个元素构成的有限序列,记为
① 同一线性表中的元素必定具有相同特性,即属 同一数据对象,且相邻元素具有序偶关系 ② n是有限大
4
2.1 线性表的类型定义
例1:26个英文字母组成的英文表 (A,B,C,D,…Z) 例2:学生情况登记表
学号 02052101 02052102 02052103 02052104 … 姓名 于春梅 林苹 康强 黄一爽 … 性别 女 女 男 女 …
5
年龄 20 20 21 20 …
班级 计021 计021 计021 计021 …
2.1 线性表的类型定义
二、线性表的抽象数据类型表示(教材P19) ADT List { 数据对象: D={a | a ∈ElemSet, i=1,2,…,n,n≥0} i i 数据关系: R={< ai –1, ai > | ai –1, ai ∈D, i=2,…,n}
长度就固定了,m求一次即可*/
14
2.2 线性表的顺序表示和实现
2、删除 ai-1、ai、ai+1的逻辑关系发生变化
① 含义:删除线性表的第i个位置上的元素 ② 实现步骤 • 将第i+1到第n个元素依次向前移动一个位置 • 将表长n减1
共(n-i)个元素
注意:i的取值范围1≤i≤n
15
2.2 线性表的顺序表示和实现
③ 实现算法
Status ListDelete_Sq(SqList &L, int i, ElemType &e) { //在顺序表L中删除第 i 个元素,用 e 返回其值 if (i < 1 || i > L.length) return ERROR; // i 值不合法,返回 p=&L.elem[i-1]; e=*p; // p 是被删除元素的位置 //被删除元素的值赋给 e
例1:一个线性表的逻辑结构为: (ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用 单链表表示如下,请问其头指针的值是多少?
存储地址 1 7 13 19 25 31 37 43 数据域 LI QIAN SUN WANG WU ZHAO ZHENG ZHOU 指针域 43 13 1 NULL 37 7 19 25
其中,n是线性表的长度。当n=0时,L是一个空表
2、线性表顺序存储结构的特点: 逻辑相邻,物理相邻
可以随机存取表中的任何一个元素 3、优点: 在插入、删除时,需要移动大量元素 4、缺点:
18
2.3 线性表的链式表示和实现
L=(A, B, C, D) A C D B
逻辑相邻,
ai除表示本身信息 之外,还要表示其 直接后继的地址
10
2.2 线性表的顺序表示和实现
动态创建一个空顺序表的算法: (见教材P23)
Status InitList_Sq( SqList &L ) //创建一个空线性表 { L.elem=(ElemType*)malloc(LIST_INIT_SIZE ×sizeof(ElemType)); If(!L.elem) exit(OVERFLOW); //分配失败,结束程序 L.length=0; //暂无元素放入,空表 L.listsize=LIST_INIT_SIZE; //表尺寸=初始分配量 Return OK; } //InitList_Sq
q=L.elem+L.length-1; // q 是表尾的位置 for(++p; p<=q; p++) *(p-1) = *p; //待删元素后面的依次前移 --L.length; //表长 - 1 return OK; } //ListDelete_Sq
16
2.2 线性表的顺序表示和实现
三、顺序表的时间复杂度分析
基本操作: InitList( &L ); DestoryList( &L ); int LengthList( L ); PriorElem( L, cur_e, &pre_e ); NextElem( L, cur_e, &next_e ); ListInsertBefore(&L, i, e ); ListDelete( &L, i,&e ); //建空表,初始化 //撤销表,释放内存 //求表中元素个数,即表长 //求当前元素cur_e的前驱 //求当前元素cur_e的后继 //在第i个元素之前插入新的元素e //删除第i个元素并返回此元素
a1
a2
… ai-1
ai
… an ^
头指针是指向链表中第一个结点(或为头结点、或为首元结点)的指针; 头结点是在链表的首元结点之前附设的一个结点;数据域内只放表长等信息, 它不计入表长度。其作用是统一空表、和非空链表的形式。 首元结点是指链表中存储线性表第一个数据元素a1的结点。
20
^
2.3 线性表的链式表示和实现
设p为指向链表的第i个元素的指针,则第i个元素的 数据域写为 p->data ,指针域写为 p->nex.3 线性表的链式表示和实现
(1)单链表的建立和输出 例:用单链表结构来存放26个英文字母组成的线性 表(a,b,c,…,z),请写出C语言程序。
难点分析:每个数据元素在内存中是“零散”存放的,其 首地址怎么找?又怎么一一链接? 实现思路:先开辟头指针,然后陆续为每个结点开辟存储空 间并及时赋值,后继结点的地址要提前送给前面的指针。
A B C D
顺序存储结构
链式存储结构 物理不一定相邻
用一组任意的存储单元存储线性表的元素
19
2.3 线性表的链式表示和实现
结点:数据元素的存储映象。 数据域 指针域
数据元素 直接后继位置
链表:n个结点链接成起来形成一个链表,即为线性表的
链式存储结构。
单链表:结点中只包含一个指针域。
L L
头结点
指针域为空
2
第2章 线性表
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示和相加
3
2.1 线性表的类型定义
L=(a1,a2,… ai-1,ai,ai+1,… an)
n为线性表的 ai的直接前驱 ai的直接后继 长度,当n=0 时L为空表
数据结构
2017年5月5日星期五
线性结构
线性结构的定义:
若结构是非空有限集,则有且仅有一个开始结点和一个终端结 点,并且所有结点都最多只有一个直接前驱和一个直接后继。
线性结构的表达式(a1,a2,a3,…an) 线性结构的特点: 结点间的逻辑关系是一对一的
① 有且仅有一个首结点和尾结点 ② 除首尾结点以外,其它结点有且仅有一个前驱结点 和一个后继结点 线性结构包括:线性表、栈、队列、数组和广义表
24
2.3 线性表的链式表示和实现
将全局变量及函数提前说明:
#include<stdio.h> #include<stdlib.h> typedef struct node{ char data; struct node *next; }node; node *p,*q,*head; //一般需要3个指针变量 int n ; // 数据元素的个数 int m=sizeof(node); /* 结构类型定义好之后,每个变量的
} ADT List
2.2 线性表的顺序表示和实现
一、顺序表的表示 采用顺序存储结构存储的线性表
顺序存储定义:把逻辑上相邻的元素存储在物理 位置上相邻的存储单元中。
简言之:逻辑相邻,物理也相邻
顺序存储方法:用一组地址连续的存储单元依次 存放线性表的数据元素。
7
2.2 线性表的顺序表示和实现
已知:L=(a1,a2,… ai-1,ai,ai+1,…an) b b+1 b+2 b+(i-1) a1 a2 … ai-1 ai ai+1 … an 占k个存储单元
an由由n个元素构成的有限序列记为n为线性表的长度当n0时l为空表n为线性表的长度当n0时l为空表ai的直接前驱ai的直接后继同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系n是有限大同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系是有限大同一线性表中的元素必定具有相同特性即属同一数据对象且相邻元素具有序偶关系n是有限大21线性表的类型定义5例例1
21
答:头指针是指向链表中第一 个结点的指针,因此关键是要 寻找第一个结点的地址。
H 31
ZHAO 7
称:头指针H的值是31
2.3 线性表的链式表示和实现
例2:现有一个有五个元素的线性表L={23,17,47,05, 31},若它以链式结构存储在下列100~119号地址空间 中,每个结点由数据(占2个字节)和指针(占2个字 节)组成,如下图所示。 问:其中指针X,Y,Z的值分别为多少?该线性表的首结点 起始地址为多少?末结点的起始地址为多少?
• 移动元素的个数取决于插入或删除元素的位置 若在尾结点之后插入,需要后移0次 若在首结点之前插入,需要后移n次 插入位置共有n+1种可能 移动次数的合计=0+1+2+…+n =n(n+1)/2 … 平均移动次数= n(n+1)/2 ÷ (n+1)=n/2
17
2.2 小节
1、线性表的定义 L=(a1,a2,…,an)
b+(i-1)*k
b+(maxlen-1) Loc(a1)表示线性表第1个元素a1的存储位置, 存储单元的个数 若每个元素占用 k个存储单元 Loc(ai+1 ) = Loc(ai ) +k Loc(ai ) = loc(a1 ) +(i-1)*k
8
2.2 线性表的顺序表示和实现
线性表顺序存储结构的特点
9
2.2 线性表的顺序表示和实现
线性表的动态分配顺序存储结构
先为顺序表空间设定一个初始分配量,一旦因插入元素而空 间不足时,可为顺序表增加一个固定长度的空间增量。 存储结构描述如下(见教材P22): #define LIST_INIT_SIZE 100 //存储空间的初始分配量 #define LISTINCREMENT 10//存储空间的分配增量 Typedef struct{ ElemType *elem; //表基址(用指针*elem表示) int length; //表长度(表中有多少个元素) int listsize; //当前分配的表尺寸(字节单位) }SqList;
注意:i的取值范围1≤i≤n+1
12
2.2 线性表的顺序表示和实现
③ 实现算法(教材P24)
Status ListInsert_Sq(SqList &L, int i, ElemType e){ if( i < 1 || i > L.length+1) return ERROR; // 检验i 值的合法性
sizeof(x)的意思是: 计算变量x的长度(字节数) malloc (m)函数的意思是:新开一片 大小为m字节的连续空间,并把该 区首址作为函数值。
11
2.2 线性表的顺序表示和实现
二、线性表的顺序存储实现 插入、删除、查找 1、插入 ai-1和ai的逻辑关系发生变化
① 含义:在线性表的第i个元素之前插入一个新的 数据元素 ② 实现步骤 • 将第n到第i个元素依次向后移动一个位置 共(n-i+1)个元素 • 将要插入的元素保存到第i个位置上 • 将表长n加1
realloc (*p, newsize)函数的意思是:新开一片大小为newsize的连 续空间,并把以*p为首址的原空间数据都拷贝进去。
13
2.2 线性表的顺序表示和实现
q = &(L.elem[i-1] ); // q为插入位置 for ( p = & L.elem[L.length-1] ; p>=q ; --p ) *(p+1) = *p ; //插入位置及之后的元素统统后移, p为元素位置 *q= e ; //插入e ++L.length ; //增加1个数据元素,则表长+1 return OK ; } //ListInsert_Sq
100
答:X=
104
Y=
108
112
Z= 末址=
116
, 。
119
首址=
22
2.3 线性表的链式表示和实现
单链表的抽象数据类型描述如下(参见教材P28):
Typedef struct Lnode { ElemType data; //数据域 struct Lnode *next; //指针域 }Lnode, *LinkList; // *LinkList为Lnode类型的指针
1、逻辑上相邻的物理元素,其物理位置上也相邻 2、若已知线性表中第1个元素的存储位置,则线性表中任意 一个元素的位置都可由公式计算得出。 即,线性表的顺序存储结构是一种随机存取的存储结构。 例:一个一维数组M,下标范围是0到9,每个数组元素用 相邻的5个字节存储。存储器按字节编址,设存储数组元素 M[0]的第一个字节的地址是98,则M[3]的第一个字节的地 址是 113 。
一、线性表的定义 由n个元素构成的有限序列,记为
① 同一线性表中的元素必定具有相同特性,即属 同一数据对象,且相邻元素具有序偶关系 ② n是有限大
4
2.1 线性表的类型定义
例1:26个英文字母组成的英文表 (A,B,C,D,…Z) 例2:学生情况登记表
学号 02052101 02052102 02052103 02052104 … 姓名 于春梅 林苹 康强 黄一爽 … 性别 女 女 男 女 …
5
年龄 20 20 21 20 …
班级 计021 计021 计021 计021 …
2.1 线性表的类型定义
二、线性表的抽象数据类型表示(教材P19) ADT List { 数据对象: D={a | a ∈ElemSet, i=1,2,…,n,n≥0} i i 数据关系: R={< ai –1, ai > | ai –1, ai ∈D, i=2,…,n}
长度就固定了,m求一次即可*/
14
2.2 线性表的顺序表示和实现
2、删除 ai-1、ai、ai+1的逻辑关系发生变化
① 含义:删除线性表的第i个位置上的元素 ② 实现步骤 • 将第i+1到第n个元素依次向前移动一个位置 • 将表长n减1
共(n-i)个元素
注意:i的取值范围1≤i≤n
15
2.2 线性表的顺序表示和实现
③ 实现算法
Status ListDelete_Sq(SqList &L, int i, ElemType &e) { //在顺序表L中删除第 i 个元素,用 e 返回其值 if (i < 1 || i > L.length) return ERROR; // i 值不合法,返回 p=&L.elem[i-1]; e=*p; // p 是被删除元素的位置 //被删除元素的值赋给 e
例1:一个线性表的逻辑结构为: (ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用 单链表表示如下,请问其头指针的值是多少?
存储地址 1 7 13 19 25 31 37 43 数据域 LI QIAN SUN WANG WU ZHAO ZHENG ZHOU 指针域 43 13 1 NULL 37 7 19 25
其中,n是线性表的长度。当n=0时,L是一个空表
2、线性表顺序存储结构的特点: 逻辑相邻,物理相邻
可以随机存取表中的任何一个元素 3、优点: 在插入、删除时,需要移动大量元素 4、缺点:
18
2.3 线性表的链式表示和实现
L=(A, B, C, D) A C D B
逻辑相邻,
ai除表示本身信息 之外,还要表示其 直接后继的地址
10
2.2 线性表的顺序表示和实现
动态创建一个空顺序表的算法: (见教材P23)
Status InitList_Sq( SqList &L ) //创建一个空线性表 { L.elem=(ElemType*)malloc(LIST_INIT_SIZE ×sizeof(ElemType)); If(!L.elem) exit(OVERFLOW); //分配失败,结束程序 L.length=0; //暂无元素放入,空表 L.listsize=LIST_INIT_SIZE; //表尺寸=初始分配量 Return OK; } //InitList_Sq
q=L.elem+L.length-1; // q 是表尾的位置 for(++p; p<=q; p++) *(p-1) = *p; //待删元素后面的依次前移 --L.length; //表长 - 1 return OK; } //ListDelete_Sq
16
2.2 线性表的顺序表示和实现
三、顺序表的时间复杂度分析
基本操作: InitList( &L ); DestoryList( &L ); int LengthList( L ); PriorElem( L, cur_e, &pre_e ); NextElem( L, cur_e, &next_e ); ListInsertBefore(&L, i, e ); ListDelete( &L, i,&e ); //建空表,初始化 //撤销表,释放内存 //求表中元素个数,即表长 //求当前元素cur_e的前驱 //求当前元素cur_e的后继 //在第i个元素之前插入新的元素e //删除第i个元素并返回此元素
a1
a2
… ai-1
ai
… an ^
头指针是指向链表中第一个结点(或为头结点、或为首元结点)的指针; 头结点是在链表的首元结点之前附设的一个结点;数据域内只放表长等信息, 它不计入表长度。其作用是统一空表、和非空链表的形式。 首元结点是指链表中存储线性表第一个数据元素a1的结点。
20
^
2.3 线性表的链式表示和实现
设p为指向链表的第i个元素的指针,则第i个元素的 数据域写为 p->data ,指针域写为 p->nex.3 线性表的链式表示和实现
(1)单链表的建立和输出 例:用单链表结构来存放26个英文字母组成的线性 表(a,b,c,…,z),请写出C语言程序。
难点分析:每个数据元素在内存中是“零散”存放的,其 首地址怎么找?又怎么一一链接? 实现思路:先开辟头指针,然后陆续为每个结点开辟存储空 间并及时赋值,后继结点的地址要提前送给前面的指针。
A B C D
顺序存储结构
链式存储结构 物理不一定相邻
用一组任意的存储单元存储线性表的元素
19
2.3 线性表的链式表示和实现
结点:数据元素的存储映象。 数据域 指针域
数据元素 直接后继位置
链表:n个结点链接成起来形成一个链表,即为线性表的
链式存储结构。
单链表:结点中只包含一个指针域。
L L
头结点
指针域为空
2
第2章 线性表
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示和相加
3
2.1 线性表的类型定义
L=(a1,a2,… ai-1,ai,ai+1,… an)
n为线性表的 ai的直接前驱 ai的直接后继 长度,当n=0 时L为空表
数据结构
2017年5月5日星期五
线性结构
线性结构的定义:
若结构是非空有限集,则有且仅有一个开始结点和一个终端结 点,并且所有结点都最多只有一个直接前驱和一个直接后继。
线性结构的表达式(a1,a2,a3,…an) 线性结构的特点: 结点间的逻辑关系是一对一的
① 有且仅有一个首结点和尾结点 ② 除首尾结点以外,其它结点有且仅有一个前驱结点 和一个后继结点 线性结构包括:线性表、栈、队列、数组和广义表
24
2.3 线性表的链式表示和实现
将全局变量及函数提前说明:
#include<stdio.h> #include<stdlib.h> typedef struct node{ char data; struct node *next; }node; node *p,*q,*head; //一般需要3个指针变量 int n ; // 数据元素的个数 int m=sizeof(node); /* 结构类型定义好之后,每个变量的