线性表

合集下载

线性表 知识点总结

线性表 知识点总结

线性表知识点总结线性表的特点:1. 有序性:线性表中的元素是有序排列的,每个元素都有唯一的前驱和后继。

2. 可变性:线性表的长度是可变的,可以进行插入、删除操作来改变表的元素数量。

3. 线性关系:线性表中的元素之间存在明确的前驱和后继关系。

4. 存储结构:线性表的存储结构有顺序存储和链式存储两种方式。

线性表的操作:1. 查找操作:根据元素的位置或值来查找线性表中的元素。

2. 插入操作:将一个新元素插入到线性表中的指定位置。

3. 删除操作:将线性表中的某个元素删除。

4. 更新操作:将线性表中的某个元素更新为新的值。

线性表的顺序存储结构:顺序存储结构是将线性表的元素按照其逻辑顺序依次存储在一块连续的存储空间中。

线性表的顺序存储结构通常采用数组来实现。

数组中的每个元素都可以通过下标来访问,因此可以快速的进行查找操作。

但是插入和删除操作会导致元素位置的变动,需要进行大量数据搬移,效率较低。

线性表的链式存储结构:链式存储结构是将线性表的元素通过指针相连,形成一个链式结构。

每个元素包含数据和指向下一个元素的指针。

链式存储结构不需要连续的存储空间,可以动态分配内存,适合插入和删除频繁的场景。

但是链式结构的元素访问不如顺序结构高效,需要通过指针来逐个访问元素。

线性表的应用场景:1. 线性表适用于数据元素之间存在明确的前后关系,有序排列的场景。

2. 顺序存储结构适用于元素的插入和删除操作较少,对元素的随机访问较频繁的场景。

3. 链式存储结构适用于插入和删除操作较频繁的场景,对元素的随机访问较少。

线性表的操作的时间复杂度:1. 查找操作:顺序存储结构的时间复杂度为O(1),链式存储结构的时间复杂度为O(n)。

2. 插入和删除操作:顺序存储结构的时间复杂度为O(n),链式存储结构的时间复杂度为O(1)。

线性表的实现:1. 顺序存储结构的实现:使用数组来存储元素,通过下标来访问元素。

2. 链式存储结构的实现:使用链表来实现,每个元素包含数据和指向下一个元素的指针。

线性表的定义

线性表的定义
(1) 初始化:设定一个空的线性表L。
(2) 求长度:线性表L中数据元素的个数len。
(3) 取元素:取线性表L中序号为i的数据元素, 若1≤i≤len,则函数值为线性表L中第i个数据 元素,否则为NULL。
(4) 定位:给定值item,若线性表L中有数据元 素等于item,则返回该数据元素的序号,若 有多个数据元素等于item,则返回最小的序 号,若无数据元素等于item,则返回0。
两个例子都是线性表:
➢ 某班级学生的数据库课程的成绩: (72,65,83, 94,87,98,57)
➢ 某车间职工的编号:(“0108”, “0110”, “0122” ,
"0132", "0718")
在稍复杂的线性表中,一个数据元素可能是由若干 个数据项组成的。
例如在例1-1给出的“人事登记表”中,每一个职工 的信息就是一个数据元素,它是由“编号”、“姓名 ”、“性别”、“出生日期”、“婚否”和“基本工 资”六个数据项组成的。
(7) 是否是空表:线性表L为空,则返回值1,否则 返回值0。
(8) 表清空:将线性表L设置为空表,即len = 0。
对线性表的操作还有很多,像取前驱、取后继、 排序等等。
数据结构
数据结构
线性表的定义
线性表(linear-list)是最常用最简单的一种数据结构。一 个线性表是n (n≥0)个相同类型数据元素的有限序列。 记为:
L= (a1, a2 , … , an ) 其中,L是表名,a1是第一个数据元素(也简称为元 素),无前驱,有一个后继;an是最后一个数据元素 (即第n个数据元素),有一个前驱,无后继。其余的每 个数据元素ai (i=2,3, … ,n-1)都只有一个前驱,且只有一 个后继。i (i=1,2, … ,n)称为表的序号。n是数据元素的 个数,也称为表的长度,若n=0,L称作空表。

线性表

线性表

举例:
La=(34,89,765,12,90,-34,22) 数据元素类型为int。 Ls=(Hello,World, China, Welcome) 数据元素类型为 string。 Lb=(book1,book2,...,book100) 数据元素类型为下列所示的结 构类型: struct bookinfo { int No; //图书编号 char *name; //图书名称 char *auther; //作者名称 ...; };
素的方法被称为随机存取法,使用这种存取方法的存储结构被
称为随机存储结构。
在C语言中,实现线性表的顺序存储结构的类型定义
typedef int ElemType; //定义顺序表中元素的类型 #define INITSIZE 100 //顺序表存储空间初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct { ElemType *data; int length; //存储空间的基地址 //线性表的当前长度
说明:
1. 某数据结构上的基本运算,不是它的全部运算,而是一些 常用的基本的运算,而每一个基本运算在实现时也可能根据不 同的存储结构派生出一系列相关的运算来, 没有必要全部定义 出它的运算集。掌握了某一数据结构上的基本运算后,其它的 运算可以通过基本运算来实现,也可以直接去实现。 2. 在上面各操作中定义的线性表L仅仅是一个抽象在逻辑结 构层次的线性表,尚未涉及到它的存储结构,因此每个操作在 逻辑结构层次上尚不能用具体的某种程序语言写出具体的算法, 而算法的实现只有在存储结构确立之后。
4. 求顺序表的长度 int getlen(sqlist L) { return (L.length); } 5. 判断顺序表是否为空 int listempty(sqlist L) { if (L.length==0) return 1; else return 0; }

【数据结构】线性表的基本操作

【数据结构】线性表的基本操作

【数据结构】线性表的基本操作【数据结构】线性表的基本操作1:定义1.1 线性表的概念1.2 线性表的特点2:基本操作2.1 初始化操作2.1.1 空表的创建2.1.2 非空表的创建2.2 插入操作2.2.1 在指定位置插入元素2.2.2 在表头插入元素2.2.3 在表尾插入元素2.3 删除操作2.3.1 删除指定位置的元素2.3.2 删除表头的元素2.3.3 删除表尾的元素2.4 查找操作2.4.1 按值查找元素2.4.2 按位置查找元素2.5 修改操作2.5.1 修改指定位置的元素 2.5.2 修改指定值的元素3:综合操作3.1 反转线性表3.2 合并两个线性表3.3 排序线性表3.4 删除重复元素3.5 拆分线性表4:线性表的应用场景4.1 数组的应用4.2 链表的应用4.3 栈的应用4.4 队列的应用附件:无法律名词及注释:- 线性表:根据某种规则排列的一组元素的有限序列。

- 初始化操作:创建一个空的线性表,或者创建一个已经包含一定元素的线性表。

- 插入操作:在线性表的指定位置或者表头、表尾插入一个新元素。

- 删除操作:从线性表中删除掉指定位置或者表头、表尾的元素。

- 查找操作:在线性表中按照指定的元素值或者位置查找元素。

- 修改操作:更改线性表中指定位置或者值的元素。

- 反转线性表:将线性表中的元素顺序颠倒。

- 合并线性表:将两个线性表合并成一个新的线性表。

- 排序线性表:按照某种规则对线性表中的元素进行排序。

- 删除重复元素:将线性表中重复的元素删除,只保留一个。

- 拆分线性表:将一个线性表分成多个不重叠的子线性表。

02331自考数据结构 第二章 线性表

02331自考数据结构 第二章 线性表

return ;
}
if ( L -> length >= ListSize ){
printf (" overflow ");
return ;
}
for ( j - L -> length -1; j >= i -1; j --)
L ->data [ j +1]= L -> data [ j ]; //从最后一个元素开始逐一后移
线性表的基本运算
上述运算仅仅是线性表的基本运算,不是其全部运 算。因为对不同问题的线性表,所需要的运算可能不同。 因此,对于实际问题中涉及其他更为复杂的运算,可用 基本运算的组合来实现。
线性表的基本运算
【例2.1】假设有两个线性表 LA 和 LB 分别表示两个 集合 A 和 B ,现要求一个新集合 A = A∪B 。
线性表的逻辑定义
数据元素“一个接一个的排列”的关系叫做 线性关系,线性关系的特点是“一对一”,在计 算机领域用“线性表”来描述这种关系。另外, 在一个线性表中数据元素的类型是相同的,或者 说线性表是由同一类型的数据元素构成的,如学 生情况信息表是一个线性表,表中数据元素的类 型为学生类型;一个字符串也是一个线性表:表 中数据元素的类型为字符型等等。
,
a2
i
,…,
ai-1
,
a.aii++1.1 , .…,
an
)
an
线性表n的-1逻辑结an构和存储结构都发…生了相应的变化, 与插入运算相反,插…入是向后移动元素,而删除运算则
是向前移M动AX元-1 素,除非i=n 时直接删除终端元素,不需移
动元素。
删除前
删除后

