2_线性表
2-2线性表的逻辑结构(《数据结构——从概念到C实现(第2版)》王红梅 清华大学出版社)

数 据 结 构 ( 从 概 念 到 实 现 ) 清 华 大 学 出 版 社
Page 5
线性表的抽象数据类型定义
InitList 输入:无 功能:表的初始化,建一个空表 输出: 无
DestroyList 输入:无 功能:销毁表,释放表所占用的存储空间 输出:无
Length 输入:无 功能:求表的长度 输出:表中数据元素的个数
a 是 b 的前驱,b 是 a 的后继
Page 4
线性表的抽象数据类型定义
ADT List DataModel
线性表中的数据元素具有相同类型,相邻元素具有前驱和后继关系 Operation
InitList:表的初始化,建一个空表 DestroyList:销毁表,释放表所占用的存储空间 Length:求表的长度 Get:在表中取序号为 i 的数据元素 Locate:在线性表中查找值等于 x 的元素 Insert:在表的第 i 个位置处插入一个新元素 x Delete:删除表中的第 i 个元素 Empty:判断表是否为空 endADT
第二章 v 线性表
2-2 线性表的逻辑结构
讲什么?
线性表的定义 线性表的逻辑特征 线性表的抽象数据类型定义
数 据 结 构 ( 从 概 念 到 实 现 ) 清 华 大 学 出 版 社
Page 2
线性表的定义
线性表(表):n(n≥0)个具有相同类型的数据元素的有限序列
ai(1≤i≤n)称为数据元素
数 据 结
构
(
(a1 , a2 , … , ai , … , an)
从 概 念 到
实
现
)
下角标 i 表示该元素在线性表中的位置或序号
清 华
大
学
数据结构课件第2章线性表

