静态链表

#include<stdio.h>
#include<stdlib.h>

#define MAX_SIZE 40

typedef struct Data
{
	int id;
	char* name;
}Data;

typedef struct staticList
{
	Data data;
	int next;       //游标,如果等于0,表示链表结束
}staticList[MAX_SIZE];


int MallocNode(staticList s_link_list);
void InitStaticList(staticList s_link_list);
void PrintfStaticList(staticList s_link_list);
void InsertNode(staticList s_link_list, int pos, Data data);
GetListLength(staticList s_link_list);

//初始化虚拟静态链表
void InitStaticList(staticList s_link_list)
{
	//静态链表中,每个结点的指针+1,就是指向了下个结点
	for (int i = 0; i < MAX_SIZE; i++)
	{
		s_link_list[i].data.id = -1;
		s_link_list[i].data.name = NULL;
		s_link_list[i].next = i + 1;
	}
	//最后一个结点指针置为0,表示链表结束
	s_link_list[MAX_SIZE - 1].next = 0;
}

//遍历
void PrintfStaticList(staticList s_link_list)
{
	for (int i = 0; i < MAX_SIZE; i++)
	{
		if (i >= MAX_SIZE)
		{
			break;
		}
		printf("index: %d  next_index: %d    ", i, s_link_list[i].next);
		printf("id = %d  name = %s\n", s_link_list[i].data.id, s_link_list[i].data.name);
	}
	printf("\n");
}

//插入结点
void InsertNode(staticList s_link_list, int pos, Data data)
{
	//最后一个元素的next保存的是第一个元素的下标
	int for_ward_index = MAX_SIZE - 1;
	if (pos > GetListLength(s_link_list) + 1 || pos < 1)
	{
		printf("插入位置错误,插入失败\n");
		return;
	}
	
	//分配空间
	int new_index = MallocNode(s_link_list);

	if (new_index != 0)
	{
		s_link_list[new_index].data.id = data.id;
		s_link_list[new_index].data.name = data.name;
		//找到new_index的前驱
		for (int i = 1; i <= pos - 1; i++)
		{
			for_ward_index = s_link_list[for_ward_index].next;
		}
		//插入
		s_link_list[new_index].next = s_link_list[for_ward_index].next;
		s_link_list[for_ward_index].next = new_index;
	}
	
}

//为结点分配空间
int MallocNode(staticList s_link_list)
{
	//[0].next一定指向备用链表的第一个结点,因此保存并返回
	int index = s_link_list[0].next;
	//备用链表的第一个结点变换为要返回的结点的下一个结点
	if (index != 0)
	{
		s_link_list[0].next = s_link_list[index].next;
	}

	return index;
}
//获取链表长度
int GetListLength(staticList s_link_list)
{
	int length = 0;
	int i = 0;

	while (s_link_list[i].next != 0)
	{
		length++;
		i++;
	}

	return length;
}

//销毁空间,按下标销毁
void FreeNode(staticList s_link_list, int index)
{
	//[0].next始终指向备用链表的第一个结点,所以将要释放的空间弄成空闲空间就可以了
	s_link_list[index].next = s_link_list[0].next;
	//头结点的next指向index结点,表示index结点空闲
	s_link_list[0].next = index;
	s_link_list[index].data.id = -1;
	s_link_list[index].data.name = NULL;
}

//删除结点
void DeleteNode(staticList s_link_list, int pos)
{
	//获得头结点
	int for_ward_index = MAX_SIZE - 1;

	if (pos > GetListLength(s_link_list) + 1 || pos < 1)
	{
		printf("删除位置错误,删除失败\n");
		return;
	}
	//获得要删除的节点的前驱结点
	for (int i = 1; i <= pos-1 ; i++)
	{
		for_ward_index = s_link_list[for_ward_index].next;
	}
	//找到要删除的节点的下标
	int del_index = s_link_list[for_ward_index].next;
	//删除结点(画图看)
	s_link_list[for_ward_index].next = s_link_list[del_index].next;
	//释放空间
	FreeNode(s_link_list, del_index);


}

int main(void)
{
	staticList sll;
	InitStaticList(sll);

	PrintfStaticList(sll);

	Data da1;
	da1.id = 1;
	da1.name = "圣三一";

	InsertNode(sll, 1, da1);
	PrintfStaticList(sll);

	Data da2;
	da2.id = 1;
	da2.name = "三位一体";

	InsertNode(sll, 2, da2);
	PrintfStaticList(sll);

	Data da3;
	da3.id = 1;
	da3.name = "三一神";

	InsertNode(sll, 2, da3);

	PrintfStaticList(sll);

	int len = GetListLength(sll);

	DeleteNode(sll, 2);
	PrintfStaticList(sll);

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值