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

单链表C语言实现(付代码全)

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();
TailInsert(list,1);//如尾插
HeadInsert(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 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++;
}

在这里插入图片描述

void headInsert(Node* list, int data) {Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = list->next;list->next = node;list->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");
}

在这里插入图片描述


完整代码:

#include<stdio.h>
#include<stdlib.h>
typedef int status;
typedef struct Node{int data;struct Node* next;
}Node;
Node* InitList() {Node* list = (Node*)malloc(sizeof(Node));list->data = 0;list->next = NULL;return list;
}
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++;
}
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--;
}
void printlist(Node* list) {list = list->next;//指向头结点while (list){//list不为空就继续执行printf("%d ", list->data);list = list->next;//list往下走}printf("\n");
}
int main() {Node* list = InitList();headInsert(list,1);headInsert(list, 2);tailInsert(list, 21);tailInsert(list, 32);printlist(list);system("pause");return 0;
}
http://www.xdnf.cn/news/397333.html

相关文章:

  • 进程检测与控制
  • C++学习之STL学习
  • 联合类型的逻辑或关系与类型保护
  • 关于我在实现用户头像更换时遇到的图片上传和保存的问题
  • Colab使用_文件操作
  • C++.IP协议通信
  • 【C++进阶】第3课—二叉搜索树
  • C++猴子摘桃 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • [超详细,推荐!!!]前端性能优化策略详解
  • VC++ 获取CPU信息的两种方法
  • POSIX信号量
  • 【软件测试】基于项目驱动的功能测试报告(持续更新)
  • k8s中ingress-nginx介绍
  • Spring Boot 中的重试机制
  • 【Python】Python类型标注革命:Annotated类型深度解析与实战
  • 匈牙利算法
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十七)
  • java中对象的比较
  • 【文献阅读】地方政府驱动企业参与乡村振兴的机制——乡村振兴注意力视角的分析
  • 【工作记录】crmeb后端项目打开、运行
  • 【Flask开发踩坑实录】pip 安装报错:“No matching distribution found” 的根本原因及解决方案!
  • 1688 开放平台接口对接实战:商品实时数据采集 API 开发全流程
  • cmake:test project
  • OSPF的特殊区域
  • P10225 [COCI 2023/2024 #3] Milano C.le|普及
  • LeetCode 热题 100 543. 二叉树的直径
  • RS485和RS232 通信配置
  • TikTok 运营干货:内容创作与 AI 增效
  • 【高数上册笔记01】:从集合映射到区间函数
  • istio in action之应用弹性与容错机制