线性表静态链表实现基础操作和效果图

前言:

静态链表,一定要细心,多琢磨,一定清楚第一个和最后一个元素是干嘛的,以及它的对应的游标啥意思

有问题可以在直接评论,会回复的

代码用C语言实现,可以直接运行看效果

效果图:

#include <stdio.h>
#include <malloc.h> 

#define MaxSize 150
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef struct StaticLink{
	ElemType data;
	int cur;
}StaticLink,StaticLinkList[MaxSize];

/*初始化链表*/
int InitStaticLink(StaticLinkList slk)
{
	int i = 0;
	while(i<MaxSize-1)
	{
		slk[i].cur = i+1;
		slk[i].data = 0;			//给个默认值,好调试 
		i++;
	}
	slk[MaxSize-1].cur = 0;			//链表为空,最后一个元素游标为0
	return OK;
}

/*计算链表长度*/
int LenghtSLink(StaticLinkList slk)
{
	int index=slk[MaxSize-1].cur;
	int lenght=0;
	while(index)
	{
		index=slk[index].cur;
		lenght++;
	}
	return lenght;
}

/*返回可以插入数据的结点下标*/
int MallocSLink(StaticLinkList slk)
{
 	int i = slk[0].cur;				//可以插入数据的地方,也就是下标
	slk[0].cur = slk[i].cur;
	return i;
}

/*向静态链表插入数据*/
int InsertSLink(StaticLinkList slk,int i,ElemType e)
{
	if(i<1 || i>LenghtSLink(slk)+1)				//判断插入位置,链表是否满了 
		return ERROR;
	int index = MallocSLink(slk);
	int begin = MaxSize-1;
	for(int j=1;j<i;j++)					//找到第i个元素之前的那个元素位置 
		begin = slk[begin].cur;
	slk[index].data=e;						//把数据放进去
	slk[index].cur=slk[begin].cur; 			//把第i-1个元素游标的值 给 第i个元素的游标 
	slk[begin].cur=index; 					//把第i-1元素的游标值改成第i个元素的下标
	return OK;
}

/*释放该下标的结点*/
void FreeSLink(StaticLinkList slk,int index)
{
	slk[index].cur=slk[0].cur;				//把可以用的、结点的下标、的值,赋给刚才那个删除的结点,这样就可以先用删除的节点了 
	slk[0].cur=index; 						//把游标改为刚删除结点的下标 
}

/*静态链表删除数据元素,
  删除只是改了游标,值还在,只不过下次插入数据会优先使用删除的结点,新值直接覆盖掉旧值,相当于删除了*/
int DeleteSLink(StaticLinkList slk,int i)
{
	if(i<1||i>LenghtSLink(slk)+1)
		return ERROR;
	int begin = MaxSize-1;
	int j;
	for(j = 1 ; j<i ; j++)
	{
		begin = slk[begin].cur;
	}
	j = slk[begin].cur;						//链表是通过游标链起来的,不是数组直接点下标就可以了,j是要删除元素的下标 
	slk[begin].cur=slk[j].cur;				//把要删除元素游标域的值,给j-1个元素的游标域
	FreeSLink(slk,j);						//释放该结点,使之成为备用结点 
	return OK; 
} 

int main(void)
{
	StaticLinkList slk;
	InitStaticLink(slk);
	int address = 1,e=666;
	while(address<=10)
	{
		InsertSLink(slk,address,e);
		e = e + 111;
		address++;
	}
	InsertSLink(slk,6,6666);		//新增一结点,看游标变化 
	for(int i=0;i<MaxSize;i++)
	{
		printf("下标:%d \t 数据域:%d \t 游标域:%d\n",i,slk[i].data,slk[i].cur);
	}
	printf("\n");
	DeleteSLink(slk,1);				//删除第一个结点,看游标变化 
	for(int i=0;i<MaxSize;i++)
	{
		printf("下标:%d \t 数据域:%d \t 游标域:%d\n",i,slk[i].data,slk[i].cur);
	}
	return 0;	
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值