using namespace std;
#include<iostream>
#define Max_size 100
#define OK 1
#define Error 0
typedef int Elemtype;
typedef struct StaticLinkNode
{
Elemtype date;
int cur;
}StaticLinkNode,StaticLinkList[Max_size];
/*静态链表,用数组来描述的链表,我们对数组的第一个
和最后一个元素不存数据,通常,我们把数组中未使用的
剩余空间称为备用链表。数组中,第一个元素,即下标为
0的cur空间存放备用链表的第一个元素的下标,最后一个
元素的cur存放第一个有数值的元素下标
*/
Elemtype InitList(StaticLinkList space)
{
int i;
for (i = 0; i < Max_size; i++)
{
space[i].cur = i + 1;//cur从1开始,而数组从0开始,故加1(数组下标0不存数据元素);
space[Max_size - 1].cur = 0;// 初始化不存在数据元素而规定数组的最后一个下标不存数据,
//存第一个数值所在的下标
return OK;
}
}//初始化静态链表的cur;
int Malloc_SSL(StaticLinkList space)//备用链表的非空
{
int i = space[0].cur;
if (space[0].cur)
{
space[0].cur = space[i].cur;
/* 经过此过程,就拿出此元素要使用了,
备用链表的第一个空间就存在数值了,
把原本第二个的备用链表的空间作为
第一个,故要更新space[0].cur. */
}
return i;
}//此方法为后续的插入操作完成了部分工作,
//后续的方法只需调用就可以了。
void Free_SSL(StaticLinkList space, int k)
{
space[k].cur = space[0].cur;//将备用链表的原第一个位置给space[k].cur,使被删除元素为备用链表的第一个位置。
space[0].cur = k;//删除元素的那个位置就为备用链表的第一个位置。
}
int ListLength(StaticLinkList space)
{
int j=0;//计数器,统计元素数目
int i = space[Max_size-1].cur;
while (i)
{
i = space[i].cur;
j++;
}
return j;
}
Elemtype StaticLinkListInster(StaticLinkList space, int i, Elemtype e)//i为插入的位置,e为date的值
{
int j, k, l;
k = Max_size - 1;
if (i<1 || i>ListLength(space) + 1)//ListLength(L)用来计算链表的长度,因为有新加入的元素,故加1;
{
return Error;
}
j = Malloc_SSL(space);//找出已分配好的空间下标
if (j)
{
space[j].date = e;
for (l = 1; l <= i - 1; l++)//for循环用来找出插入位置的前一位置的下标
{
k = space[k].cur;
}
space[j].cur = space[k].cur;//新加入元素的
space[k].cur = j;//新加入的元素在k(即i-1)之后,将插入位置前一元素的cur更新为新加入元素在数组中的下标。
return OK;
}
return Error;
}
Elemtype ListDelete(StaticLinkList L, int i)
{
int j, k;
if (i<1 || i>ListLength(L))
{
return Error;
}
k = Max_size - 1;
for (j = 1; j <= i - 1; j++)//与上述一样,找出待删除前一位置的下标
{
k = L[k].cur;
}
j = L[k].cur;//j为删除元素的下标
Free_SSL(L, j);
return OK;
}
int main()
{
return 0;
}