您的位置:首页 > 理论基础 > 数据结构算法

数据结构笔记(三)静态链表的实现和基本操作

2017-11-19 18:33 260 查看

一、静态链表的定义

用数据替代指针,来描述单链表。首先,数据的元素由两个数据域组成,data和cur。数据域data,用来存放数据元素,即要处理的数据;游标cur相当于单链表中的next指针。

//线性表的静态单链表存储结构
#define MAXSIZE 1000
typedef struct{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];


此外,我们对数据第一个和最后一个元素作为特殊元素处理,不存数据。把未被使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后一个元素的cur则存放第一个数值的元素的下标,相当于单链表中头结点。



上图为初始化的数组状态,下面是代码:

Status InitSpace_SL(SLinkList &space){
//将一组数组space中各分量链成一个备用链表,space[0].cur为头指针,
//“0”表示空指针
int i;
for(i=0;i<MAXSIZE-1;i++){
space[i].cur=i+1;
}
space[MAXSIZE-1].cur=0;
return  OK;
}


假设已经将数据存入静态链表,如下:



此时,“甲”这里就存有下一元素“乙”的游标2,“乙”则存有下一元素“丁”的下标3。而“己”是最后一个有值元素,所以它的cur设置为0。而最后一个元素的cur则因“甲”是第一个有值元素而存有它的下标为1。而第一个元素则因空闲空间的第一各元素下标为7,所以它的cur存有7.

二、静态链表的插入操作

1、首先要重写malloc函数

int Malloc_SL(SLinkList &space){//若备用空间链表非空,则返回分配的结点下标,否则返回0.
int i=space[0].cur;//当前数组第一个元素的cur存的值
if(space[0].cur){
space[0].cur=space[i].cur;
}
return i;


//在L中第i个元素之前插入新的数据元素e
Status ListInsert(SLinkList &L,int i,ElemType e){
int i,k,l;
k=MAXSIZE-1;//注意k首先是最后一个元素的下标
if(i<1||i>ListLength(L)+1){
return ERROR;
}
j=Malloc_SL(L);//获得空闲分量的下标
if(j)
{
L[j].data=e;//将数据赋值给此分量的data
for(l=1;l<=i-1;l++){//找到第i个元素之前的位置
k=L[k].cur;
}
L[j].cur=L[k].cur;//把第i个元素之前的cur赋值给新元素的cur
L[k].cur=j;//把新元素的下标赋值给第i个元素之前元素的cur
return OK;
}
return ERROR;
}


ListLength函数代码见最后

三、静态链表的删除操作

1、首先重写free函数

//将下标为k的空闲结点回收到备用链表
void Free_SL(SLinkList &space,int k){
space[k].cur=space[0].cur;//把第一个元素cur赋值给要删除的分量cur
space[0].cur=k;//把要删除的分量下标赋值给第一个元素的cur
}


//删除在L中第i个数据元素e
Status ListDelete(SLinkList &L,int i){
int j,k;
if(i<1||i>ListLength(L)){
return ERROR;
}
k=MAXSIZE-1;
for(j=1;j<=i-1;j++){
k=L[k].cur;
}
j=L[k].cur;
L[k].cur=L[j].cur;
Free_SL(L,j);
return OK;
}


//初始化条件:静态链表L已经存在。操作结果:返回L中数据元素个数
int ListLength(SLinkList L){
int j=0;
int i=L[MAXSIZE-1].cur;
while(i){
i=L[i].cur;
j++;
}
return j;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息