线性表

线性表

2.1 线性表的类型定义
例3:下图为10个个学生的成绩表,它也是一个 线性表,该线性表的数据元素类型为结构体类型。
2.1 线性表的类型定义
从以上例子可看出线性表的逻辑特征是: 在非空的线性表中,有且仅有一个被称作 “第一个”的数据元素a1,它没有直接前趋, 而仅有一个直接后继a2; 有且仅有一个被称作“最后一个”的数据元 素an,它没有直接后继,而仅有一个直接前 趋 a n-1; 其余的数据元素ai(2≦i≦n-1)都有且仅有一个 直接前趋a i-1和一个直接后继a i+1。 线性表是一种典型的线性结构。
2.2 线性表的顺序表示和实现
#define MAXNUM 100 Elemtype List1[MAXNUM] ; /*定义线性表L1*/ int length1;
Elemtype List2[MAXNUM] ; /*定义线性表L1*/ int length2;
Elemtype List3[MAXNUM] ; /*定义线性表L1*/ int length3;
2.2 线性表的顺序表示和实现
而只需要将数组和表长封装在一个结构体中,然 后定义三个结构体变量即可: struct L_list { Elemtype List[MAXNUM]; int length; }; struct L_list L1, L2, L3; /*定义三个线性表L1,L2,L3*/
2.1 线性表的类型定义
例1:26个英文字母组成的字母表 (A,B,C、…、Z) 例2:某公司2000年每月产值表(单位:万元) (400,420,500,…,600,650) 是一个长度为12的线性表。

上述两例中的每一个数据元素都是不可分割的, 在一些复杂的线性表中,每一个数据元素又可 以由若干个数据项组成。

数据结构线性表

数据结构线性表

数据结构线性表一、引言数据结构是计算机存储、组织数据的方式,它决定了数据访问的效率和灵活性。

在数据结构中,线性表是一种最基本、最常用的数据结构。

线性表是由零个或多个数据元素组成的有限序列,其中数据元素之间的关系是一对一的关系。

本文将对线性表的概念、分类、基本操作及其应用进行详细阐述。

二、线性表的概念1.数据元素之间具有一对一的关系,即除了第一个和一个数据元素外,其他数据元素都是首尾相连的。

2.线性表具有唯一的第一个元素和一个元素,分别称为表头和表尾。

3.线性表的长度是指表中数据元素的个数,长度为零的线性表称为空表。

三、线性表的分类根据线性表的存储方式,可以将线性表分为顺序存储结构和链式存储结构两大类。

1.顺序存储结构:顺序存储结构是将线性表中的数据元素按照逻辑顺序依次存放在一组地质连续的存储单元中。

顺序存储结构具有随机访问的特点,可以通过下标快速访问表中的任意一个元素。

顺序存储结构的线性表又可以分为静态顺序表和动态顺序表两种。

2.链式存储结构:链式存储结构是通过指针将线性表中的数据元素连接起来,形成一个链表。

链表中的每个节点包含一个数据元素和一个或多个指针,指向下一个或前一个节点。

链式存储结构具有动态性,可以根据需要动态地分配和释放节点空间。

链式存储结构的线性表又可以分为单向链表、双向链表和循环链表等。

四、线性表的基本操作线性表作为一种数据结构,具有一系列基本操作,包括:1.初始化:创建一个空的线性表。

2.插入:在线性表的指定位置插入一个数据元素。

3.删除:删除线性表中指定位置的数据元素。

4.查找:在线性表中查找具有给定关键字的数据元素。

