线性表(3)--静态链表

/*
静态链表
1.利用连续的静态存储空间模拟实现链表的操作
2.建立数据链表,利用游标作为指针,指向下一元素存储位置,L[Max-1].cur为头指针,指向第一个数据元素 
3.建立空闲结点链表,利用游标作为指针,指向下一空闲结点位置,L[0].cur为头指针,指向第一个空闲结点所在位置 
4.l[0].data不存放数据
5.l[Max-1].data存放链表元素个数 
*/ 
#include<stdio.h>
#include<stdlib.h> 
#define Max 10
typedef struct Node
{
	int data;//数据 
	int cur;//游标 
}SLink[Max];
void InitSLink(SLink L)//初始化静态链表 ,L[0]存放空闲链表头指针,L[Max-1]存放第一个元素存储位置 
{
	for(int i=0;i<Max-1;i++)
	{
		L[i].cur=i+1;
		L[i].data=0;
	}
	L[Max-1].cur=0;
	L[Max-1].data=0;
}
int malloc_sl(SLink l)//分配空闲结点 
{
	int p=l[0].cur;//获取第一个空闲结点所在位置
	if(p!=Max-1)//当l[0].cur指向Max-1说明链表已满 
	{
		l[0].cur=l[p].cur; //L[0].cur指向第二个空闲结点 
	}
	else
	{
		printf("链表已满!!\n");
		exit(0);//链表已满,退出程序 
	}
	return p;
}
void InsertSLink(SLink L,int i,int e)
{
	int k=Max-1,j=1; //L[Max-1]为元素链表的头指针 
	if(i<=0||i>Max) 
	{
		printf("插入位置不合法!!\n");
		return ;
	}
	while(j<i)//从头指针开始,寻找第i-1个元素 
	{
		k=L[k].cur;
		j++;
	}
	//插入
	int p=malloc_sl(L);//分配空闲结点 
	L[p].data=e;//插入数据 
	L[p].cur=L[k].cur;//使第i-1指向当前区域 
	L[k].cur=p; //当前区域指向i 
	L[Max-1].data++;
} 
void DeleteSLink(SLink l,int i)
{
   if(i<0||i>l[Max-1].data)
   {
      printf("删除位置不合法!\n");
	  return ; 	
   }	
   int k=Max-1,j=1;
   while(j<i)//寻找第i-1个结点 
   {
   	  k=l[k].cur;
   	  j++;
   }
   int p=l[k].cur;
   //使第i-1个结点指向第i+1个结点 
   l[k].cur=l[p].cur; 
   //把第i个结点归并到空闲链表
   l[p].cur=l[0].cur;
   l[p].data=0;//数据置0 
   l[0].cur=p;
   l[Max-1].data--; //元素个数减一 
} 
void print(SLink l)
{
   int i;
   printf("后继为:");
   for(i=0;i<10;i++)
   {
      printf("%3d ",l[i].cur);
   }
   printf("\n元素为:"); 
   for(i=0;i<10;i++)
   {
      printf("%3d ",l[i].data);	
   }
   printf("\n下标为:");	
   for(i=0;i<10;i++)
   {
   	printf("%3d ",i);
   }
   printf("\n");
} 
int main()
{
	SLink l;
	InitSLink(l);
	int n,a;
	printf("输入插入元素个数:"); 
	scanf("%d",&n); 
	for(int i=1;i<=n;i++)
	{
	//	scanf("%d",&a);
		InsertSLink(l,i,i);
	}
	print(l);
	while(1)
	{
	  printf("1.插入元素\n2.删除元素\n");
	  scanf("%d",&n);
	  if(n==1)
	  {
	  	printf("输入插入位置及元素:");
	    scanf("%d %d",&a,&n);
	    InsertSLink(l,a,n);
	  } 
	  else
	  {
	  	printf("输入删除元素位置:");
	  	scanf("%d",&a);
	  	DeleteSLink(l,a);
	  }
	  print(l);
	}
	print(l);
}

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值