建立
为了模拟链表的操作,设置了一个date(数据)以及cur(相当于指针域)
typedef struct
{
int date;
int cur;
}list;
list s[size];//size为数组大小
我们用s[size-1].cur来起头指针的作用,指向链表的第一个元素的下标。
因为不能直接malloc出来一个空间,需要s[0]来保存一个空的数组下标即备用空间,方便使用。
int initlist(list *s) //数组初始化
{
int i;
for (i = 0; i < size - 1; i++)
{
s[i].cur=i+1;
}
s[size - 1].cur = 0; //相当于链表中head->netx=NULL;
return 1;
}
当s[size-1].cur=0时可以知道静态链表为空
增
如果我们需要把一个数据插入到第i位,回想一下链表的操作,需要分配一个新的空间,以及找到i-1位。
int mymalloc(list *s) //分配空间
{
int i = s[0].cur; //取出备用空间
if (s[0].cur!=size-1) //判断数组是否还有空间
{
s[0].cur = s[i].cur; //跟新备用空间
return i;
}
return 0;
}
int listinset(list *s,int i,int d) //数据插入(数组,位置,数据)
{
int j, l,k;
k = size - 1;
if (i<1 || i>listlen(s) + 1) //判断输入
return 0;
j = mymalloc(s);
s[j].date = d;
if (j)
{
for (l = 1; l < i; l++)
{
k = s[k].cur;
}
s[j].cur = s[k].cur; //相当于p->netx=q->netx;
s[k].cur = j; //q->netx=p;
return 1;
}
return 0;
}
删
删除第i位,想一下链表的操作,需要找到第i-1位,需要释放第i位的空间。
void myfree(list*s,int j) //释放空间
{
s[j].cur = s[0].cur;
s[0].cur = j; //将备用空间与新释放的空间连起来
}
int listdel(list*s,int i)
//删除某个位置的数据并返回删除数据的值
{
int k,l,j,e;
if(i<1||i>listlen(s))
return 0;
k=size-1;
for (l = 1; l < i; l++)
{
k = s[k].cur;
}
j = s[k].cur; //j为第i位的下标
e = s[j].date;
s[k].cur = s[j].cur;
myfree(s,j);
return e;
遍历
void printf_1(list*s)
{
int i = s[size - 1].cur;
while (s[i].cur)
{
printf("%d %d\n",s[i].date,s[i].cur);
i = s[i].cur;
}
printf("%d %d\n", s[i].date, s[i].cur);
}
最后
与链表相比,没有解决表长难以确定的问题。
以上全为个人理解,有错误请指出