5.更新:更新线性表中指定位置的数据元素。

6.销毁:释放线性表所占用的空间。

7.遍历:遍历线性表中的所有数据元素,进行相应的操作。

8.排序:对线性表中的数据元素进行排序。

9.合并:将两个线性表合并为一个线性表。

五、线性表的应用1.程序语言中的数组:数组是一种典型的顺序存储结构的线性表,常用于存储具有相同类型的数据元素。

线性表_精品文档

线性表_精品文档

线性表什么是线性表?线性表是一种常见的数据结构,它由一系列具有相同数据类型的元素组成。

线性表中的元素之间存在着一对一的线性关系,即每个元素都有唯一的直接前驱和直接后继(除了第一个元素没有直接前驱和最后一个元素没有直接后继)。

线性表可以用来存储一组有序的数据,例如整数、浮点数、字符等等。

它可以通过下标来访问元素,支持插入、删除和查找操作。

线性表的分类线性表可以分为两种基本形式:顺序表和链表。

顺序表顺序表是将线性表的元素按照顺序依次存储在一块连续的存储空间中。

在顺序表中,按照元素插入顺序分为静态顺序表和动态顺序表。

静态顺序表静态顺序表是指事先申请好固定大小的存储空间,用于存储线性表的元素。

静态顺序表的大小在编译时确定,无法动态调整。

当静态顺序表已满时,如果需要插入新的元素,就无法继续插入,需要进行额外的处理。

动态顺序表动态顺序表是指不事先申请固定大小的存储空间,而在需要时进行动态扩容和缩容的顺序表。

动态顺序表的大小可以根据需要动态调整,使得线性表可以动态增长或减少。

链表链表是一种通过指针将线性表的元素链接在一起的数据结构。

链表中的每个元素都包含一个指针,指向下一个元素。

链表的存储空间可以是连续的,也可以是不连续的。

单链表单链表是链表的基本形式。

每个节点包含数据域和指针域,数据域用于存储元素的值,指针域用于指向下一个元素。

链表的头节点没有前驱节点,尾节点没有后继节点。

双链表双链表是在单链表的基础上进行扩展的。

每个节点除了有指向下一个元素的指针,还有指向前一个元素的指针。

双链表可以支持双向遍历和双向操作,但相应地增加了额外的指针域,占用更多的存储空间。

线性表的操作线性表的常用操作包括插入、删除、查找、遍历等。

插入插入操作可以在线性表的指定位置插入一个新的元素。

插入元素时,需要移动后续元素的位置来腾出空间,并调整相应的指针。

插入操作的时间复杂度为O(n)。

删除删除操作可以删除线性表中指定位置的元素。

删除元素时,需要调整前后元素的指针,使得元素之间重新链接。

数据结构线性表ppt课件

数据结构线性表ppt课件

01
02
03
04
插入操作
在链表的指定位置插入一个新 节点,需要修改相邻节点的指
针。
删除操作
删除链表的指定节点,需要修 改相邻节点的指针。
查找操作
从链表的头节点开始,顺序遍 历链表,直到找到目标元素或
遍历到链表末尾。
遍历操作
从链表的头节点开始,顺序访 问每个节点,直到遍历到链表
末尾。
04 线性表应用举例 与问题分析
多项式表示与计算问题
01
02
03
多项式表示方法
数组表示法和链表表示法 。
数组表示法
将多项式的系数按次序存 放在一个数组中,通过下 标表示对应的幂次。
链表表示法
每个节点包含系数和指数 两个数据域,以及一个指 向下一个节点的指针域。
一元多项式相加算法设计
• 算法思想:将两个多项式中的同类项系数相加,得到新的 多项式。
删除操作
删除指定位置i的元素,需要将i之后的元素都向前移动 一个位置。
03 链式存储结构及 其实现
链式存储结构原理及特点
链式存储结构原理
使用一组任意的存储单元存储线 性表的数据元素(这组存储单元 可以是连续的,也可以是不连续 的)。
链式存储结构特点
逻辑上相邻的元素在物理位置上 不一定相邻,元素之间的逻辑关 系是通过指针链接来表示的。
...,an组成的有序序列。
性质
集合中必存在唯一的一个“第一元素 ”。
集合中必存在唯一的一个“最后元素 ”。
除最后元素之外,均有唯一的后继。
除第一元素之外,均有唯一的前驱。
线性表与数组关系
数组是线性表的一种表现和实现形式。
线性表更侧重于逻辑概念,而数组则是这种逻辑概念在计算机中的一种存储方式。

线性表

线性表

线性表的ADT定义为:
ADT List {
数据对象:D={ ai | ai∈ElemSet, i=1,2,…,n, n≥0}
数据关系:R={< ai-1, ai >| ai-1, ai ∈ElemSet,i=1,2,…,n} 基本操作: InitList( & L) //建立(初始化)线性表
DestroyList( &L ) //销毁线形表L
张三
李四 王五 赵六 ……..

女 男 男 …….
18
20 21 17 …….
端州
四会 广州 端州 …….
线性表的逻辑特征是:
①在非空的线性表,有且仅有一个开始元 素a1,它没有直接前趋,而仅有一个直接后继a2 ②有且仅有一个终端元素an,它没有直接后 继,而仅有一个直接前趋an-1; ③其余的内部元素ai(2<=i<=n-1)都有且仅有 一个直接前趋 ai-1 和一个直接后继 ai+1。
算法2.1
例2. 巳知线性表LA和线性表LB中的数据元
素按值非递减有序排列,现要求将LA和LB归并 为一个新的线性表LC,且LC中的元素仍按值非 递减有序排列。 如: LA={ 3,5,8,11 }, LB={2,6,8,9,11,15 ,20}, 则结果 LC={2,3,5,6,8,8,9,11,11,15,20}
#define List_Increment 30 //追加分配长度
在顺序表存储结构中,很容易实现线性表的操作,
如:线性表的构造、第i个元素的访问、求表长等操作。
要访问某个元素也很方便,这是顺序存储的最大优
点——随机访问 注意:在C语言中的数组下标从“0”开始,因此,若L 是Sqlist类型的顺序表,则表中第i个元素是L.data[i-1]。

线性表ppt

线性表ppt
由于C语言函数的参数仅能向被调函数传值,这个值在返 回时也不会改变,因此在上面的算法中,采用指针变量v做形 参,虽然从被调函数返回时指针v值不变,但是v地址中所代表 的结构体的内容发生了变化。这就是所谓的传址调用。
假设在主函数中已经建立了线性表结构体s,并且要在第3 个位置插入88,语句如下:
insert ( &s,3,88);
其他特 VIP专享精彩活动

VIP专属身份标识
开通VIP后可以享受不定期的VIP随时随地彰显尊贵身份。
专属客服
VIP专属客服,第一时间解决你的问题。专属客服Q全部权益:1.海量精选书免费读2.热门好书抢先看3.独家精品资源4.VIP专属身份标识5.全站去广告6.名
以用来说明结构体变量:
Sqlist1 a; 在正式使用a之前必须为数据成员elem分配足够的空间。 语句如下:
a.elem=(Sqlist1 *)malloc(MAXSIZE*sizeof(Sqlist1)); 对结构体内elem子域的访问与前文有所不同。在输入/输出时 的情况,也与前文有所不同。在程序运行结束之前,这些动态 分配的存储空间还要释放归还给系统,语句如下:
(5) Insert(L,i,x) 在线性表中第i个元素之后(或之前)插入一个新元素x;
(6) Delete(L,i) 删除线性表中的第i个元素;
(7) Empty(L)
判断线性表是否为空;
(8) Clear(L)
将已知的线性表清理为空表;
第2章 线 性 表
在上述的操作运算中,最基本最重要的是插入、删除。 线性表的其他复杂操作和运算还有:对有序表的插入和删除; 按某种要求重排线性表中各元素的顺序;按某个特定值查找 线性表中的元素;两个线性表的合并等。

第2章 线性表

第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

线性表的定义

线性表的定义

线性表定义线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。

在稍复杂的线性表中,一个数据元素可由多个数据项(item)组成,此种情况下常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)。

线性表中的个数n定义为线性表的长度,n=0时称为空表。

在非空表中每个数据元素都有一个确定的位置,如用ai表示数据元素,则i称为数据元素ai在线性表中的位序。

线性表的相邻元素之间存在着序偶关系。

