版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z498596750/article/details/79277638
静态链表主要是为一些没有指针的高级开发语言而提供的。实现思路就是:创建一个数组,数组中的元素由两个属性组成,数据(data)、指针(cur)。指针指向下一个数组元素的下标。数组的第一个元素和最后一个元素不存放数据。数组之内除第一个数组元素,其余的数组空元素都被称为备用链表。数组的第一个元素的cur存放第一个备用链表的下标,数组的最后一个元素的cur存放第一个带有数据的数组元素的下标。在没有数据的数组中,最后一个数组元素的cur是0.
静态链表实现方法:
init()方法:让数组中元素的cur分别指向下一个数组元素。最后一个数组中的元素的cur指向0
(因为是空链表)。
setData()方法:让数组中的第一个元素的cur存放第一个备用链表的下标,让数组中含有数据的
最后一个元素的cur存放0。
getBtcur()方法:返回第一个备用链表的下标,并让数组中第一个元素的cur存放下一个备用链
表的下标。
insertEle()方法:通过getBtcur()方法拿到备胎的下标,将数据存入该下标所代表的数组元素
,定义一个变量用来存放数组最后一个元素的下标,循环,通过最后的这个元素的cur(也就是指针
)来找到要插入的地点的下标,将这个下标位置的数据元素的cur赋给备胎的cur,再把备胎的下标赋
给这个数据元素的cur。
freeNode()方法:将要删除的数组元素释放掉(就是将要删除的数组元素的cur指向数组第一个元
素的cur),变成备用链表,并让数组的第一个元素指向他。
deleteEle()方法:通过循环找到要删除的元素的前一个位置元素,让他直接指向要删除的元素的下
一个元素,并通过freeNode方法将要删除的元素变成备用链表。
#include <stdio.h>
#include <stdlib.h>
#define MAXLENGTH 100
typedef struct{
int data;
int cur;
}Component;
typedef Component StaticList[MAXLENGTH];
void init(StaticList arr){
int i=0;
for(i=0;i<MAXLENGTH;i++){
arr[i].cur=i+1;
}
arr[i].cur=0;
}
void setData(StaticList arr){
int i=0;
for(i=1;i<5;i++){
arr[i].data=i*2;
}
arr[0].cur=5;
arr[4].cur=0;
arr[99].cur=1;
}
int getBtcur(StaticList arr){
int i=arr[0].cur;
arr[0].cur=arr[i].cur;
return i;
}
void insertEle(StaticList arr,int ele,int index){
int i=getBtcur(arr);
arr[i].data=ele;
int k=MAXLENGTH-1;
//因为数组最后一个元素的cur是一,相当于头指针,
//这里循环的条件从链表的第一个数据开始到要插入的位置,让指针一直指向下一个cur
for(int j=1;j<index;j++){
k=arr[k].cur;
}
arr[i].cur=arr[k].cur;
arr[k].cur=i;
}
void freeNode(StaticList arr,int index){
arr[index].cur=arr[0].cur;
arr[0].cur=index;
}
void deleteEle(StaticList arr,int index){
int k=MAXLENGTH-1;
for(int i=1;i<index-1;i++){
k=arr[k].cur;
}
int j=arr[k].cur;
arr[k].cur=arr[j].cur;
freeNode(arr,j);
}
void main(){
StaticList arr;
init(arr);
setData(arr);
deleteEle(arr,4);
for(int i=0;i<MAXLENGTH;i++){
printf("%d ,%d\n",arr[i].data,arr[i].cur);
}
}