C数据结构与算法-基础整理-线性表-04:静态链表

0x01.理解静态链表

静态链表其实就是用数组的方式实现一个链表,静态链表有以下约定。

  • 每一个元素的游标域存储着下一个元素的下标
  • 最后一个元素的游标为0
  • 0号元素存储着备用链表的第一个元素的下标
  • 备用链表就是静态链表中没被使用过的元素
  • 每次增加结点,使用模仿的malloc函数,找到备用链表的一个结点
  • 每次删除结点,使用模仿的free函数,将这个结点放入备用链表

优点:

  • 插入删除元素不需要移动大量下标
  • 使得没有指针的语言能够实现链表

缺点:

  • 没有解决表长难以确定的问题
  • 失去了顺序存储结构随机存储的特性

0x02.结构

#define MAXSIZE 50
typedef struct
{
	int data;
	int cur;//游标
}StList,List[MAXSIZE];

0x03.初始化

//初始化静态链表
void IniList(List list)
{
	int i;
	for (i = 0; i < MAXSIZE - 1; i++)//每一个元素的游标存储着下一个元素的下标
	{
		list[i].cur = i + 1;
	}
	list[MAXSIZE - 1].cur = 0;
}

0x04.malloc函数

//返回分配结点的下标
int Malloc_SList(List list)
{
	int i = list[0].cur;//第一个结点存放着备用链表的第一个结点
	if (list[0].cur)
	{
		list[0].cur = list[i].cur;//更新备用链表的第一个结点
	}
	return i;
}

0x05.free函数

void Free_SSL(List L, int k)
{
	L[k].cur = L[0].cur;
	L[0].cur = k;//更新备用链表第一个元素
}

0x06.求静态链表长度

//返回L中的数据元素个数
int ListLength(List L)
{
	int j = 0;
	int i = L[MAXSIZE - 1].cur;
	while (i)
	{
		i = L[i].cur;
		j++;
	}
	return j;
}

0x07.增

//在静态链表中第i个元素之前插入元素e
int Insert(List L,int i,int e)
{
	int j, k, l;
	k = MAXSIZE - 1;//最后一个元素的下标
	if (i<1||i>ListLength(L))
	{
		return false;
	}
	j = Malloc_SList(L);
	if (j)
	{
		L[j].data = e;
		for (l = 1; l <= i - 1; l++)
		{
			k = L[k].cur;//寻找第i个元素之前的位置
		}
		L[j].cur = L[k].cur;//把第i个元素之前的游标给新元素
		L[k].cur = k;//把新元素的下标给第i个元素之前的元素
		return true;
	}
	return false;
}

0x08.删

int ListDelete(List L, int i)
{
	int j, k;
	if (i<1 || i>ListLength(L))
	{
		return false;
	}
	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_SSL(L, j);
	return true;
}
发布了50 篇原创文章 · 获赞 35 · 访问量 1287

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/104475381