浅谈线性表的逻辑结构和顺序存储结构
线性表的逻辑结构
线性表是n个数据类型相同的元素组成的数据结构。
线性表中的数据有以下几个特点:
1.元素的类型相同;
2.元素的个数有限;
3.除了第一个元素外,每个元素都有且仅有一个被称为直接前驱的节点;
4.除了最后一个元素外,每个元素都有且仅有一个被称为直接后继的节点;
线性表的顺序存储结构
线性表的顺序存储是指用一组连续的存储空间存储线性表的各个数据元素,其特点是物理位置相邻。采用顺序存储结构的线性表称为顺序表。
假设有n个元素,每个元素占m个内存单元,第一个元素的存储地址为Loc(a1),称为基地址,第i个元素的存储地址记为Loc(ai),计算方法:
Loc(ai) = Loc(a1)+(i-1)*m
所以只要知道基地址和每个元素所占的存储单元大小,就可以快速算出任何一个元素的存储地址,从而可以对表中数据元素的随机存取,所以顺序表是一种随机存取结构。
数组就是采用顺序存储结构表示,所以可以用一维数组类型来表述顺序表,除了数组,顺序表还应有长度属性。
ElemType data[];
int length;
ElemType泛指某种数据类型,具体类型视情况而定。length用来记录当前线性表的当前长度。为了把length和data数组联系起来,可以把其定义为结构体类型,如下:
#define MaxSize//数组的最大长度
typedef struct
{
ElemType data[MaxSize];
int length;
} SeqList
顺序表的基本操作
插入
顺序表的插入是指在指定位置插入一个元素,并把数组长度加一。
该运算的主要操作是将要插入位置后的元素向后移一个单位,用来空出要插入元素的位置。
算法如下:
void InsertList(SeqList *L,ElemType x,int i)
/* 因为要对表中元素进行修改,所以传人顺序表的指针型参数,x为要插入的元素,i为要插入的位置*/
{
int k;
If((i<1)||(i>L->length+1))
{
printf(“非法输入”);
return;
}
/*i的合法范围应在1和插入之前长度加一之间*/
if(L->length>=MaxSize)
{
printf(“空间溢出”);
return;
}
for(k=L->length-1;k>=i-1;k--)
{
L->data[k+1] = L->data[k];
}
/*将i位置后的元素后移*/
L->data[i-1] = x; //插入
L->length++ //表的长度加一
}
删除
顺序表的删除操作是指在指定位置删除一个元素,并把数组长度减一。
该运算的主要操作是将要插入位置后的元素向前移一个单位,用来补上删除元素的位置。
算法如下:
void DeleteList(SeqList *L,int i)
{
int k;
If((i<1)||(i>L->length))
{
printf(“非法输入”);
return;
}
/*i的合法范围应在1和删除之前长度之间*/
for(k=i;k<=L->length-1;k++)
{
L->data[k-1] = L->data[k];
}
/*将i位置后的元素前移*/
L->length-- //表的长度减一
}
查找
在顺序表中查找某元素,就是将该元素与表中一一进行比较,直到遇到第一个相等的元素,返回下标。若没有,返回-1。
算法如下:
int LocatSeq(SeqList L,ElemType x)
{
int i;
for(i=0;i<L->length;i++)
{
If(L.data[i]==x)
return i;
}
return -1;
}
此算法不牵扯如何数据修改,所以不用传指针。