用数组实现单链表(静态链表)(C语言)

1.我们先创建两个数组,一个用来存储当前结点的值,一个用来存储下一个结点的位置。(为了方便,将数组开在全局当中)

#define N (int)1e5+5
int e[N],ne[N];

2. 创建两个变量,一个用来存储头结点的位置(head),一个用来记录当前用到数组的哪个下标(index)并完成初始化。

int head = -1,index = 0;
  1. 开始写有关链表的操作。

(1)将一个值插入到头结点

void add_head()
{
    e[index] = x;//在当前位置保存该值
    ne[index] = head;//指向之前的头结点
    head = index;//变更头结点
    index++;//下标后移
}

(2)将一个值插入到下标为id的后面

void add_to(int id, int x)
{
    e[index] = x;
    ne[index] = ne[id];//让新节点指向id指向的结点
    ne[id] = index;//id指向新节点
    index++;//下标后移
}

(3)将下标为id 后面的一个点删除

void remove_to()
{
    ne[id] = ne[ne[id]];
}

(4)删除头结点

void remove_head()
{
    head = ne[head];
}

来看道题:

输入样例:
10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6
输出样例:
6 4 6 5

代码:

#include <stdio.h>
#define N (int)1e5+5
//e[N]存储值,ne存储下一个值的位置,index是当前数组的下标,head是头结点的下标
int e[N],ne[N],index = 0,head = -1;//赋值时已初始化

void add_head(int x)//将x插入到头结点
{
    e[index] = x;
    ne[index] = head;
    head = index;
    index++;
}
void add_to(int id,int x)//在下标为id的后面插入x
{
    e[index] = x;
    ne[index] = ne[id];
    ne[id] = index;
    index++;
}
void remove_to(int id)//将下标为id后面的值删除
{
    ne[id] = ne[ne[id]];
}
void remove_head()//删除头结点
{
    head = ne[head];
}
int main()
{
    int m = 0;
    scanf("%d",&m);
    getchar();
    while(m--)
    {
        char op = 'a';
        int k = 0,x = 0;
        scanf("%c",&op);
        if(op=='H')
        {
            scanf("%d",&x);
            getchar();
            add_head(x);
        }
        else if(op=='D')
        {
            scanf("%d",&k);
            getchar();
            if(k) remove_to(k-1); 
            else remove_head();
        }
        else
        {
            scanf("%d%d",&k,&x);
            getchar();
            add_to(k-1,x);
        }
    }
    for(int i = head;i!=-1;i = ne[i])
    {
        printf("%d ",e[i]);
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值