c语言实现静态链表的基本操作

简单的用c/c++语言实现了静态链表的基本操作,其中,删除后的节点用wait变量简单保存,且只保存一个,思想明白了就好,读者可以自己试试用备用链表来保存未被使用的以及被删除的节点,以供下次使用。
#include<stdio.h>
#include<stdlib.h>

#define Max 100

//记录静态链表使用的总长度
int leng = 0;
//保存一次删除的节点,供下次增加节点时使用
int wait = 0;

struct SLinkList
{
	char data;
	int cur;
};

void InitSlink(SLinkList *slink)
{
	int num,i;

	printf("输入初始化人数:");
	scanf("%d",&num);
	getchar();

	slink[0].cur = 1;
	for(i=1;i<=num;i++)
	{
		printf("输入数据:");
		slink[i].cur = i+1;
		scanf("%c",&slink[i].data);
		getchar();
		leng++;
	}
	slink[i-1].cur = 0;//最后一个数据的游标置为0,表示为空指针
}

void Insert(SLinkList *slink)
{
	int position;
	printf("输入插入位置:");
	scanf("%d",&position);
	getchar();

	//找到插入的前驱
	int i=0,k=0;
	while(slink[i].cur != 0 && k < position-1)
	{
		i = slink[i].cur;
		k++;
	}

	int save = slink[i].cur;
	printf("输入插入的数据:");
	if(wait != 0)
	{
		slink[i].cur = wait;
		slink[wait].cur = save;
		scanf("%c",&slink[wait].data);
		getchar();
		wait = 0;
 	}
	else
	{
		slink[i].cur = leng + 1;
		slink[leng+1].cur = save;
		scanf("%c",&slink[leng+1].data);
		getchar();
		leng++;
	}
}

void Delete(SLinkList *slink)
{
	int position;
	printf("输入删除位置:");
	scanf("%d",&position);
	getchar();

	//找到删除的前驱
	int i=0,k=0,j;//j保存i的前一个值
	while(slink[i].cur != 0 && k < position-1)
	{
		j= i;
		i = slink[i].cur;
		k++;
	}

	int poi = slink[i].cur;
	if(poi != 0)
	{
		slink[i].cur = slink[poi].cur;
		wait = poi;
	}
	else//前一个数据的cur设为0
	{
		slink[j].cur =  poi;
		wait = 1;
	}
}

void Output(SLinkList *slink)
{
	printf("\n静态链表中含有的数据如下:\n");
	int i=slink[0].cur;
	
	while(i != 0)
	{
		printf("序号:%d 数据为:%c cur为:%d\n",i,slink[i].data,slink[i].cur);
		i = slink[i].cur;
	}
	printf("长度为:%d\n",leng);
}

void menu()
{
	printf("****************\n");
	printf(" * 1--初始化\n");
	printf(" * 2--添加数据\n");
	printf(" * 3--删除数据\n");
	printf(" * 4--查看数据\n");
	printf(" * 0--退出\n");
	printf("****************\n");
}

int main()
{
	SLinkList Slink[Max];

	int choose;
	do
	{
		menu();
		printf("输入您的选择:");
		scanf("%d",&choose);
		getchar();
		switch(choose)
		{
		case 1:
			InitSlink(Slink);
			break;
		case 2:
			Insert(Slink);
			break;
		case 3:
			Delete(Slink);
			break;
		case 4:
			Output(Slink);
			break;
		case 0:
			break;
		}
	}while(choose != 0);
	

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值