单向链表的操作及实现

9 阅读2分钟

image.png

这一部分可能有问题,先做个标记;

离扣,206 21

裸机编程(下面的两个符合这个(就是手搓操作系统))

顺序表:

  • 1 物理空间连续,用下标访问,按位置查找效率高;
  • 2 连续空间,按值查找,从头到尾查一遍
  • 3 尾部插入/删除,效率高,任意位置插入/删除,需要把所有的后面的数据后移/前移,效率低,
  • 4 物理空间是连续(这个物理空间实际的内存,我们写的各种是在操作系统上的它们是虚拟地址连续),条件是苛刻的,内存碎片,申请空间失败;

链表:

  • 1 物理空间不连续,但是逻辑上面连续;
  • 2 节点结构 : 数据 + 指针域
  • 3 按值按位置查找,需要一个个查找效率低
  • 4 进行头部插入/删除,效率高;按位置/按值插入删除效率低;

对链表进行操作核心:

  • 1 节点;
  • 2 开弓没有回头箭(这是一个单向链表);
  • 3 被备份思想(把要用到的节点放到=的右边);
  • 4 必须知道首节点的地址;

image.png

链表的操作

节点插入 image.png

对于要用到的一个节点不能直接更新,我们要记录这个节点后在进行更新;比如这个操作中的p->next 这个节点先放在了+号的左边,这时这个节点已经被记录了;

  • 1 创建辅助节点p,使辅助节点p指向待插入的前一个位置;
  • 2 创建一个新节点;
  • 3 更新新节点;
  • 4 更新旧节点;
  • 任意位置插入:效率低
  • 头插入:效率高;

删除节点 image.png

  • 1 创建辅助节点p,使辅助节点p指向待删除的前一个位置;
  • 2 创建一个新的辅助节点 tmp 来记录要删除的节点(为接下来的free打基础);
  • 任意位置删除:效率低
  • 头删除:效率高;

链表的两种格式

  • 1 带头结点的单向链表;
  • 2 带头指针的单向链表;

屏幕截图 2025-07-02 170230.png

image.png

他连其实很像的:一个是用一个节点,用它的next来记录真正的首节点,一个是用一个节点类型的指针来记录首节点;这个next和节点类型的指针非常相似;

我们可以引入头节点当中辅助节点来用;

写单向链表需要的英文;

note_t; val;next; LinkList_t; hearder;count;

creatLinkList; insertLinkListHearder; insertLinkListPos; deleteLinkListElement; showLinkList;

image.png 优化;