线性表之顺序表

线性结构是最简单、最常用的一种数据结构。其特点是:在数据元素的非空有限集合中,除第一个元素无直接前驱、最后一个元素无直接后继外,集合中其他每个数据元素均有惟一的直接前驱和惟一的直接后继。

线性表的逻辑结构:线性表可描述为,线性表是n个类型相同的数据元素的有限序列,对n>0,除第一个元素无直接前驱、最后一个元素无直接后继外,其余的每个数据元素只有一个直接前驱和一个直接后继,数据元素之间具有一对一的关系。

线性表的定义:线性表是由n(n>=0)个类型相同的数据元素组成的有限序列,记做(a1,a2,…,ai-1,ai,ai+1,…,an)。
(1)线性表中元素的个数n被定义为线性表的长度,n=0时称为空表。
(2)这里的数据元素ai(1<= i <=n)具体含义在不同情况下可以不同,它既可以是原子类型,也可以是结构类型(在较为复杂的线性表中,数据元素可由若干数据项组成,例如学籍表,每个学生的相关信息都由学号、姓名、籍贯等数据项组成,常被称为一个记录(或称数据元素)),但一个线性表中的数据元素必须属于同一数据对象(含大量类型相同记录的线性表称为文件(或称数据对象))。
(3)线性表中相邻数据元素之间存在着序偶关系,即对于非空的线性表,表中ai-1领先于ai,称ai-1是ai的直接前驱,而称ai是ai-1的直接后继。除了第一个元素无直接前驱,最后一个元素无直接后继外,其余的每个数据元素都有且仅有一个直接前驱和一个直接后继。这也是线性结构的特点。

由此,可将线性表的特点概括为:
(1)同一性:线性表由同类数据元素组成,每一个ai必须属于同一数据对象。
(2)有穷性:线性表由有限个数据元素组成,表长度就是表中数据元素的个数。
(3)有序性:线性表中相邻数据元素之间存在着序偶关系
由此可以看出,线性表是一种最简单的数据结构,因为数据元素之间是由一前驱一后继的直观有序的关系确定的;线性表又是一种最常见的数据结构,因为矩阵、数组、字符串、堆栈、队列等都符合线性条件。

在计算机内存放线性表,主要有两种基本的存储结构:顺序存储结构和链式存储结构。

线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个数据元素,使得线性表中在逻辑结构上相邻的数据元素存储在连续的物理存储单元中,即通过数据元素物理存储的连续性来反映数据元素之间逻辑上的相邻关系。

采用顺序存储结构存放的线性表通常称为顺序表。
顺序表:关系线性化,结点顺序存。
只要知道顺序表中第一个元素的存储地址(基地址)和表中每个元素所占存储单元的多少,就可以计算出顺序表中任意一个数据元素的存储地址,从而实现对顺序表中数据元素的随机存取。

顺序表之静态顺序表

静态顺序表定义如下

typedef int DataType;
#define MAXSIZE (10)//此处的宏定义常量表示顺序表可能达到的最大长度
typedef struct SeqList
{
     DataType array[MAXSIZE];//顺序表占用的数组空间
     int last;//记录顺序表中最后一个元素在数组array[]中的位置,也就是下标值,空表置为-1。
     //or int size;顺序表中有效元素的个数,空表置为0;还有就是存数据时下一个可用空间的下标。
} SeqList;

说明:
1、结点类型定义中的DataType数据类型是为了描述的统一而自定的,在实际应用中,用户可以根据自己实际需要来具体定义顺序表中元素的数据类型,如 int 等或是一种struct结构体类型,结构体数组。
2、从数组中起始下标为0处开始存放顺序表中第一个元素。因此需注意区分元素的序号和该元素在数组中的下标之间的对应关系。ai在顺序表中的序号为i,其对应的array数组下标为i-1。
3、利用定义的顺序表的数据类型SeqList就可以定义变量了。变量的定义与使用方法有两种:
(1)通过变量定义语句:SeqList L将L定义为SeqList类型的变量,可通过L.array[i-1]来访问顺序表中序号为i的元素ai;通过L.last可得到顺序表中最后一个元素的下标,而L.last+1就是顺序表的长度。
(2)通过指针变量定义语句:SeqList *L将L定义为指向SeqList类型的指针变量,使用时可通过L->array[i-1]来访问顺序表中序号为i的元素ai,通过L->last+1可得到顺序表的长度。
线性表之顺序表_第1张图片
相关代码
静态顺序表

顺序表之动态顺序表

动态顺序表定义如下

typedef int DataType;
#define INIT_CAPACITY (3)
typedef struct SeqListD
{
   DataType *parray;
   int capacity;//当前容量,等同于静态顺序表的MAXSIZE
   int size;//同静态顺序表
} SeqListD;

相关代码
动态顺序表

动态顺序表 vs 静态顺序表
动态顺序表的插入操作加入了扩容机制。也就是说其容量是可以动态增加的,在堆上申请空间。而静态顺序表的容量是固定的。
还有一点需要注意的是,由于动态顺序表的容量是在堆上申请的,在对其不用的情况下,也就是销毁动态顺序表的时候一定要free( ); 以免造成内存泄漏。

你可能感兴趣的:(数据结构-C)