/*
静态链表
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);
}
运行结果: