当前位置: 首页 > 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;
}

相关文章:

  • 牛客周赛 Round 92 题解 Java
  • 当虚拟吞噬现实——《GTA6》结合技术
  • Java 线程池原理
  • Http2多路复用的静态表和动态表
  • 假如你的项目是springboot+vue怎么解决跨域问题
  • 软考冲刺——案例分析题Super VLAN
  • 优秀的流程图设计软件【留存】
  • 0基础学AI智能体,Coze和Dify该学那个?有什么区别吗?
  • JVM规范之运行时数据区域
  • 文件批量重命名工具,简单高效一键完成更名
  • Spring AI(3)——Chat Memory
  • 【Java学习日记34】:this关键字和成员变量
  • 本贴会成为记录贴
  • 巧用promise.race实现nrm镜像源切换----nbsl
  • # 2-STM32-复位和时钟控制RCC
  • Python中的标识、相等性与别名:深入理解对象引用机制
  • 【C语言】程序的预处理,#define详解
  • Vue.js 页面切换空白与刷新 404 问题深度解析
  • C++开发过程中的注意事项详解
  • 基于Qt的app开发第七天
  • 消费维权周报|上周涉手机投诉较多,涉拍照模糊、屏幕漏液等
  • 金科股份重整方案通过,正式进入重整计划执行环节
  • 均价19.5万元/平米!上海徐汇滨江地王项目“日光”,销售额近70亿元
  • 巴西总统卢拉抵达北京
  • 傅利叶提出下个十年战略,CEO顾捷:机器人要有温度,要用实际价值来定义形态
  • 这座古村,藏着多少赣韵风华