27
线性表的顺序存储结构适用于数据 元素不经常变动或只需在顺序存取设备 上做成批处理的场合。为了克服线性表 顺序存储结构的缺点,可采用线性表的 链式存储结构。
28
2.3 线性表的链式存储结构
线性表的链式存储表示 基本操作在单链表上的实现 循环链表 双向链表 线性表链式存储结构小结
2.3.1 线性表的链式存储表示 29
2.1.1 线性表的定义
6
一个线性表(linear_list)是 n(n≥0)个具有相同属性的数 据元素的有限序列,其中各元素有着依次相邻的逻辑关系。
线性表中数据元素的个数 n 称为线性表的长度。当 n = 0 时 该线性表称为空表。当 n > 0 时该线性表可以记为:
(a1,a2,a3,…,ai,…,an)
数据域 指针域
结点 data next
31
(2) 线性表的单链表存储结构
通过每个结点的指针域将线性表中 n 个结点按其逻辑顺序链 接在一起的结点序列称为链表,即为线性表 ( a1, a2, a3, …, ai, …, an ) 的链式存储结构。如果线性链表中的每个结点只有一个指针域, 则链表又称为线性链表或单链表 (linked list)。
17
(2) 算法编写
#define OK 1
#define ERROR 0
Int InsList ( SeqList *L, int i, ElemType e ) /*在顺序线性表 L 中第 i 个位置插入新的元素 e。*/ /* i 的合法值为 1≤i ≤L->last+2*/ {
int k; if ( i < 1) ||( i > L->last+2)) /*首先判断插入位置是否合法*/ { printf(“插入位置i值不合法”);
数据结构考研复习题--第二章--线性表(带答案)

第2章线性表一选择题1.下述哪一条是顺序存储结构的优点?()【北方交通大学 2001 一、4(2分)】A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示2.下面关于线性表的叙述中,错误的是哪一个?()【北方交通大学 2001 一、14(2分)】A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链接存储,不必占用一片连续的存储单元。
D.线性表采用链接存储,便于插入和删除操作。
3.线性表是具有n个()的有限序列(n>0)。
【清华大学 1998 一、4(2分)】A.表元素 B.字符 C.数据元素 D.数据项 E.信息项4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。
【哈尔滨工业大学 2001 二、1(2分)】A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。
【南开大学 2000 一、3】A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时间。
A. 单链表B.单循环链表C. 带尾指针的单循环链表D.带头结点的双循环链表【合肥工业大学 2000 一、1(2分)】7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。
则采用()存储方式最节省运算时间。
【北京理工大学 2000 一、1(2分)】A.单链表 B.双链表 C.单循环链表 D.带头结点的双循环链表8. 静态链表中指针表示的是(). 【北京理工大学 2001 六、2(2分)】A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址9. 链表不具有的特点是()【福州大学 1998 一、8 (2分)】A.插入、删除不需要移动元素 B.可随机访问任一元素C.不必事先估计存储空间 D.所需空间与线性长度成正比10. 下面的叙述不正确的是()【南京理工大学 1996 一、10(2分)】A.线性表在链式存储时,查找第i个元素的时间同i的值成正比B. 线性表在链式存储时,查找第i个元素的时间同i的值无关C. 线性表在顺序存储时,查找第i个元素的时间同i 的值成正比D. 线性表在顺序存储时,查找第i个元素的时间同i的值无关11. 线性表的表元存储方式有((1))和链接两种。
数据结构(C++版)课后答案_(王红梅)第2章_线性表

⑹ 在由尾指针 rear 指示的单循环链表中,在表尾插入一个结点 s 的操作序列是( );删除开始结点的操作序列为( )。 【解答】s->next =rear->next; rear->next =s; rear =s; q=rear->next->next; rear->next->next=q->next; delete q; 【分析】操作示意图如图 2-9 所示:
⑺ 一个具有 n 个结点的单链表,在指针 p 所指结点后插入一个新结点的时间复杂度为( );在给定值为 x 的结点后 插入一个新结点的时间复杂度为( )。 【解答】Ο(1),Ο(n)
⑻ 可由一个尾指针唯一确定的链表有( )、( )、( )。 【解答】的顺序存储结构是一种( )的存储结构,线性表的链接存储结构是一种( )的存储结构。
⑻ 在具有 n 个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( )。 A O(1) B O(n) C O(n2) D O(nlog2n) 【解答】B
⑼ 对于 n 个元素组成的线性表,建立一个有序单链表的时间复杂度是( )。 A O(1) B O(n) C O(n2) D O(nlog2n) 【解答】C 【分析】该算法需要将 n 个元素依次插入到有序单链表中,而插入每个元素需 O(n)。
第2章 线性表

【例2】巳知有两个按元素值递增有序的顺序表La和 Lb,设计一个算法将表La和表Lb的全部元素归并 为一个按元素值递增有序的顺序表Lc。
算法思路:用i扫描顺序表La,用j扫描顺序表Lb。 当表La和表Lb都未扫描完时,比较两者的当前元 素,将较小者插入表Lc的表尾,若两者的当前元 素相等,则将这两个元素依次插入表Lc的表尾。 最后,将尚为扫描完的顺序表的余下部分元素依 次插入表Lc的表尾。算法如下: void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)
表中ai-1领先于ai,称ai-1是ai的直接前驱,ai+1是 ai的直接后继。
线性表的抽象数据类型定义 (参见教材)
返回本章目录
2.2 线性表的顺序存储结构
线性表的顺序存储是指在内存中用地址连续的一块存储空间 依次存放线性表的数据元素,用这种存储形式存储的线性表 称其为顺序表。 假设每个数据元素占d个存储单元,且将ai的存储地址表示为 Loc(ai),则有如下关系: Loc(ai)=Loc(a1)+(i-1)*d Loc(a1)是线性表的第一个数据元素a1的存储地址,通常 称作线性表的基地址。
【例1】 编写一算法,从顺序表中删除自第i个元素开 始的k个元素。 算法思路: 为保持顺序表的逻辑特性,需将i+k ~ n位 置的所有元素依次前移k个位置。算法如下:
int deleteK(Sqlist &sq,int i,int k)
{ if (i<1||k<1||i+k-1>sq.len) return 0; for (j=i+k-1;j<=sq.len-1;j++) sq.data[j-k]=sq.data[j]; sq.len-=k; return 1; }// deleteK
第2章 线性表

