线性表——静态链表的魅力 (初始化,插入,删除)

1.线性表的静态链表的存储结构

#include <stdio.h>
#define ListSize 100
typedef int ElemType;


typedef struct {
	ElemType data;//数据
	int cur;//游标
}Component, SLinkList[ListSize];

2.静态链表初始化

int InitSList(SLinkList L)
{
	int i;
	for ( i = 0; i < ListSize-1; i++)
	{
		L[i].cur = i + 1;
	}
	L[ListSize - 1].cur = 0;
	return 1;
}

3.分配结点
在这里插入图片描述

int Malloc_SLL(SLinkList L)
{
	int i;
	i = L[0].cur;
	if (L[0].cur) {
		L[0].cur = L[i].cur;//把它的下一分量用来作为备用
	}
	return i;
}

4.回收结点

void FreeNode(SLinkList L, int pos)
{
	L[pos].cur = L[0].cur;
	L[0].cur = pos;
}

5.求静态链表中元素个数,不包括头尾节点

int ListLength(SLinkList L)
{
	int i = L[ListSize - 1].cur;
	int j = 0;
	while (i)
	{
		j++;
		i = L[i].cur;
	}
	return j;
}

6.插入操作
在这里插入图片描述

int ListInsert(SLinkList L,int i,ElemType e)
{
	int j, k, l;
	k = ListSize - 1;//数组的最后一个元素
	if (i<1||i>ListLength(L)-1) {
		return 0;
	}
	j = Malloc_SLL(L);//获得空闲分量的下标
	if (j) {
		L[j].data = e;
		for ( l = 1; l < i-1; l++)//找到第i个元素之前的位置
		{
			k = L[k].cur;
		}
		L[j].cur = L[k].cur;
		L[k].cur = j;
		return 1;
	}
	return 0;

}

在这里插入图片描述
在这里插入图片描述
7.删除在L中的第i个数据元素
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时c处于备用链表,当垃圾清理掉了。

int  ListDelete(SLinkList L, int i)
{
	int j, k;
	if (i<1 || i>ListLength(L))
	{
		return 0;
	}
	k = ListSize - 1;
	for ( j = 0; j < i-1; j++)
	{
		k = L[k].cur;
	}
	j = L[k].cur;
	L[k].cur = L[j].cur;
	FreeNode(L,j);
	return 1;
}

8.输出静态链表中的数据

void PrintDList(SLinkList L, int i)
{
	int j, k;
	k = L[0].cur;
	for ( j = 0; j <=i; j++)
	{
		printf("%4c",L[k].data);
		k = L[k].cur;
	}
	printf("\n");
}

9.操作台

int main()
{
	SLinkList L;
	int i, len;
	int pos;
	char e;
	ElemType a[] = {'a','b','c','d','e','f','g','i'};
	len = sizeof(a) / sizeof(a[0]);
	InitSList(L);
	for ( i = 1; i < len; i++)
	{
		ListInsert(L,i,a[i-1]);
	}
	printf("静态链表:");
	PrintDList(L,len);
	printf("要插入的元素及位置:");
	scanf("%c",&e);
	getchar();
	scanf("%d",&pos);
	getchar();
	ListInsert(L,pos,e);
	printf("插入元素后静态链表:");
	PrintDList(L,len+1);
	printf("要删除元素的位置:");
	scanf("%d",&pos);
	getchar();
	ListDelete(L,pos);
	printf("删除的元素是:");
	printf("%c\n",L->data);
	printf("删除元素后静态链表:");
	PrintDList(L,len);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值