链表的创建,打印,增,删

     都说链表的创建需要开辟一块空间,那么这块空间到底是在哪里被开辟的?其实这块空间是在内存中的堆空间开辟。

    大概如图所示。大致了解一下就行。

先了解一下什么是链表。

 我就直接讲一下物理结构,因为物理结构明白之后,逻辑结构一样会明白了。

链表的一个空间里面会分为俩个部分,一个是数据域:专门用来存储数据的;一个是指针域:用来存储下一个节点的地址。它是如何连接的呢?其实就是靠这个指针域。除了尾结点之外,每个节点的指针域都会存储到下一个节点的地址。然后会通过这个地址来找到你所在的具体位置。因为电脑是在随机开辟地址的,不像顺序表那样是连续的空间。所以如果没有这个指针域那就没办法串联在一起了。而尾结点的指针域存储的是空值。

接下来讲链表的创建:

 这里我单独列出了一个函数去说明,这里我们将说到俩个函数:malloc和assert。malloc就是在堆区开辟一块空间,具体的语法表现就是你用总共的空间大小去除它的个数,就是它一个空间的大小。 打个比方就是,你去买土豆,一共花了100元,买了50个,问:一个土豆多少钱。大概就是这个意思,知道了一个空间多大后malloc就开辟多大的空间。

打印:

打印这块非常的基础,咱们先了解一下这个,可以更好的去了解链表的其他操作。

先设置好头节点,也就是head,代码中设置的是a。看一下头结点里面存储的值是否为空值,如果是空值,说明现在的链表里面还没有数值,就会打印printf语句。如果不是空就头结点来找链表的第一个节点,找到后就开始打印,打印完成之后,就通过指针域里面的地址找到下一个节点,直到找到最后一个节点,存储的是空值则不进入while的循环。停止打印。

 链表的插入:

这里分为头插和尾插。咱们先了解尾插,因为尾插相对来说简单一点。

尾插:

 对比上一张图,可以直观的看到原本第三节点指针域中存储的空值变成了新插入节点的地址了。然后它们就连接在了一起,尾插就是这样子。把新插入的新节点的地址赋给原尾结点的指针域,实现串联,最后别忘了给新插入的节点的指针域赋空值。

头插:

头插比尾插理解起来复杂一点,因为头插还要多一点步骤。多在哪里呢?让我们仔细观察这幅图和之前那副图的区别,可以看见原本存储着0x00005000的地址的head现在存储的是0x00003000,这是第一个不一样的地方,第二个就是原本由head存储的0x00005000的地址现在有新的指针域存储了。这俩个变化就是头插的过程了。

这个就是实现的代码了。

删除:

先来看代码,这里我设置了结构体指针,其中有俩个指针存储着同样的地址。也就是头指针。这里是为了方便后续的操作。下面是这一步代码的物理结构图。

首先,先确保链表里面有数据,之后就是先开始账号确定是不是一样的,一样的之后再确定密码是否一样,这些条件都满足之后就是找到了你想删除的数据了。之后你把你想删除的数据赋给td,h再从头开始找到td,把td的指针域存储的地址存储到h里面,避免释放掉td后造成断链。最后给td赋给空值,避免之后要使用到的时候,不知道它存储的是啥,这是一个好习惯。大家可以在释放掉一个空间的时候随手赋给它空值,会节省你的很多调试时间。

 这就是刚刚代码的具体流程,顺便讲了一下用到的函数。

这就是链表的基础思路了,有不懂或有其他见解的欢迎在评论区或者私信我。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值