静态链表的通俗讲解与基本操作(C语言)

静态链表是数据结构线性表中的一种,因为其每一个结点只有一个直接前驱和直接后继,对于开头结点和末尾结点只有一个直接前驱或直接后继。
本人听老师讲课,看老师关于静态链表PPT时有些许不懂,看了CSDN其他关于静态链表的帖子后也还存在许多疑惑,现在自己明白之后试着把它的逻辑写出来。

我们说链表是一种链式存储结构,是因为它每一个结构体节点中存放着下一个结构体节点的地址,通过指针与地址使得链表被称作链。那么在一些语言中,因为封装较完备,我们无法对地址直接进行操作,例如java。所以静态链表可以在某种意义上替代链表。

我们知道但凡一种语言,可能没有指针,但是数组这种基本的数据类型一定会有,静态链表就是利用数组来模拟实现链表的功能。

静态链表有两种形式,第一种是以结构体为基本单元,一个结构体对应一个节点,结构体中有两个元素,一个是该节点存放的数据data,另一个是该节点存放的游标cur(注意cur中存放的是下一个节点的下标,等同于链表中的指针域,都是表示下一个节点的位置信息的);一种是构建两个同步的数组,一个数组存放data,一个数组同步存放该下标对应的cur。其实这俩差不多,第一种更加好理解一点,我们用第一种来举例:

其实我们能将静态链表这一个数组拆成两个链表来看,因为一开始创建数组没有元素存储,所以一开始待存储链表很长,已存储链表为空。我们需要存储数据的时候,就把带存储链表的第一个节点取下,用来存放数据,并把它接到已存储链表上,这样带存储链表越来越短,已存储链表越来越长。

基本思路是:第一个节点(下标index=0)的data不存放数据,cur存放待存储链表的第一个节点下标(注意,是还没有利用过的节点下标)最后一个节点的(下标为length-1)的data不存放数据,cur存放已存储链表的第一个节点的下标。


如图可看大概存储原理↑
下面展示具体代码:

构建静态链表

struct L
{
    int data;
    int cur;
}arr[100];//创建一百个节点大小的静态链表,并定义标签为L的结构体数据类型
#include<stdio.h>
struct L* initlist(struct L* arr,int n)//返回这个结构体数组的首地址
{
    for(int i=1;i<99;i++)
    {
        arr[i].cur=i+1;
    }
    arr[0].cur=2;
    arr[99].cur=1;
    arr[1].data=n;
    arr[1].cur=0;
    return arr;
}

插入操作

插入操作涉及到几部
第一,一定会更改arr[0].cur的值,因为待存储数组的首元素被拿来存储数据,所以值会变更。
第二,可能会更改最后一个节点的cur值(即arr[99].cur),如果插入的元素存储在链表的第一个位置,则会更改。
第三,a->b –> a->c->b,更改指针指向,需要两步操作

struct L* listInsert(struct L* arr,int n,int i)
{
    if(i<=0)
    {
        printf("错误");
        return arr;
    }
    int k=99;
    for(int j=1;j<=i-1;j++)
    {
        k=arr[k].cur;
        if(arr[k].cur==0)
        {
            break;
        }
    }
    int temp=arr[0].cur;
    arr[0].cur=arr[temp].cur;
    arr[temp].data=n;
    arr[temp].cur=arr[k].cur;
    arr[k].cur=temp;
    return arr;
}

删除元素

struct L* listDelete(struct L* arr,int i)
{
    if(i<=0)
    {
        printf("错误");
        return arr;
    }
    int k=99;
    for(int j=1;j<=i-1;j++)
    {
        k=arr[k].cur;
        if(arr[k].cur==0)
        {
            printf("错误");
            return arr;
        }
    }
    int j=arr[k].cur;
    arr[k].cur=arr[j].cur;
    arr[j].cur=arr[0].cur;
    arr[0].cur=j;
    return arr;
}

就这么多吧

链表是一种常见的数据结构,它由一系列的结点组成。每个结点包含两部分,即数据域和指针域。数据域用于存储具体的数据,而指针域用于指向下一个结点的地址。链表基本操作包括插入、删除和查找。 1. 插入操作:链表的插入操作可以在链表的任意位置插入一个新的结点。首先,创建一个新的结点,并将要插入的数据存储在该结点的数据域中。然后,将该结点的指针域指向原来位置的结点,同时修改前一个结点的指针域,使其指向新插入的结点。 2. 删除操作:链表的删除操作可以删除链表中的一个结点。首先,找到要删除的结点,并记录下其前一个结点的地址。然后,将前一个结点的指针域指向要删除结点的下一个结点,从而跳过要删除的结点。 3. 查找操作:链表的查找操作可以在链表中搜索指定的数据。从链表的头结点开始,依次遍历链表的每个结点,直到找到目标数据或者到达链表的末尾。 这些基本操作可以帮助我们进行链表的增删改查操作。通过合理地运用这些操作,我们可以实现各种复杂的功能。需要注意的是,在进行链表操作时,我们需要确保指针的正确性,避免出现指针丢失或者指针指向错误的情况。 总之,链表是一种灵活且常用的数据结构,通过简单的插入、删除和查找操作,我们可以实现各种功能。希望以上解释对您有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【C语言链表实现】学生成绩管理系统(功能全面,通俗易懂)](https://blog.csdn.net/weixin_72074975/article/details/130254484)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C语言链表详解(通俗易懂,超详细)](https://blog.csdn.net/weixin_46145739/article/details/104590875)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C语言链表详解(通俗易懂)](https://blog.csdn.net/weixin_61661271/article/details/125131994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值