如用(a1,…,ai-1,ai,ai+1,…,an)表示一个顺序表,则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。

当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱分类我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。

在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。

一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。

受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

优点线性表的逻辑结构简单,便于实现和操作。

因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

特征1.集合中必存在唯一的一个“第一元素”。

2.集合中必存在唯一的一个“最后元素”。

3.除最后一个元素之外,均有唯一的后继(后件)。

4.除第一个元素之外,均有唯一的前驱(前件)。

基本操作1)MakeEmpty(L) 这是一个将L变为空表的方法2)Length(L)返回表L的长度,即表中元素个数3)Get(L,i)这是一个函数,函数值为L中位置i处的元素(1≤i≤n)4)Prior(L,i)取i的前驱元素5)Next(L,i)取i的后继元素6)Locate(L,x)这是一个函数,函数值为元素x在L中的位置7)Insert(L,i,x)在表L的位置i处插入元素x,将原占据位置i的元素及后面的元素都向后推一个位置8)Delete(L,p)从表L中删除位置p处的元素9)IsEmpty(L) 如果表L为空表(长度为0)则返回true,否则返回false10)Clear(L)清除所有元素11)Init(L)同第一个,初始化线性表为空12)Traverse(L)遍历输出所有元素13)Find(L,x)查找并返回元素14)Update(L,x)修改元素15)Sort(L)对所有元素重新按给定的条件排序16) strstr(string1,string2)用于字符数组的求string1中出现string2的首地址。

第2章 线性表

第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中表格作为一个数据的 组织形式,这种组织形式就是数据元素(记录)“一个接 一个地排列”。

第3章线性表概要

第3章线性表概要

链式存储的几种形式



单链表 循环链表 双向链表
单链表的定义
typedef int DataType; class Item { public: DataType data; Item * next; Item(){next=NULL;} };
class Link { public: Item *head; Link(){head=NULL;} ~Link(){DeleteAll();} void Initiate(); void DeleteAll(); void HeadCreate(int n); void TailCreate(int n); void HeadCreateWithHead(int n); void TailCreateWithHead(int n); int Length(); Item *Locatex(DataType x); Item *Locatei(int i); DataType Get(int i); bool Insert(DataType x,int i); bool Deleted(int i); void Print(); };
Ein P i (n i 1)
i 1
n 1
在等概率情况下,Pi=1/(n+1),则
1 n1 n Ein P (n i 1) i (n i 1) n 1 i 1 2 i 1
n 1
时间复杂度为O(n)
典型操作的算法实现
3. 删除运算
线性表的删除运算是指将表中第i个元素从线性表中删除, 使原表长为n的线性表(a1,a2,…,ai-1,ai,ai+1,…, an)变成表长为n-1的线性表 (a1,a2,…,ai-1,ai+1,…,an) i的取值范围为1≤i≤n。

第12章-线性表

第12章-线性表

第12章线性表数据结构: 是相互之间存在一种或多种特定关系的数据元素的集合。

在任何问题中, 数据元素都不是独立存在的, 而是在它们之间存在着某种关系, 这种数据元素相互之间的关系称为结构。

通常有4种结构:(1)集合:结构中的数据元素之间除了“同属于一个集合”的关系外, 别无其它的关系;一个大学同学之间的关系就是“集合”;(2)线性结构: 结构中的数据元素之间存在着一个对一个的关系;一个班级同学之间的学号有先后关系(一对一的关系);(3)树形结构: 结构中的数据元素之间存在一个对多个的关系;一个班主任对该班上的学生之间的关系;(4)图状结构或网状结构: 结构中的数据元素之间存在多个对多个的关系;一个班上的同学之间的关系。

线性结构的特点是:在数据元素的非空有限集中, 存在着以下:(1)存在唯一的一个被称做“第一个”的数据元素(2)存在唯一的一个被称做“最后一个”的数据元素(3)除第一个之外, 集合中的每个数据元素均只有一个前驱(4)除最后一个之外, 集合中的每个数据元素均只有一个后继满足这种关系的数据集合就是“线性表”。

12.1 线性表的定义线性表(Linear List)是最常用且最简单的一种数据结构。

简言之, 一个线性表是n个数据元素的有限序列。

每个数据元素的具体含义可以不同。

在稍复杂的线性表中, 一个数据元素可以由若干个数据项组成(如一个结构体就是一个数据元素, 而结构中的每个成员就是一个数据项)。

在这种情况下, 常把数据元素称为记录, 含有大量记录的线性表又称为文件。

线性表可以有两种实现方式: 顺序方式、链式方式。

顺序方式实现的称为“顺序表”, 链式方式实现的称为“链表”。

12.2 线性表的顺序表示和实现一般表示顺序表的结构为:#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量#define LISTINCREMENT 10 //线性表存储空间的分配增量typedef int ElemType; //使用typedef定义一种新类型ElemType, 此处它其实就是inttypedef struct{ElemType *elem; //存储空间基址int length; //当前长度int listsize; //当前分配的存储空间(个)}SqList;需要实现的操作有:(1)初始化(2)销毁(3)清空(4)判空(5)求长度(6)获取第i个元素(7)对第i个元素设值(8)在第i个位置上插入一个元素(9)删除第i个元素(10)求某个元素的前驱(11)求某个元素的后继(12)查找某个指定值的元素的位置(13)遍历实现如下:1.初始化/*函数: 初始化一个线性表*/Status InitList_Sq(SqList &L){L.elem=(ElemType*)malloc(sizeof(SqList)*LIST_INIT_SIZE);if(L.elem==NULL) //申请空间失败, 程序直接退出exit(OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZE;return OK;}其中exit(代码)是直接退出程序。

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

实验1 线性表实验要求:使用Visual C++ 2005开发环境,完成以下习题。

1. 按照课本第2.2节定义的线性表结构,完成对线性表结构的定义,以及对线性表的各种基本运算的实现(每种基本运算用一个函数来实现)。

基本运算包括:初始化InitList运算、求表长Length运算、插入新节点Insert 运算、删除节点Delete运算、定位(按值查找)Locate运算、读表元Get运算。

并且在main函数中分别调用以上各种基本运算的函数来使用,以证明其功能已实现。

实验效果展示可参考以下截图(也可自行设计,能展示清楚即可)。

此题的源程序保存为2_a1.cpp。

