#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000 //链表最大长度为1000
typedef struct {
int data;
int cur; //cursor,为0时表示无指向
}Component,StaticLinkList[MAXSIZE];
int InitList(StaticLinkList space);
int Malloc_SLL(StaticLinkList space);
int ListInsert(StaticLinkList L,int i,int e);
int ListDelete(StaticLinkList L,int i);
void Free_SSL(StaticLinkList space,int k);
int ListLength(StaticLinkList L);
int main()
{
int num;
StaticLinkList L;
InitList(L);
printf("请输入数字:");
for ( int i = 1; i < 7; i++)
{
scanf("%d",&num);
ListInsert(L,i,num);
}
printf("在第3个位置中插入数字66\n"); //插入之前必须删除该位置的元素
ListDelete(L,3);
ListInsert(L,3,66);
printf("静态链表中的数为:");
for ( int j = 1; j < 7; j++)
{
printf("%d\n",L[j].data);
}
system("pause");
return 0;
}
int InitList(StaticLinkList space) //静态链表初始化
{ //space[0].cur为头指针,“0”表示空指针
int i;
for ( i = 0; i < MAXSIZE-1; i++)
{
space[i].cur=i+1;
}
space[MAXSIZE-1].cur=0; //目前静态链表为空,最后一个元素的cur为0
return 0;
}
int Malloc_SLL(StaticLinkList space) //静态链表的空间分配
{
int i=space[0].cur; //当前第一个cur值,也是已经储存数据的长度
if (space[0].cur) //当第一个游标为非零值时,将下一个分量调用
{
space[0].cur=space[i].cur;
}
return i;
}
int ListInsert(StaticLinkList L,int i,int e)
{
int j,k,l;
k=MAXSIZE-1; //k是最后一个元素的下标
if (i<1||i>ListLength(L)+1)
{
return 1;
}
j=Malloc_SLL(L); //获得空闲分量的下标
if (j)
{
L[j].data=e; //将数据赋值给此分量的data
for (l = 1; l <= i-1; l++) //找到第i个元素之前的位置
{
k=L[k].cur;
}
L[j].cur=L[k].cur; //把第i个元素之前的cur赋值给新元素的cur
L[k].cur=j; //把新元素的下标赋值给第i个元素之前的元素cur
return 0;
}
return 1;
}
int ListDelete(StaticLinkList L,int i) //删除在L的第i个元素e
{
int j,k;
if (i<1||i>ListLength(L))
{
return 1;
}
k=MAXSIZE-1;
for ( j = 1; j <= i-1; j++)
{
k=L[k].cur;
}
j=L[k].cur;
L[k].cur=L[j].cur;
Free_SSL(L,j);
return 0;
}
void Free_SSL(StaticLinkList space,int k) //讲下标为k的结点回收到备用链表
{
space[k].cur=space[0].cur; //把第一个元素cur值赋值给要删除的元素cur
space[0].cur=k; //把要删除的分量下标赋值给第一个元素的cur
}
int ListLength(StaticLinkList L) //返回L中数据元素的个数
{
int j=0;
int i=L[MAXSIZE-1].cur;
while (i)
{
i=L[i].cur;
j++;
}
return j;
}
静态链表
最新推荐文章于 2024-04-22 12:26:36 发布