数据结构初阶 链表的补充

简介: 数据结构初阶 链表的补充

一. 主要介绍

本篇博客将会着重介绍三个接口函数

  1. 查找指定位置的链表
  2. 在指定位置插入数据
  3. 在指定位置删除数据


二. 查找指定位置的链表

我们这里首先画出一个单链表的逻辑图

我们要查找最好再定义一个cur来表示phead,如果我们直接用phead来查找首先是“吃相”不太好看,其次如果我们后面调用phead,phead值可能改变,所以我们最好再定义一个cur。

代码如下

SLTFind(SLTNode* phead, SLTDateType x)
{
  SLTNode* cur = phead;
  while (cur)
  {
    if (cur->date == x)
    {
      return cur;
    }
    cur = cur->next;
  }
  return NULL;
}

操作结果如下:



三. 在指定位置插入数据(前)

我们还是画图来看一下

我们要在pos前插入一个数据需要找到他前一个位置,我们给他前一个位置定义一个prev

我们想想看 假如说Find找不到值 我们就让它返回一个空指针

如果说要我们在空的位置插入数据 这不就是难为人嘛

直接给它断言一下,再考虑一个节点的问题和多个节点的问题

直接上代码

void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
  assert(pphead);
  assert(pos);
  if (pos == *pphead)
  {
    SLTPushFront(pphead, x);
  }
  else
  {
    //找到pos之前的一个位置
    SLTNode* prev = *pphead;
    while (prev->next != pos)
    {
      prev = prev->next;
    }
    SLTNode* newnode = BuySLTNode(x);
    prev->next = newnode;
    newnode->next = pos;
  }
}

演示结果



四. 在指定的位置插入数据(后)

还是一样看图分析

这里我们在pos后面插入一个数据可以不需要head指针 我们只需要将pos指向的下一位指向新创建的数据 另外将原来的pos next赋值给新数据

代码如下

void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{
  assert(pos);
  SLTNode* newnode = BuySLTNode(x);
  newnode->next = pos->next;
  pos->next = newnode;
}

我们可以发现 pos位置后面插入数据比前面插入数据简单多了

演示结果



五. 删除指定位置的数据

还是看图

pos位置的删除其实在pos位置前插入有点类似,同样需要知道前一个位置,再让前一个位置指向pos后一个位置,释放pos即可,也是两种情况一个节点和多个节点

直接上代码

void SLTErase(SLTNode** pphead, SLTNode* pos)
{
  assert(pos);
  assert(pphead);
  if (pos == *pphead)
  {
    free(pos);
  }
  else
  {
    //找到pos之前的一个位置
    SLTNode* prev = *pphead;
    while (prev->next != pos)
    {
      prev = prev->next;
    }
    prev->next = pos->next;
    free(pos);
  }
}

演示结果



六. 删除指定位置后的数据  

还是看图


很简单直接上代码


void SLTEraseAfter(SLTNode* pos)
{
  assert(pos);
  assert(pos->next);
  SLTNode* del = pos->next;
  pos->next = pos->next->next;
  free(del);
  del = NULL;
}

 

再注意一点:这里我们定义一个del来表示pos后的一个位置,预防释放错误,避免野指针问题

以上便是本文所有内容了,如有错误,请各位大佬不吝赐教,感谢留言

目录
相关文章
|
14天前
|
存储 Java 索引
【数据结构】链表从实现到应用,保姆级攻略
本文详细介绍了链表这一重要数据结构。链表与数组不同,其元素在内存中非连续分布,通过指针连接。Java中链表常用于需动态添加或删除元素的场景。文章首先解释了单向链表的基本概念,包括节点定义及各种操作如插入、删除等的实现方法。随后介绍了双向链表,说明了其拥有前后两个指针的特点,并展示了相关操作的代码实现。最后,对比了ArrayList与LinkedList的不同之处,包括它们底层实现、时间复杂度以及适用场景等方面。
31 10
【数据结构】链表从实现到应用,保姆级攻略
|
1月前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
30天前
|
存储 Java 程序员
"揭秘HashMap底层实现:从数组到链表,再到红黑树,掌握高效数据结构的秘密武器!"
【8月更文挑战第21天】HashMap是Java中重要的数据结构,采用数组+链表/红黑树实现,确保高效查询与更新。构造方法初始化数组,默认容量16,负载因子0.75触发扩容。`put`操作通过计算`hashCode`定位元素,利用链表或红黑树处理冲突。`get`和`remove`操作类似地定位并返回或移除元素。JDK 1.8优化了链表转红黑树机制,提升性能。理解这些原理能帮助我们更高效地应用HashMap。
30 0
|
1月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
1月前
|
存储 测试技术
【初阶数据结构篇】双向链表的实现(赋源码)
因为头结点的存在,plist指针始终指向头结点,不会改变。
|
1月前
|
存储 测试技术
【初阶数据结构篇】单链表的实现(附源码)
在尾插/尾删中,都需要依据链表是否为空/链表是否多于一个节点来分情况讨论,目的是避免对空指针进行解引用造成的错误。
|
1月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
11 0
|
1月前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
10 0
|
1月前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
12 0
|
1月前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
16 0