这篇文章主要介绍有关线性表的相关知识点及操作,其中包含有顺序存储结构的线性标、链式存储结构的线性标,其中链式存储结构的线性表中还介绍了单链表、循环链表、双向链表。
了解线性表
在线性表的顺序存储中,线性表中的数据如果在逻辑上是相邻的,那么在物理结构上也是相邻的。
区分两个概念:
数组长度:在线性表中,为了估算线性表的最大存储容量设置一个数组,数组的长度就是这个最大存储容量。线性表长度:指当前线性表中所有数据占用的长度,线性表长度不能超过存储容量,即数组长度。
//顺序存储结构代码
#define MaxSize 20 //存储空间初始分配量
typedef int ElemType; //ElemType类型设置为int型,可根据实际情况修改
struct SqlList{
ElemType datap[MAxSize]; //数组存储当前数据元素,最大值为MaxSize
int length; //线性表当前长度
};
线性表的基本操作:
下面的操作都是在存在SQList的条件下进行的操作
- 获取元素
int getElem(SqList L,int i,ElemType *e){
//在调用该函数时,需要传入一个SqList型的结构体,i表示要获取第i个位置的数据,e返回第i个数据元素的值。
if(L.length==0||i<1||i>L.length)
return ERROR;
*e=L.data[i-1];//在数组中是从0开始的,所以获取第i个位置的数据就是读取data[i-1]
return OK;
}
- 插入数据
int insert (SqList *l,int i,ElemType e){
int k;
if(l->length==MaxSize)
return ERROR;
if(i<1||i>l->length)
return ERROR;
if(i<l->length){
for(k=l->length-1;k>=i-1;k--)
l->data[k+1]=l->data[k];
}
l->data[i-1]=e;
l->length++;
return OK;
}
- 删除数据
int Listdelete (SqList *l,int i,ElemType *e){
int k;
if(l->length==0)
return ERROR;
if(i<1||i>l->length)
return ERROR;
if(i<l->length){
for(k=i;k<l->length;k++)
l->data[k-1]=l->data[k];
}
l->length--;
return OK;
}