静态链表:使用数组这一数据类型申请到一个有限存储空间
静态链表的组成:数据+游标
游标:用来存放下一个结点在数组中的位置
因为创建数组的时候元素的位置随机分配,所以需要用游标来记录位置信息——因此静态链表的结点既有自己的数据部分还有用来存储下一个结点位置的游标。
①当静态链表为 空 的时候:最后一个元素的cur为0。L[999].cur=0
②当静态链表为 非空的时候:最后一个元素的cur是用来存放第一个元素的下标,通常为1。L[999].cur=1
//静态链表的插入
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000
//因为静态链表有两个一个数据data一个游标
struct JingTai
{
int data;
int cur;
};
int Malloc(struct JingTai *L);
int Length(struct JingTai *L);
void InitList(struct JingTai *L);
bool ListInsert(struct JingTai *L,int i,int e);
void TraveList(struct JingTai *L);
int main()
{
struct JingTai L[MAXSIZE];
int i,e;
InitList(L);
ListInsert(L,i,e);
ListInsert(L,i,e);
ListInsert(L,i,e);
ListInsert(L,i,e);
TraveList(L);
system("pause");
return 0;
}
void InitList(struct JingTai *L)
{
/*两部分一个是静态链表一个是备用链表*/
L[MAXSIZE-1].cur=0;
L[MAXSIZE-2].cur=0;
int i =1;
L[0].cur=1;
while(i<MAXSIZE-2)
{
L[i].cur=i+1;
i++;
}
}
bool ListInsert(struct JingTai *L,int i,int e)//需要操作的链表,插入的位置,插入的元素值。
{
printf("请输入插入元素的位置:\n");
scanf("%d",&i);
printf("请输入元素的值\n");
scanf("%d",&e);
//判断插入的位置i 是否超过静态链表的大小
if(i<1||i>Length(L)+1)
{
printf("输入的位置有误\n");
return false;
}
int q;//使用一个数q用来记录备用链表的下标
int k;//K是最后一个下标,因为最后一个下标的游标为1,即L[999]=1,有了后面的循环 k=k[1].cur ->k=2; k=k[2].cur ->k=3.....
int j;
k=MAXSIZE-1;
for(j=1;j<i;j++)
{
k=L[k].cur;//完成的是游标的转移,比如说, L[1].cur=2,那么k就等于3,k=L[3].cur,就又完成了一次转移
}
q=Malloc(L);//分配区域的下标
L[q].data =e;//分配完空间后将数据e填进来
L[q].cur = L[k].cur;
L[k].cur=q;
return 0;
}
//用一个函数来判断静态链表L的长度
int Length(struct JingTai *L)
{
//计算表长就一个一个的数
int i=MAXSIZE-1;
int j=0;
while(L[i].cur)//这个游标的意思
{
i=L[i].cur;//获取游标
j++;
}
return j;
}
//分配区域 (因为是要找链表里面的备用链表所以参数是链表 )
int Malloc(struct JingTai *L)
{
int i;
i=L[0].cur;//返回的是分配的区域下标 ,备用链表的下标
//备用链表被用了之后,新的备用链表的游标就指向原来的备用链表的游标所指的下标->新游标=原来游标
L[0].cur =L[i].cur;
return i;
}
void TraveList(struct JingTai *L)
{
int i=MAXSIZE-1;
int j=0;
while(i)
{
if(j!=0)
{
printf("%d ",L[i].data);
}
i=L[i].cur;//不停地传递下去
j++;
}
}