#include "stdio.h"
#define MAXSIZE 100
/**
静态链表:
在C语言之前,如Basics、Fortran等早期的编程高级语言,由于没有指针,链表没法是实现
有人想出用数组来代替链表
首先让数组的元素怒都是由两个数据与组成 data 和 cur
数据域data 用来存放数据元素
游标 cur等同于单链表的next指针,存放钙元素的后继在数组中的下标
这种用数组描述的链表叫做: 静态链表
**/
typedef struct
{
int data;
int cur;//游标,为0是表示无指向
}StaticLinkList[MAXSIZE];
void InitList(StaticLinkList space);
int Malloc_SLL(StaticLinkList space);
int ListInsert(StaticLinkList L,int i,int e);
int ListDelete (StaticLinkList L,int i,int *pVal);
void Free_SSL(StaticLinkList space,int j);
int ListLength(StaticLinkList L);
void Show(StaticLinkList L);
/*初始化*/
/*将一位数组space中个分量链成以备用链表*/
/*space[0].cur为头指针,"0"表示空指针 */
void InitList(StaticLinkList space)
{
int i;
for (i=0;i<MAXSIZE - 1 ;++i )
{
space[i].cur = i+1;
}
space[MAXSIZE-1].cur = 0;//目前静态链表为空,最后一个元素的cur为空
return ;
}
/*分配空间*/
//若备用空间链表非空,则返回分配的节点下标,否则返回0
//注:space[0]不保存数据,保存数据是从space[1]开始,space[0]保存下一个空的位置
int Malloc_SLL(StaticLinkList space)
{
int i = space[0].cur;//当前数组的第一个元素的cur村的值,就是要返回的第一个备用空闲的下标
if(space[0].cur)
space[0].cur = space[i].cur;//拿出一个分量使用,把space[i]的下一个分量(即下一个空位置)作为备用
return i;//返回分配的结点下标
}
/*插入数据*/
//在L中的第i个位置插入新的数据元素
int ListInsert(StaticLinkList L,int i,int e)
{
int j,k,l;
k = MAXSIZE - 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++)
k= L[k].cur;//不断循环得到第i-1个数据的下标
L[j].cur = L[k].cur;//先把当前第i-1数据游标的所指向的位置的下标(即第i个位置)保存到当前插入数据的L[j].cur上
L[k].cur = j; //然后改变L[k].cur
return 1;
}
return 0;
}
/*删除在L中第I个数据元素e*/
int ListDelete (StaticLinkList L,int i,int *pVal)
{
int j,k;
if (i<1||i>ListLength(L))
{
return 0;
}
k = MAXSIZE -1;
for(j=1;j<=i-1;j++)
{
k = L[k].cur;//得到第i-1个元素的下标
}
j= L[k].cur;//得到第i个元素的下表保存到j
*pVal =L[j].data;//保存第i个元素的值
L[k].cur = L[j].cur;//把第i+1的下标赋给第i的下标
Free_SSL(L,j);
return 1;
}
//将下标为j的空闲结点回收到备用链表中
void Free_SSL(StaticLinkList space,int j)
{
space[j].cur = space[0].cur;
space[0].cur = j;
}
//保存的元素个数,即为静态链表的长度
int ListLength(StaticLinkList L)
{
int j = 0;
int i = L[MAXSIZE-1].cur;
while(i)
{
i = L[i].cur;
j++;
}
return j;
}
//打印所有元素的数据
void Show(StaticLinkList L)
{
int k = MAXSIZE -1;
int i=L[k].cur;
while(i!=0)
{
printf("%d\n",L[i].data);
i = L[i].cur;
}
}
void main()
{
StaticLinkList L;
InitList(L);
int val;
ListInsert(L,1,1);
ListInsert(L,1,2);
ListInsert(L,1,3);
ListInsert(L,1,4);
ListInsert(L,1,5);
printf("删除前:静态链表中所有元素的值:\n");
Show(L);
ListDelete(L,1,&val);
printf("删除第1个位置的元素:%d\n",val);
printf("删除之后:静态链表中的所有值:\n");
Show(L);
}
数据结构 链表(静态链表)
最新推荐文章于 2020-03-29 11:10:45 发布