数。
第2章 线性表
2.2 线性表的顺序存储结构表示
图2-2所示为线性表在存储介质中顺序分配的情况。
第2章 线性表
逻辑地址 1 2 记录内容 a1 a2 存储地址 LOC(a ) 1 LOC(a )+k 1 内存状况 a1 a2
…
i
…
ai LOC(a )+(i-1)× k 1
…
ai
…
n
图2-2 线性表的顺序分配
第2章 线性表
2.3 线性表元素的操作
2.3.1 线性表元素插入操作 插入一个记录,对有序线性表结构的影响可以从以下 两个方面分析。
(1) 若插入记录关键字的值比表中所有的数据元素的
关键字值都大,那么只需在表后添加一个新记录元素,同 时使表的当前长度修正为n+1即可。
(2) 若插入记录的位置出现在线性表的中间,则情况
LOC(ai)=LOC(a1)+(i-1)×k
从以上的地址计算公式可知,只要已知线性表第 一个数据元素在内存中的存储地址,又知道每一个数 据元素所占存储单元的个数,就能计算出第i个数据元 素在内存中的位置。
第2章 线性表 例如,线性表中第一个数据元素在内存中的地址 LOC(a1)为1000,每一个数据元素占用2个存储单位,
名称“数据结构”的属性就不相同,它们分别为字符
型和数值型。
第2章 线性表 2.1.2 线性表的逻辑结构表示 在任何问题中,数据元素之间可以存在多种关系。 从数据结构的观点来看,重要的是数据元素之间的逻辑 关系。所谓逻辑关系,是指数据元素之间的关联方式或 称“邻接关系”。表2-1中数据的逻辑结构如图2-1(b)所 示,其中的圆圈称为结点。一个结点代表一个数据元素 (有时也把结点和数据元素当作同义词),结点之间的连 线代表逻辑关系,即相应数据元素之间的邻接关系。图 2-1(b)中的逻辑结构反映了表2-1中表格作为一个数据的 组织形式,这种组织形式就是数据元素(记录)“一个接 一个地排列”。
第二章线性表

