静态链表
静态链表的形式类似于单链表,但静态链表是依靠数组来实现的。我们一起来了解一下吧。
静态链表简单介绍
静态链表是用数组描述的链表,
静态链表是由数组实现,该数组的每一个元素包含俩个内容
1.储存的数据date
2.存放其他结点下标的游标cur
#define MAXSIZE 20 //静态链表的长度
#define OK 1
#define ERROR 0
typedef int elemtype;
typedef int Status;
typedef struct
{
elemtype date; //静态链表元素储存的数据
int cur; //静态链表元素的游标
}StaticLinkList[MAXSIZE];
静态链表基本操作
静态链表初始化
数组的第一元素的游标存储的是第一个备用元素的下标;
数组的最后一个元素的游标存储第一个有数据元素的下标;如果链表为空,则游标存储数字0。二者都不储存元素;
其他元素的元素存储下一个元素的游标;
静态链表的初始化
建立一个空的静态链表
Status IntiList(StaticLinkList List)
{
int i;
for(i=0;i<MAXSIZE-1;i++) //遍历静态链表
List[i].cur=++i;
List[MAXSIZE-1].cur=0; //静态链表初始化,目前为空链表
return OK;
}
静态链表长度计算
Status Listlength(StaticLinkList List)
{
int length,i;
i=List[MAXSIZE-1].cur; //找到第一个存储数据元素的位置
length=0;
while(i!=0) //找到最后存储元素后跳出
{
i=List[i].cur;
length++;
}
return length; //返回静态链表长度
}
静态链表开辟新的空间
Status Malloc_SLL(StaticLinkList List)
{
int i;
i=List[0].cur;
if(List[0].cur)
List[0].cur=List[i].cur;
return i;
}
静态链表空间的释放
Status Free_SLL(StaticLinkList List,int i)
{
List[i].cur=List[0].cur;
List[0].cur=i;
return OK;
}
静态链表建立
Status Create_StaticLinkList(StaticLinkList List,int n)
{
int i;
if(n<1||n>MAXSIZE-2) //不符合要求的n值
return ERROR;
for(i=1;i<=n;i++) //输入想要存储的数据
scanf("%d",&List[i].date);
List[n].cur=0; //链表最后一个元素的游标存储数据0
List[MAXSIZE-1].cur=1; //数组最后一个元素存储第一个有数据元素的位置
List[0].cur=n+1; //数组第一个元素存储备用链表第一个元素的位置
return OK;
}
静态链表打印
Status Print_StaticLinkList(StaticLinkList List)
{
int i;
i=List[MAXSIZE-1].cur;
printf("该静态链表为:");
while(i)
{
print(" %d",List[i].date);
i=List[i].cur;
}
printf("\n");
return OK;
}
静态链表获取
Status Getelem(StaticLinkList List,int i,int *e) //i为想获取元素的位置,e来返回该位置元素的数值
{
int aim,k;
if(i<1||i>Listlength(List))
return ERROR;
k=List[MAXSIZE-1].cur;
aim=1;
while(aim!=i)
{
k=List[k].cur;
aim++;
}
*e=List[k].date;
return OK;
}
静态链表插入
Status Insert(StaticLinkList List,int i,int e)
{
int s,k,aim; //k表示目前在静态链表中的位置
if(i<1||i>Listlength(List)+1)
return ERROR;
s=Malloc_SLL(List);
if(s)
{
List[s].date=e;
k=MAXSIZE-1; //k目前位于数组的最后一个元素
for(aim=1;aim<i;aim++) //先进行计数aim=1,再进行定位置k=List[k].cur
k=List[k].cur;
List[s].cur=List[k].cur;
List[k].cur=s;
}
return OK;
}
展示一个错误的代码,如果按照如下处理就会导致无法插入第一个元素。所以我们的位置k必须从数组最后一个元素开始记,删除操作也相同
List[s].date=e;
k=List[MAXSIZE-1].cur;
for(aim=1;aim<i;aim++)
k=List[k].cur;
List[s].cur=List[k].cur;
List[k].cur=s;
静态链表删除
Status Delete(StaticLinkList List,int i,int *e)
{
int k,aim;
if(i<1||i>Listlength(List))
return ERROR;
k=MAXSIZE-1;
for(aim=1;aim<i;aim++)
k=List[k].cur;
aim=List[k].cur;
List[k].cur=List[aim].cur;
*e=List[aim].date;
Free_SLL(List,aim);
return OK;
}
同样展示一个错误的代码,错误的地方同样是漏掉了第一个元素的删除
k=MAXSIZE-1;
for(aim=1;aim<i;aim++)
k=List[k].cur;
aim=List[k].cur;
List[k].cur=List[aim].cur;
*e=List[aim].date;
Free_SLL(List,aim);
完整代码及总结
#include<stdio.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int elemtype;
typedef int Status;
typedef struct
{
elemtype date;
int cur;
}StaticLinkList[MAXSIZE];
Status IntiLinkList(StaticLinkList List)
{
int i;
for(i=0;i<MAXSIZE-1;i++)
List[i].cur=i+1;
List[MAXSIZE-1].cur=0;
return OK;
}
Status Listlength(StaticLinkList List)
{
int length,i;
i=List[MAXSIZE-1].cur;
length=0;
while(i!=0)
{
i=List[i].cur;
length++;
}
return length;
}
Status Malloc_SLL(StaticLinkList List)
{
int i;
i=List[0].cur;
if(i)
List[0].cur=List[i].cur;
return i;
}
Status Free_SLL(StaticLinkList List,int i)
{
List[i].cur=List[0].cur;
List[0].cur=i;
return OK;
}
Status Create_StaticLinkList(StaticLinkList List,int n)
{
int i;
if(n<1||n>MAXSIZE-2)
return ERROR;
for(i=1;i<=n;i++)
scanf("%d",&List[i].date);
List[n].cur=0;
List[MAXSIZE-1].cur=1;
List[0].cur=n+1;
return OK;
}
Status Print_StaticLinkList(StaticLinkList List)
{
int i;
i=MAXSIZE-1;
printf("该静态链表为:");
while( List[i].cur )
{
i=List[i].cur;
printf(" %d",List[i].date);
}
printf("\n");
return OK;
}
Status Getelem(StaticLinkList List,int i,int *e)
{
int aim,k;
if(i<1||i>Listlength(List))
return ERROR;
k=List[MAXSIZE-1].cur;
for(aim=1;aim<i;aim++)
k=List[k].cur;
*e=List[k].date;
return OK;
}
Status Insert(StaticLinkList List,int i,int e)
{
int s,k,aim;
if(i<1||i>Listlength(List)+1)
return ERROR;
s=Malloc_SLL(List);
if(s)
{
List[s].date=e;
k=MAXSIZE-1;
for(aim=1;aim<i;aim++)
k=List[k].cur;
List[s].cur=List[k].cur;
List[k].cur=s;
}
return OK;
}
Status Delete(StaticLinkList List,int i,int *e)
{
int k,aim;
if(i<1||i>Listlength(List))
return ERROR;
k=MAXSIZE-1;
for(aim=1;aim<i;aim++)
k=List[k].cur;
aim=List[k].cur;
List[k].cur=List[aim].cur;
*e=List[aim].date;
Free_SLL(List,aim);
return OK;
}
int main()
{
int n,i,e;
StaticLinkList space;
IntiLinkList(space);
printf("请输入想要建立静态链表的长度: ");
scanf("%d",&n);
Create_StaticLinkList(space,n);
Print_StaticLinkList(space);
printf("请输入你想获取元素的位序: ");
scanf("%d",&i);
Getelem(space,i,&e);
printf("%d\n",e);
Print_StaticLinkList(space);
printf("请输入想插入元素的位置及插入元素的值:");
scanf("%d%d",&i,&e);
Insert(space,i,e);
Print_StaticLinkList(space);
printf("请输入想删除的数据元素的位序: ");
scanf("%d",&i);
Delete(space,i,&e);
printf("删除的元素是%d\n",e);
Print_StaticLinkList(space);
return 0;
}
我个人认为单链表和静态链表的基本操作思路差不多,都有一个充当头结点的东西,进行插入和删除操作时必须从头结点的位置开始操作。
新手发布博客,错误之处在所难免,每一次发博客的是一次对自己的考核。以后敲代码必须多敲,多实验。有错误和改进之处还需大家多多指出