0.说明
最后一个游标为第一个有数据元素的下标
第一个游标为第一个没有元素的下标
其他游标为下一元素的下标
第一个和最后一个不存放数据
1.初始定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 10
typedef int Status;
typedef int ElemType;
//变量定义
typedef struct{
ElemType data;//数据
int cur;//游标
}Component,StaticLinkList[MAXSIZE];
2.创建空表
Status InitList(StaticLinkList &space){//初始化 建立空的静态链表
for(int i = 0;i<MAXSIZE-1;i++){ //循环初始化
space[i].cur = i+1; //设置游标为下一元素的下标
}
space[MAXSIZE-1].cur = 0; //最后一个游标为0
return OK;
}
3.获取使用长度
int ListLength(StaticLinkList space){//获取使用长度
int j = 0;
int i = space[MAXSIZE-1].cur; //获得第一个数据的下标
while(i){ //因为设置最后一个有数据元素的游标为0,所以当i!=0时 进行计数
i = space[i].cur;
j++;
}
return j; //返回静态链表使用长度
}
4.添加数据
Status AddElem_1(StaticLinkList &space){//添加数据1
while(1){
scanf("%d",&space[ListLength(space)+1].data); //将数据输入到数组下标为长度+1的位置
if(space[ListLength(space)+1].data == 0){ //输入0结束
break;
}
space[ListLength(space)+1].cur = 0; //设置当前即最后一个元素的游标为0
if(ListLength(space)){//当长度不为0时 更改前元素的游标
space[ListLength(space)].cur = ListLength(space) + 1; //即将输入的前面的元素的游标改为当前最后一个元素的下标
}
if(ListLength(space)){ //第一元素的游标变为最后一个元素的下一元素的下标
space[0].cur = ListLength(space) + 1;//当前输入不是第一个元素时
}
else{
space[0].cur = ListLength(space) + 2;//当前输入为第一个元素时
}
space[MAXSIZE-1].cur = 1; //设置最后一个元素的游标为第一个含数据元素的下标 即1
}
return OK;
5.添加数据
Status AddElem_2(StaticLinkList &space){//添加数据2
while(1){
scanf("%d",&space[space[0].cur].data); //将数据加入到第一个没有数据的下标处
if(space[space[0].cur].data == 0){ //输入为0结束
break;
}
space[0].cur = space[space[0].cur].cur; //更改第一个不含数据的下标为最后输入元素的游标(即指向的下一元素的下标)
space[space[0].cur-1].cur = 0; //设置最后一个元素的游标为0
if(ListLength(space)){
space[space[0].cur-2].cur = space[0].cur-1; //将最后输入元素的上一元素的游标改为最后元素的下标
}
space[MAXSIZE-1].cur = 1; //设置最后的元素游标为1(即第一个含数据元素的下标)
}
return OK;
}
6.静态链表遍历
void PrintList(StaticLinkList space){//静态链表遍历
int ptr = 1; //初始下标为1
while(space[ptr].cur){ //当游标不为0时
printf("%2d ",space[ptr].data);//输出数据
ptr = space[ptr].cur; //将下标改为当前元素的游标(即下一元素的下标)
}
printf("%2d ",space[ptr].data);//最后输出一次数据
}
7.空间释放
void Free_SLL(StaticLinkList &space,int j){//静态链表释放空间
space[j].cur = space[0].cur; //将当前游标改为未使用的下一元素的下标
space[0].cur = j; //更改未使用的第一元素的下标为j
}
8.获得空闲分量
int Malloc_SLL(StaticLinkList space){//获得空闲分量的下标
int i = space[0].cur;
if(space[0].cur){
space[0].cur = space[i].cur;//更改space[0].cur存放的未使用的下标 (后移一位)
}
return i; //返回空闲分量的下标
}
9.查找操作
int LocateElem(StaticLinkList space,int e){//查找第1个值为e的元素 返回位序 没有则返回0 (返回的是数组的下标)
int i = space[MAXSIZE-1].cur; //设i为第一个数据的下标
while(i && space[i].data!=e){ //遍历查找
i = space[i].cur;
}
return i; //返回位序
}
10.插入操作
Status ListInsert(StaticLinkList &space,int i,int e){//静态链表插入 在第i个元素之前插入一个数据
int j,k,t;
k = MAXSIZE - 1;//数组的最后一个元素
if(i<1||i>ListLength(space)+1){ //非法
return ERROR;
}
j = Malloc_SLL(space);//j获取空闲分量下标
if(j){
space[j].data = e; //j!=0时
for(t = 1;t<=i-1;t++){ //遍历找到第i个元素前一元素的下标
k = space[k].cur;
}
space[j].cur = space[k].cur; //将游标设置为第i元素的下标
space[k].cur = j; //更改原第i元素的前一元素的游标为当前元素的下标
return OK;
}
return ERROR;
}
11.删除操作
Status ListDelete(StaticLinkList &space,int i,int &e){//静态链表删除第i个元素 用e返回其值(第i个元素不一定对应数组的下标为i)
int j,k;
if(i<1 || i>ListLength(space)){ //i值不合法
return ERROR;
}
k = MAXSIZE-1; //k为最后元素的下标
for(j=1;j<=i-1;j++){ //找出第i个元素的前一元素的下标
k = space[k].cur;
}
j = space[k].cur;//得到需要删除元素的下标
space[k].cur = space[j].cur;//改变删除前面元素的游标为删除后面元素的下标
e = space[j].data; //e返回其值
Free_SLL(space,j);//释放空间
return OK;
}
输入举例
输入4个数据 MAXSIZE = 7
游标:5 2 3 4 0 6 7 1
下标:0 1 2 3 4 5 6 7
——————END——————
作者注:
记录学习,分享经验。
有兴趣可以关注博主,以后还会持续更新内容哦~