数组模拟链表(静态链表)

建立

为了模拟链表的操作,设置了一个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);
}

最后

与链表相比,没有解决表长难以确定的问题。
以上全为个人理解,有错误请指出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值