静态链表

本文深入讲解了静态链表的概念及其实现方式,介绍了如何使用数组替代指针来描述链表,详细阐述了静态链表的插入、删除操作,并提供了完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文字部分转载自:https://www.cnblogs.com/zhaoxy/p/7754906.html

静态链表

    对于没有指针的编程语言,可以用数组替代指针,来描述链表。让数组的每个元素由data和cur两部分组成,其中cur相当于链表的next指针,这种用数组描述的链表叫做静态链表,这种描述方法叫做游标实现法。我们对数组的第一个和最后一个元素做特殊处理,不存数据。让数组的第一个元素cur存放第一个备用元素(未被占用的元素)下标,而数组的最后一个元素cur存放第一个有值的元素下标,相当于头结点作用空的静态链表如下图

当存放入一些数据时("甲""乙""丁""戊""己""庚"),静态链表为:

静态链表的插入操作

在静态链表第三个位置插入"丙"后,结果如下:

静态链表的删除操作

删除"甲"后,静态链表如下: 

代码:

#include<stdio.h>

#define MAXSIZE 7
#define true 1
#define false 0

typedef int bool;

typedef struct
{
    int data;
    int cur;
}StaticLinkList[MAXSIZE];

//初始化静态链表,0位置cur指向1位置,1位置cur指向2位置...MAXSIZE-1位置指向0位置
void InitStaticLinkList(StaticLinkList L)//本来想用小写l的,但是小写l看起来太怪了
{
    int i;
    for (i = 0; i < MAXSIZE - 1; i++)
    {
        L[i].cur = i + 1;//最后一个元素指向的是尾节点
    }
   // L[MAXSIZE - 2].cur = 0;//备用链表的最后一个空元素的cur指向0,这一行不能省。
    L[MAXSIZE - 1].cur = 0;
}


//求静态链表中元素个数,不包括头尾节点
int StaticLinkListLength(StaticLinkList L)
{
    int i = L[MAXSIZE - 1].cur;
    int j = 0;
    while (i)
    {
        j++;
        i = L[i].cur;
    }
    return j;
}

//插入元素时,分配空间的下标
int Malloc(StaticLinkList L)
{
    int i = L[0].cur;
    if (i)
        L[0].cur = L[i].cur;
    return i;
}


//静态链表中i位置插入一个元素
bool StaticLinkListInsert(StaticLinkList L, int i, int key)
{
    //判断插入点是否合理
    if (i<1 || i>StaticLinkListLength(L)+1)
    {
        return false;
    }
    int j = Malloc(L);
    int k = MAXSIZE - 1;
    int l;
    if (j)
    {
        for (l = 1; l <= j - 1; l++)
        {
            k = L[k].cur;
        }
        L[j].data = key;
        L[j].cur = L[k].cur;
        L[k].cur = j;
        return true;
    }
    return false;

}

//回收结点
void Free(StaticLinkList L, int k)
{//将下标的空闲结点回收到备用链表中去(成为备用链表的首元结点)
    L[k].cur = L[0].cur; //将之前备用链表的首元结点的下标存到L[k]的cur中,使k结点成为备用链表的新首元结点
    L[0].cur = k;//L[0]的cur指向备用链表的新首元结点
}

//删除第i个元素
bool StaticLinkListDelete(StaticLinkList L,int i, int *key)
{
    if (i < 1 || i >= StaticLinkListLength(L)) //i不合法
    {
        return false;
    }
    int k = MAXSIZE - 1;
    int l;
    for (l = 1; l <= i-1; l++)//找到第i-1个元素的下标,存入k
    {
        k = L[k].cur;
    }
    int j = L[k].cur; //待删除的第i个元素L[j]
    *key = L[j].data; //返回删除的元素值
    L[k].cur = L[j].cur;//第i-1个元素L[k]的cur指向待删元素L[j]的后继
    Free(L, j);//释放删除的元素结点
    return true;
}

//遍历
void StaticLinkListTraverse(StaticLinkList L)
{
    int k = MAXSIZE - 1;//寻找第一个结点开始遍历
    while (L[k].cur)
    {
        k = L[k].cur;
        printf("%d ", L[k].data);
    }
    printf("\n");
}

int main(void)
{
    StaticLinkList L;
    printf("初始化链表:\n");
    InitStaticLinkList(L);
    printf("初始化链表之后,链表的长度为:%d\n", StaticLinkListLength(L));
    printf("插入1,2,3,4,5\n");
    StaticLinkListInsert(L, 1, 1);
    StaticLinkListInsert(L, 1, 2);
    StaticLinkListInsert(L, 1, 3);
    StaticLinkListInsert(L, 1, 4);
    StaticLinkListInsert(L, 1, 5);
    printf("遍历链表:\n");
    StaticLinkListTraverse(L);
    printf("链表长度为:%d\n", StaticLinkListLength(L));
    printf("删除第二个元素:\n");
    int key;
    StaticLinkListDelete(L, 2, &key);
    printf("删除的元素值为:%d\n", key);
    printf("遍历链表:\n");
    StaticLinkListTraverse(L);
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值