65
865
姓名
学号
成绩
班级 机97性表
※线性表及运算 ※线性表的存储结构
2.1线性表及运算
线性表是n个元素的有限序列,它们之间的关 系可以排成一个线性序列:
a1,a2,…… ,ai,…… ,an
其中n称作表的长度,当n=0时,称作空表。
线性表的特点:
1.线性表中所有元素的性质相同。 2.除第一个和最后一个数据元素之外,其它数据元 素有且仅有一个前驱和一个后继。第一个数据元 素无前驱,最后一个数据元素无后继。
Status ListInsert_L(LinkList &L,int i, ElemType x){ p=L; j=0; while( p&&j<i-1)
P P
a a
b b
{p=p->next; ++j;}
if( ! p j>i-1) return ERROR;
s=(struct LNode *)malloc(sizeof(struct LNode)); s->data=x; s->next=p->next; p->next=s;
3.数据元素在表中的位置只取决于它自身的序号。
在线性表上常用的运算有:
初始化、求长度、取元素、定位、插 入及删除等。
2.2 线性表的存储结构
1.顺序存储结构
2.链式存储结构
2.1. 线性表的顺序存储结构 ,可用C语言中的一维数组来描述. #define LISTINITSIZE 100 //线性表存储空间的初始分配量
s=(struct LNode *)malloc(sizeof(struct LNode)); s->data=x; s->next=p->next; p->next=s;
第2章 线性表

MaxSize-1
说明:SqListClass<T>的模板类的一个对象L称为顺序 表对象L,也简称为顺序表L,其中主要有data、length数据 成员和相关的运算函数,通过L.data或L.length对数据成员进 行操作,后面的顺序栈、顺序队、顺序串等都采用相似的方 式。
(6)插入数据元素ListInsert(i,e) 该运算在线性表中逻辑序号为i的位臵上插入一个新元素 e。如图2.4所示是插入元素的示意图,由此看出,在一个线 性表中,可以在两端及中间任何位臵上插入一个新元素。
ቤተ መጻሕፍቲ ባይዱ
template <typename T> bool SqListClass<T>::ListInsert(int i, T e) //插入数据元素 { int j; if (i<1 || i>length+1) return false; //参数错误时返回false for (j=length;j>=i;j--) //将data[i-1]及后面元素后移一个位臵 data[j]=data[j-1]; data[i-1]=e; //插入元素e length++; //顺序表长度增1 return true; //成功插入返回true }
(5)按元素值查找LocateElem(e) 该运算顺序查找第一个值与e相等的元素的逻辑序号。若 顺序表中不存在这样的元素,则返回值为0。对应的算法如下:
template <typename T> int SqListClass<T>::LocateElem(T e) //按元素值查找其序号 { int i=0; while (i < length && data[i]!=e) i++; //查找元素e if (i>=length) return 0; //未找到时返回0 else return i+1; //找到后返回其逻辑序号 }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
class LinkList
{ private: Node<T> *Head; public: LinkList() ;//构造函数,创建空链表
~LinkList();//析构函数,删除表空间
27
LinkList的定义
void CreateList(int n); //创建具有n个元素的线性链表
void Insert(int i,T e);
3.1 生成一个值为e的新结点s
Node<T> *s; s=new Node<T>;s->data=e; 3.2 将s插入到结点p之后
s->next=p->next; p->next=s;
30
算法:单链表删除元素
在链表中的实现: 有序对<ai-1, ai> 和 <ai, ai+1> 改变为 <ai-1, ai+1>
ai
…
an
l
Loc(ai)
Loc(ai)=Loc(a1) + (i -1)×l
随机存取:在O(1)时间内存取数据元素
10
连续内存申请
顺序表
方式一:静态申请 int A[10];
一维数组
方式二:动态申请 int *A; …… { …… A= new int[10]; …… }
11
顺序表类SqList的定义(C++描述)
template <class T> //模板类 class SqList { private: T *elem; // 顺序表基址 int length; // 表长 int listsize; // 表容量 public: SqList(int m) ; //构造函数,创建容量为m的空表 ~SqList(); //析构函数,删除表空间
在顺序表中删除某个位置元素的时间主要耗费在移动元素 上,而移动元素的个数取决于删除位置。 假设qi是删除第i个元素的概率,则在长度为n的线性表中 删除一个元素所需移动元素次数的期望值(平均次数)为:
Edl qi ( n i )
i 1
n
不失一般性,假定在线性的任何位置上删除元素的概率 是一样的,因为共有n个可能删除的位置,即: qi=1/n,因 此, 1n n 1
在顺序表中某个位置插入元素的时间主要耗费在移动元素 上,而移动元素的个数取决于插入位置。 假设pi是在第i个元素之前插入一个元素的概率,则在长 度为n的线性表中插入一个元素所需移动元素次数的期望值 (平均次数)为:
Eis pi (n i 1)
i 1
n 1
不失一般性,假定在线性的任何位置上插入元素的概率是 一样的,因为共有n+1个可能插入的位置,pi=1/(n+1),因此,
Edl ( n i ) n i 1 2
22
2.3 线性表的链式存储及其实现
线性表的链式存储
LinkList类的定义
链表操作举例
23
线性表的链式存储
线性表的链式存储是指用一组任意的存储单 元存放线性表的元素,这组存储单元可以是连续的 也可以是不连续的。 L a1 a2 a3 … an ^
顺序表类的定义
顺序表操作举例
8
线性表的顺序存储
用一组地址连续的存储单元依次存放线性表中 的数据元素。
例:(34, 23, 67, 43)
34
23
67
43
一般地:
a1 a2
…
ai-1 ai
…
an
线性表的起始地址,称作线性表的基地址
9
元素位置
0 … i-2 i-1 … n-1
a1
Loc(a1)
…
ai-1
初始化 插入元素a1
Head
^
S
Head P
step 3:将最后一个元素an至第i个元素ai,共n-i+1个元素, 依次后移一个元素位置
for ( j=length;j>=i;j--) elem[j]=elem[j-1];
step 4:将元素值e填入位置i处
elem[i-1]=e;
step 5:表长增1
++L.length;
18
顺序表插入分析
…
ai-1 ai ai+1 …
an
a1 a2
…
ai-1 ai+1
表的长度减少
… an
20
顺序表删除元素操作步骤
Step 1:如果表空,抛出“下溢”异常
if ( length==0 ) throw "下溢";
Step 2:如果删除位置i不合理,抛出“位置”异常
if(i<1||i>length) throw "删除位置异常";
T Delete(int i); T GetElem(int i);
//在表中第i个位置插入元素
//删除表中第i个元素 //按位查找,获取第i个元素的值
int Locate(T e);
T prior(T e); int Empty();
//在链表中查找值为e的元素
//返回元素e的前驱 //测表空
int Length();
4
线性表的特征
n个数据元素的有限序列
a1
a2
a3
a4
…
an
线性结构的基本特征为: 1.集合中必存在唯一的一个“第一元素”; 2.集合中必存在唯一的一个“最后元素”; 3.除最后元素在外,均有唯一的后继; 4.除第一元素之外,均有唯一的前驱。
5
线性表举例
数据元素的具体含义在不同情况下各不相同。
字母表
Step 3:取出被删除元素
e=elem[i-1];
Step 4:第i+1个元素a i+1至最后一个元素an,共n-i个元素, 依次前移一个元素位置
for ( j=i;j<length;j++) elem[j-1]=elem[j];
Step 5:表长减1
length--;
21
顺序表删除元素算法分析
链式存储结构中,逻辑上相邻的两个数据元素 其存储的物理位置不一定相邻,通过指针来映射数 据元素之间的逻辑关系,由此,这种存储结构为非 顺序映像或链式映象。
24
线性表的链式存储有关概念
结点:
Data 数据域
next 指针域
指针域:存储后继或前驱逻辑关系的部分
线性链表 :具有链式存储结构的线性表
单链表 :在线性链表结点中只包含一个指
12
SqList的定义
void Insert(int i,T e); T Delete(int i); T GetElem(int i); int Locate(T e); T Prier(T e); T Next(T e); void Clear(); int Empty(); int Full(); int Length(); void ListDispy(); //在第i个位置插入元素 //删除表中第i个元素 //获取第i个元素的值 //元素定位 //返回元素e的前驱 //返回元素e的后继 //清空表 //测表空 //测表满 //测表长 //输出表元素
void CLear(); void ListDisplay(/遍历输出表元素
28
算法:单链表插入元素
在单链表中的实现: 有序对 <ai-1, ai> 改变为 <ai-1, e> 和<e, ai>
ai-1 e
ai
29
单链表插入元素操作步骤
Step 1:设置工作指针p,指向头结点;计数器j,初值为0 Step 2:通过顺移工作指针定位到结点ai-1 Step 3: 若定位不成功,说明插入位置不合理,抛出“位置” 异常; 否则,
a1 a2 … a1 a2 … ai-1
ai-1 e
ai ai
…
an an
…
表的长度增加
17
顺序表插入操作步骤
step 1:如果表满,无法插入
if ( length>=listsize ) throw "上溢";
step 2:如果插入位置i不合理,无法插入
if ( i<1 || i>length+1 ) throw “插入位置异常";
(A,B,C,D,...,Z)
学生情况表
姓名 王好好 李平平 赵深深 钱多多
...
学号 07210101 07210102 07210103 07210104
...
性别 男 男 女 男
年龄 20 19 18 19
健康状况 良好 一般 良好 较差
6
线性表的抽象数据类型定义
ADT List Data: D={ ai | ai ∈ElementSet, i=1, 2, …, n, n≥0} Relation: R={ <ai-1, ai >| ai-1, ai∈D, i=2, …, n, } Operation: InitList (&L) DestroyList (&L) Length (L) GetElem (L,i )
13
};
顺序表初始化
顺序表的初始化工作是从无到有创建一个空顺序表, 因此在构造函数中完成。
操作步骤:
Step 1:申请一组连续的内存空间,作为表存储空间。 elem = new T[m]; Step 2:若申请成功,表属性初始化,长度为0,容量 为已申请存储空间容量。 if(!elem) throw “内存分配失败” ; length = 0; // 长度为0 listsize = m; // 容量为已申请存储空间容量