静态链表建立及操作

静态链表
静态链表的形式类似于单链表,但静态链表是依靠数组来实现的。我们一起来了解一下吧。



静态链表简单介绍

静态链表是用数组描述的链表

静态链表是由数组实现,该数组的每一个元素包含俩个内容
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;
}

我个人认为单链表和静态链表的基本操作思路差不多,都有一个充当头结点的东西,进行插入和删除操作时必须从头结点的位置开始操作。

新手发布博客,错误之处在所难免,每一次发博客的是一次对自己的考核。以后敲代码必须多敲,多实验。有错误和改进之处还需大家多多指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值