声明:该文章所有内容均参考陈越教授主编的《数据结构》一书
数据存储是我们学习中常见的问题,其中较为简单的存储方式就是线性结构,下面我们花一点时间来了解一下线性结构
目录
一、什么是线性结构
二、线性表
三、堆栈
四、队列
五、应用举例
一、什么是线性结构
线性结构是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
常见的线性结构有:线性表,堆栈,队列等,这些都存在顺序存储和链式存储两种方式。
二、线性表
定义:线性表是一种最常见的数据存储结构,它的实现方式较为简单,且设计思路清晰,无需太多的算法基础。
1、顺序存储:顺序存储一般借助数组,我们通常定义一个结构,里面包括一个被定义类型的数组和一个数据最大值,下面看代码实现:
typedef struct lnode{
elementype data[maxsize];
int last;//数组中最后一个元素的位置
}list;
初始化:创建一个空的顺序线性表:
list_make()//创建一个空的顺序表
{
list * L;
L=(list*)malloc(sizeof(struct lnode));
L->last=-1;
return L;
}
下面是一些对顺序存储线性表的操作函数:
(1)查找元素
list_find(int x,list *L)//在该顺序表中查找所找元素的位置
{
int i=0;
while(i<=L->last&&l->data[i]!=x){
i++;
if(i>L->last) return error;
else return i;
}
}
(2)插入元素:对于数组而言。它的大小是固定的,我们必须在数组所能表示的范围内进行插入,所以数组在插入之前一定不会被完全占满,这就造成了空间的浪费,同时,插入只能从插入位置向后移动,由此来空出一个位置这样的循环遍历会让算法的时间复杂度增加,现在看代码实现:
list_insert(int x,int i,list * L){ //插入元素,注意,第i个元素实际对应的是下标为i-1的数组元素
int j;
if(L->last==maxsize-1){
printf("full");
return 0;
}
if(i<=0||i>=L->last+1){
printf("无符合的位置");
return 0;
}
for(j=L->last;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i]=x;
L->last++;
return 0;
}
(3)删除元素:与插入一样,也是将后面的元素循环遍历向前面移动
list_delete(int i;list * L){ //删除
int j;
if(i<=0||i>=L->last+1){
printf("不存在这样的元素");
return 0;
}
for(j=i;j<=L->last;j++){
L->data[j-1]=L->data[j];