线性表的顺序储存
顺序表
1.线性表的顺序储存是指在内存中用地址连续的一块储存空间顺序存放线性表的各元素,用这种储存形式储存的线性表称为顺序表。
2.设
a
1
a_1
a1的储存地址为
L
o
c
(
a
1
)
Loc(a_1)
Loc(a1),每个元素占d个存储单元,则第i个元素的地址
L
o
c
a
(
a
i
)
=
L
o
c
a
(
a
1
)
+
(
i
−
1
)
×
d
Loca(a_i)=Loca(a_1)+(i-1)×d
Loca(ai)=Loca(a1)+(i−1)×d
d
:
(
1
≤
i
≤
n
)
d:(1≤i≤n)
d:(1≤i≤n)
3.封装结构题作为顺序表类型
typedef struct{
datatype data[MAXSIZE];
int last;//last用于存放当前最后一个元素在数组中的位置。
}SeqList;
4.定义一个顺序表:
SeqList L;
或者
SeqList *L;
5.可以通过L=(SeqList *)malloc(sizeof(SeqList));
来获取顺序表的储存空间。
顺序表上基本运算的实现
1.顺序表的初始化。
SeqList *init_SeqList()
{
SeqList *L;
L=(SeqList*)malloc(sizeof(SeqList));//申请顺序表的储存空间。
L->last=-1;//因为线性表中无元素,故将最后一个元素的位置置为-1。
return L;
}
2.顺序表的插入。
int Insert_SeqList(SeqList*L,int i,datatype x){//这个算法需要返回改变的顺序表所以是 SeqList * 类型。
int j;
if(L->Last == MAXSIZE-1){//若last这个最后位置为MASIZE-1,则表示空间已经满了。
printf("表满");return(-1);
}
if(i<1||i>L->last+2){//因为插入可以在最后一个位置插入,所以i不能超过last+2.
printf("位置错");return(0);
}
for(j=L->last;j>=i-1;j--){
L->data[j+1]=L->data[j];//注意赋值是将等号右边的赋值给等号左边的。
}
L->data[i-1]=x;//新元素插入。
L->last++;//last仍然指向最后元素。
return (1);
}
3.顺序表的删除。
int Delete_SeqList(SeqList*L,int i)//这个算法需要返回改变的顺序表所以是 SeqList * 类型。
{
int j;
if(i<1||i>L->last+1)//检查空表以及删除位置的合法性。i不能超过last+1.
{printf("不存在第i个元素");return(0);}
for(j=i;j<=L->last;j++)
{
L->data[j-1]=L->data[j];//向上移动,注意赋值是将等号右边的赋值给等号左边的。
}
L->last--;//last仍然指向最后元素。
return (1);//删除成功,返回代码1。
}
4.顺序表中的查找。
int Location_SeqList(SeqList*L,datatype x)
{
int i=0;//从第一个位置开始。
while(i<=L->last&&L->data!=x)//直到不满足条件停止循环。
i++;
if(i>L->last)return -1;
else return i;//查找成功,返回储存位置。
}
顺序表的应用举例。
1.划分算法。
关键一步:若当前节点比
a
1
a_1
a1小,说明它应该在
a
1
a_1
a1的前面,此时将他上面的元素都依次向下移动一个位置,然后将它置入最上方。
void part(SeqList *L)
{
int i,j;
datatype x,y;//注意变量的类型,因为不知道L->last的类型,所以这里用datatype。
x=L->data[0];
for(i=1;1<=L->last;i++)
{
if(L->data[i]<x)
{
y=L->data[i];
for(j=i-1;j>=0;j--)//注意j的范围是从j—1开始到0,将j-1带入就是将L->[j-1]赋值给L->data[j],从而在L->data[0]空出一个位置。
L->data[j+1]=L->[j];
L->data[0]=y;
}
}
}
2.顺序表的合并。
void merge(SeqList *A,SeqList *B,SeqList *C)
{
int i,j,k;
i=0,j=0,k=0;
while(i<=A->last&&j<=B->last)//注意需要用两个变量分代表两个线性表。
if(A->data[i]<B->data[j])
C->data[k++]=A->data[i++];
else
C->data[k++]=B->data[j++]
while(i<=A->last)
C->data[k++]=A->data[i++];
while(j<=B->last)
C->data[k++]=B->data[j++]
C->last=k-1;
}