数据结构学习第二天

静态链表的实现(用一维数组描述链表)

数据类型

typedef struct {
	ElemType data;	//数据
	int cur;		//下标 链表的顺序存储(一维数组描述链表)
}component,SLinkList[MAXSIZE];

静态链表和普通链表所不同的是需要用户自定义malloc和free这两个函数。。

//在备用链表中取出一个节点使用
int Malloc_SL(SLinkList space)
{
	//将可以使用的链表的空间下标返回
	int i = space[0].cur;
	if (i)
	{
		space[0].cur = space[i].cur;
	}
	return i;
}
//将该节点回收备用链表
void Free_SL(SLinkList space, int k)
{
	//将下标为k的空闲节点回收备用链表
	space[k].cur = space[0].cur;
	space[0].cur = k;
}

上述两个函数描述了两个链表(一个是备用链表一个使用中的链表)使用游标cur(指示器)代替指针只是结点在数组中的想对位置。。。

数据结构学习第二天

添加数据:只需要改变游标值不需要移动位置:

//在指定位置插入元素
Status Insert_SL(SLinkList L,int pos, ElemType e)
{
	/*if (pos < 0 || pos > getLenghtSL(L)+1)
	{
		return ERROR;
	}*/
	// 找到要插入指定位置的地址
	int i = 0;
	int k = MAXSIZE - 1;
	int j = Malloc_SL(L);
	//首先要有元素
	if (j)
	{
		for (i = 1; i < pos; i++)
		{
			//遍历查找(k这里相当于指针)
			k = L[k].cur;
		}

		//插入元素
		L[j].data = e;
		L[j].cur = L[k].cur; //把最后一个位置永远的往后移动(理解)
		L[k].cur = j;
		
		return  OK;
	}
	
	return ERROR;
}

删除元素:原理和添加元素一样(改变游标的位置):

//删除元素并返回被删除元素
void Del_SL(SLinkList L,int pos ,ElemType *e)
{
	//删除第i个元素
	//if (pos < 1 || pos > getLenghtSL(L))
	//{
	//	return ERROR;
	//}
	int i = 0;
	int j = L[MAXSIZE - 1].cur;
	for (i = 1; i < pos; i++)
	{
		j = L[j].cur;
	}
	int k = L[j].cur;
	//删除j节点
	*e = L[j].data;
	L[j].cur = L[k].cur;
	Free_SL(L,k);
}

数据结构学习第二天

静态链表必要的其他操作:

//初始化
void InitSpace_SL(SLinkList space)
{
	//将一维数组转化为链表
	//0 表示空指针

	int i = 0;
	for (i = 0; i < MAXSIZE-2; i++)
	{
		space[i].cur = i + 1;
	}

	space[MAXSIZE - 1].cur = 0;//0表示NULL
	space[MAXSIZE - 2].cur = 0;
}

//打印数据
void print_Sp(SLinkList space)
{
//将数组初始化为一个备用链表 space[0]为头指针
int k = MAXSIZE - 1;
while (space[k].cur)
{
k = space[k].cur;
printf("%d:%d ", space[k].data,space[k].cur);
}

}

 测试数据:

Status main()
{
	int i = 0;
	//数组转换为链表	
	SLinkList  space;
	ElemType e;
	InitSpace_SL(space);
	printf("表长:%d \n", getLenghtSL(space));

	Insert_SL(space,1,100);
	Insert_SL(space,2,200);
	Insert_SL(space,3,300);
	Insert_SL(space,4,400);
	Insert_SL(space,5,500);
	printf("表长:%d \n", getLenghtSL(space));
	
	print_Sp(space);
	printf("\n");

	Del_SL(space, 2, &e);
	printf("删除%d\n", e);

	print_Sp(space);
	printf("\n");

	system("pause");
	return OK;
}

  

 

上一篇:静态链表 C++版


下一篇:zsh: abort