程序1://2_a1.cpp 实验1 第1题参考答案#include<iostream>using namespace std;typedef int datatype;const int maxsize = 100;typedef struct{datatype data[maxsize];int n;}sqlist;sqlist* InitList(){sqlist * L = new sqlist;L->n=0;return L;}int Length(sqlist * L){return L->n;}int Insert(sqlist * L, datatype x, int i){int j;if(L->n==maxsize){cout<<"表满,不能插入!"<<endl;return -1;}if(i<1 || i>L->n+1){cout<<"非法插入位置!"<<endl;return 0;}for(j=L->n ; j>=i ; j--){L->data[j] = L->data[j-1];}L->data[i-1]=x;L->n++;return 1;}int Delete(sqlist * L , int i){//从顺序表中删除第i个位置上的结点int j;if(L->n==0){cout<<"表空,不能删除!(下溢)\n";return -1;}if(i<1 || i>L->n){cout<<"非法删除位置!\n";return 0;}for(j=i+1 ; j<=L->n ; j++)L->data[j-2] = L->data[j-1];L->n--;return 1;}int Locate(sqlist * L , datatype x){int i=1;while(i<=L->n && L->data[i-1]!=x)i++;if(i<=L->n)return i; //找到elsereturn 0; //未找到}datatype Get(sqlist * L, int i){if(i<1 || i>L->n){cout<<"非法获取位置!\n";return 0;}return L->data[i-1];}void Display(sqlist * L){cout<<"线性表中的数据元素依次是: ";int i;for(i=0;i<L->n;i++){cout<<L->data[i]<<" ";}cout<<endl<<endl;}int main(){sqlist * List = InitList();cout<<"调用InitList函数创建空表后:"<<endl;cout<<"线性表的长度是:"<<Length(List)<<endl;Display(List);cout<<"以下四次调用Insert函数:"<<endl;Insert(List,5,1);cout<<"调用Insert函数,在当前第1个位置插入5之后:"<<endl;Display(List);Insert(List,6,1);cout<<"调用Insert函数,在当前第1个位置插入6之后:"<<endl;Display(List);Insert(List,9,3);cout<<"调用Insert函数,在当前第3个位置插入9之后:"<<endl;Display(List);Insert(List,8,3);cout<<"调用Insert函数,在当前第3个位置插入8之后:"<<endl;Display(List);cout<<"调用Length函数,得到线性表的当前长度是:"<<Length(List)<<endl<<endl;int r;r=Locate(List,5);cout<<"调用Locate函数,找到5在线性表中的位置是:"<<r<<endl<<endl;Delete(List,2);cout<<"调用Delete函数,删除第2个元素后:"<<endl;Display(List);cout<<"调用Length函数,得到线性表的当前长度是:"<<Length(List)<<endl<<endl;datatype d;d=Get(List ,3);cout<<"调用Get函数获取得到该线性表的第3个元素是:"<<d<<endl<<endl;return 0;}程序2:#include <iostream>using namespace std;const listsize=100;typedef int DataType;typedef struct{DataType data[listsize];int length;}SeqList;SeqList L;//函数声明区域void createlist (SeqList *p); //创建顺序表void printlist (SeqList L); //输出顺序表void sortlist (SeqList *p); //排列顺序表void Delete (SeqList *p,int wz); //删除顺序表中的元素void search (SeqList *p,int ys); //查找顺序表中元素的信息void insert (SeqList *p,DataType ys,int wz); //插入元素void esc (); //退出//函数定义区域void createlist (SeqList *p)//建立顺序表{int i,n;cout <<"请输入要创建顺序表的元素个数:";cin >>n;cout <<"请依次输入"<<n<<"个元素:";for (i=1;i<=n;i++){cin >>p->data[i];}p->length=n;}void printlist (SeqList L)//输出{int i;cout<<"顺序表的元素为:";for (i=1;i<=L.length;i++)cout <<L.data[i]<<" ";cout <<endl;cout<<"当前顺序表长度为:"<<L.length<<endl;}void sortlist (SeqList *p)//排序函数{int i,j,t;for(i=0;i<p->length-1;i++){for(j=0;j<p->length;j++)if((p->data[j])>(p->data[j+1])){t=p->data[j];p->data[j]=p->data[j+1];p->data[j+1]=t;}}}void insert (SeqList *p,DataType ys,int wz)//插入元素函数{cout<<"请输入要插入的元素:";cin>>ys;cout<<"请输入要插入的位置:";cin>>wz;if(wz<1)wz=1;else if(wz>p->length)wz=p->length+1;for(int i=p->length;i>=wz;i--)p->data[i+1]=p->data[i];p->data[wz]=ys;p->length=(p->length)+1;}void Delete (SeqList *p,int wz)//删除函数{cout<<"请输入要删除元素的位置:";cin>>wz;int i;if (wz<1 || wz>p->length)cout<<"删除位置不对!"<<endl;elsefor(i=wz;i<=p->length;i++)p->data[i]=p->data[i+1];p->length--;}void search (SeqList *p,int ys)//查询函数{cout<<"请输入要查找的元素:";cin>>ys;for(int i=0;i<=p->length;i++)if(p->data[i]==ys)cout<<"元素值为:"<<ys<<endl<<"所在位置为:"<<i<<endl; }void esc()//退出函数{exit (1);}int main(){T:cout<<"***************顺序表****************"<<endl;cout<<'\t'<<"1、创建顺序表"<<endl;cout<<'\t'<<"2、从小到大排列顺序表"<<endl;cout<<'\t'<<"3、插入元素"<<endl;cout<<'\t'<<"4、删除元素"<<endl;cout<<'\t'<<"5、查找元素"<<endl;cout<<'\t'<<"6、退出"<<endl;cout<<"**************************************"<<endl;cout<<"请输入数字(1~7)选择相应的功能"<<endl;int wz;DataType ys;char aa;cin >>aa;switch(aa){case'1':createlist(&L); printlist (L);break;case'2':sortlist(&L); printlist (L);break;case'3': insert(&L,ys,wz); printlist (L);break;case'4':Delete (&L,wz);printlist(L);break;case'5':search(&L,ys);break;case'6':esc();}goto T;return 0;}2.一个顺序表中存放字符(只有数字字符和英文字符),编写算法删除所有的数字字符。

相关文档
最新文档