/*
静态链表
要点:
mylist[]中第一个和最后一个不使用(即是不用来储存数据),mylist[0]储存备用链表第一个元素
mylist[maxsize-1]储存备用链表第一个储存数据得结点,即是首结点
然后静态表表最后一个结点的cur等于0
*/
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<stdlib.h>
#include<cmath>
#define OK 1
#define ERROR 0
#define maxsize 1000
bool flag=true;
using namespace std;
typedef int status;
typedef int ElemType;
typedef struct List
{
ElemType data;//储存数据
int cur;//储存游标(cursor)
} Conponent,mylist[maxsize];
status initList(mylist &L)
{
int i;
for(i=0; i<maxsize-1; i++)
L[i].cur=i+1;//这样是使链表空间连起来,方彪以后的插入和删除
L[maxsize-1].cur=0;//首结点下标为0说明链表为空
return OK;
}
int getlength(mylist L)
{
int i=0,j,k;
k=L[maxsize-1].cur;
while(k)
{
i++;
k=L[k].cur;
}
return i;
}
status insertList(mylist &L,int x,ElemType e)
{
int i,j,k;
k=L[maxsize-1].cur;
//这里flag是全局变量,因为第一次插入该链表时,情况有点特殊,所以用flag来判断是否是首次插入
if(flag) {
L[maxsize-1].cur=1;
L[1].cur=0;//首次插入结点为下标1的结点,将其cur赋为0
L[1].data=e;
L[0].cur=2;
flag=false;
return OK;
}
else
{
if(x<1||x>getlength(L)+1)//这里很重要,因为我们插入规定插到第x个位置前,所以x的值可能比getlength(L)大
return ERROR;
j=L[0].cur;
L[0].cur=L[j].cur;
L[j].data=e;//以上这三句是在设置保存插入值e的空间
i=1;
while(i<=getlength(L)&&i<x-1)
{
k=L[k].cur;
i++;
}
if(i>getlength(L))return ERROR;//以下是将保存了e的空间与链表关联起来
L[j].cur=L[k].cur;
L[k].cur=j;
}
return OK;
}
status deleteList(mylist &L,int x)
{
int i,j,k;
k=L[maxsize-1].cur;
if(x<1||x>getlength(L))//对比以上插入操作,这里x最大为getlength(L)
return ERROR;
if(x==1)//删除首结点情况特殊需要单独判断
{
j=L[maxsize-1].cur;
L[maxsize-1].cur=L[j].cur;
L[j].cur=L[0].cur;
L[0].cur=j;
return OK;
}
else {
i=1;
while(i<=getlength(L)&&i<x-1)
{
k=L[k].cur;
i++;
}
if(i>getlength(L))return ERROR;
j=L[k].cur;
L[k].cur=L[j].cur;
L[j].cur=L[0].cur;
L[0].cur=j;
return OK;
}
}
status traverseList(mylist L){
int i=0,j,k;
k=L[maxsize-1].cur;
while(k)
{
printf("%d ",L[k].data);
k=L[k].cur;
}
printf("\n");
return OK;
}
int main()
{
int i,j,k;
mylist L;
initList(L);
for(i=1;i<10;i++)
insertList(L,i,i);
traverseList(L);
deleteList(L,1);
traverseList(L);
deleteList(L,2);
traverseList(L);
deleteList(L,3);
traverseList(L);
insertList(L,3,100);
deleteList(L,2);
traverseList(L);
printf("%d\n",getlength(L));
return 0;
}