当前位置: 首页 > web >正文

单链表设计与实现

01. 单链表简介

在数据结构中,单链表的实现可以分为 带头结点不带头结点 两种方式,这里我们讨论第二种方式。

  • 头结点:链表第一个节点不存实际数据,仅作为辅助节点指向首元节点(第一个数据节点)。
  • 头指针:永远指向头结点(非空链表头结点始终存在)。

在这里插入图片描述

单链表核心数据结构及操作声明:

typedef struct Node {int data;         // 节点数据域struct Node* next;// 节点指针域
} Node;
// 初始化带头结点的空链表
Node* InitList();
// 头插法建立链表
void HeadInsert(Node* list, int data);
// 尾插法建立链表
void TailInsert(Node* list, int data);
// 删除指定数据节点
void Delete(Node* list, int data);
// 遍历打印链表
void PrintList(Node* list);
//创建单链表
Node* list = InitList();
HeadInsert(list,1);//如头插
TailInsert(list,2);//如尾插

02.链表初始化

创建一个头结点,内部的data标明有多少个节点的计数,头结点的指针域置为空。

Node* InitList() {Node* list = (Node*)malloc(sizeof(Node));list->data = 0;list->next = NULL;return list;
}

03.头插法与尾插法

头插法简单,只需要在头结点后面插入即可,尾插法较为复杂,需要保存头结点指针,当list->next的节点不为空的时候,会继续往下面执行while循环,跳出循环的时候标明已经指向最后一个结点,随后即可插入。

void headInsert(Node* list, int data) {Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = list->next;list->next = node;list->data++;
}
void tailInsert(Node* list, int data) {Node* head = list;//此处会改变头结点,所以临时保存一下Node* node = (Node*)malloc(sizeof(Node));node->data = data;node -> next = NULL;list = list->next;//将指针移动到头结点,头结点也移动了!!!while (list->next) {//当list的下一个节点不为空的时候,会继续往下面执行list = list->next;//list继续往下面执行}list->next = node;head->data++;
}

04.链表的删除

链表的删除需要precurrent两个指针配合,通过比对其中的data里面的数据进行判断,不符合时,两个指针都向后移,知道匹配到对应数据时停下删除该结点。

void Delete(Node* list, int data) {Node* pre = list;Node* current = list->next;while (current){if (current->data = data) {pre->next = current->next;free(current);break;/无重复退出}pre = current;current = current->next;}list->data--;
}

05.链表的输出

依次循环输出即可。

void printlist(Node* list) {list = list->next;//指向头结点while (list){//list不为空就继续执行printf("%d ", list->data);list = list->next;//list往下走}printf("\n");
}

图片后续有时间会补上!!

;
list = list->next;//list往下走
}
printf(“\n”);
}


---### 图片后续有时间会补上!!
http://www.xdnf.cn/news/5448.html

相关文章:

  • 锁相放大技术:从噪声中提取微弱信号的利器
  • C PRIMER PLUS——第9节:动态内存分配、存储类别、链接和内存管理
  • 程序中的内存从哪里来?
  • arctan x 导数推理
  • Java 1.8(也称为Java 8)
  • 4.4 os模块
  • MySql事务索引
  • 图灵奖获得者经典论文系列(1969):迈向人工智能的步伐(马文·明斯基)
  • 2023 河南ccpc
  • Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)
  • AI(学习笔记第三课) 使用langchain进行AI开发(2)
  • VSCode1.101.0便携版|中英文|编辑器|安装教程
  • 大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法
  • 【React中useRef钩子详解】
  • 《AI大模型应知应会100篇》第56篇:LangChain快速入门与应用示例
  • 【Leetcode 每日一题】1550. 存在连续三个奇数的数组
  • 【心海资源】【最新话费盗u】【未测】提币对方官方波场+没有任何加密+无后门+前端VUE
  • 元数据分类
  • 硬件中断请求号和lspci命令查看到的device id有关系吗?
  • 欧拉路与欧拉回路(模板)
  • LVGL简易计算器实战
  • TGV之LTX:《LTX-Video: Realtime Video Latent Diffusion》翻译与解读
  • RagFlow 完全指南(一):从零搭建开源大模型应用平台(Ollama、VLLM本地模型接入实战)
  • Flutter基础()
  • Qt 中 QWidget涉及的常用核心属性介绍
  • 《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库
  • 5.11y打卡
  • 缓存(3):本地缓存作用 及 数据一致性 实现策略
  • upload-labs靶场通关详解:第五关
  • Linux基础(vim编辑器)