c语言数据结构之一(单链表)

前言

链表是最基础的数据结构,可以用于实现栈、队列等等。

实现原理

  1. 节点(Node):链表的基本构建单元是节点,每个节点包含两部分:数据和指向下一个节点的指针。在C语言中,节点通常用结构体来表示,结构体中包含数据字段和指针字段。

struct Node {int data;struct Node* next;
};
  1. 头指针(Head Pointer):链表的起始节点被称为头节点。头指针是指向链表第一个节点的指针。通过头指针,可以访问整个链表。

  2. 尾节点(Tail Node):链表中最后一个节点称为尾节点。它的指针通常指向NULL,表示链表的结束。

  3. 指针连接:链表中的节点通过指针相互连接。每个节点的指针指向下一个节点,形成一个链式结构。

动画演示过程

Linked List Stack Visualization

头插法

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构
struct Node {int data;struct Node* next;
};// 创建新节点
struct Node* createNode(int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {printf("Memory allocation failed!\n");exit(1);}newNode->data = data;newNode->next = NULL;return newNode;
}// 头插法插入新节点
void insertFront(struct Node** head, int data) {struct Node* newNode = createNode(data);newNode->next = *head;*head = newNode;
}// 打印链表
void printList(struct Node* head) {struct Node* temp = head;while (temp != NULL) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n");
}// 主函数
int main() {struct Node* head = NULL;// 使用头插法插入一些节点insertFront(&head, 3);insertFront(&head, 2);insertFront(&head, 1);printf("List after using head insertion: ");printList(head);return 0;
}

尾插法

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构
struct Node {int data;struct Node* next;
};// 创建新节点
struct Node* createNode(int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {printf("Memory allocation failed!\n");exit(1);}newNode->data = data;newNode->next = NULL;return newNode;
}// 在链表末尾插入新节点
void insertEnd(struct Node** head, int data) {struct Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;} else {struct Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;}
}// 删除指定值的节点
void deleteNode(struct Node** head, int key) {struct Node* temp = *head;struct Node* prev = NULL;if (temp != NULL && temp->data == key) {*head = temp->next;free(temp);return;}while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}if (temp == NULL) {printf("Node with value %d not found!\n", key);return;}prev->next = temp->next;free(temp);
}// 打印链表
void printList(struct Node* head) {struct Node* temp = head;while (temp != NULL) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n");
}// 主函数
int main() {struct Node* head = NULL;// 插入一些节点insertEnd(&head, 1);insertEnd(&head, 2);insertEnd(&head, 3);printf("Initial List: ");printList(head);// 删除节点deleteNode(&head, 2);printf("List after deleting node with value 2: ");printList(head);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是分布式事务?

典型回答 分布式事务是指在分布式系统中涉及到多个数据库或多个应用程序之间的事务处理&#xff0c;这些数据库或应用程序可能分布在不同的物理节点上&#xff0c;甚至可能位于不同的地理位置。在分布式事务中&#xff0c;需要确保所有参与者的事务操作都能够保持一致性&#…

三步学会苹果手机怎么关震动的方法!

苹果手机的震动功能在某些情况下可能会被认为是不必要的&#xff0c;比如在会议、课堂或者晚间睡眠时。因此&#xff0c;学会如何关闭苹果手机的震动功能是非常实用的。苹果手机怎么关震动&#xff1f;在本文中&#xff0c;我们将介绍三个步骤&#xff0c;帮助你关闭苹果手机的…

XSS-Labs 靶场通过解析(下)

前言 XSS-Labs靶场是一个专门用于学习和练习跨站脚本攻击&#xff08;XSS&#xff09;技术的在线平台。它提供了一系列的实验场景和演示&#xff0c;帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 XSS-Labs靶场的主要特点和功能包括&#xff1a;…

K邻算法:在风险传导中的创新应用与实践价值

程序员的实用神器 ⛳️ 写在前面参与规则&#xff01;&#xff01;&#xff01; ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论三次&#xff09; ⛳️本次送书1~4本【取决于阅读量&#xff0c;阅读量越多&#xff0c;送的越…

Python 中使用私有成员的子类化

1、问题背景 Python 语言中&#xff0c;变量名与访问器同名是一个非常好的特性&#xff1a; self.__value 1def value():return self.__value但是&#xff0c;当我们想要子类化一个类&#xff0c;并访问其私有成员时&#xff0c;却没有一种简单的方法。通常&#xff0c;我们…

使用Spring Boot构建RESTful API的最佳实践

在使用Spring Boot构建RESTful API时&#xff0c;遵循一些最佳实践可以帮助你创建可维护、可扩展且安全的应用程序。以下是一些关键的最佳实践&#xff1a; ### 1. 使用Spring Initializr开始项目 Spring Initializr&#xff08;[https://start.spring.io/](https://start.spr…

接收文件(文件上传)

前端的请求内容 Content-Type: multipart/form-data; form-data; name"filedata"; filename"具体的文件名称" 后端定义接口 ApiOperation("文件上传接口")RequestMapping(value "/upload/coursefile", consumes MediaType.MULTIPA…

发挥企业力量,美乐家推动城市绿色发展

在当今时代&#xff0c;环保已成为衡量企业社会责任的重要标准之一。美乐家作为一个具有前瞻性的企业&#xff0c;深刻理解到这一点&#xff0c;并通过其行动积极展示了这种责任感。通过与中华环境保护基金会合作&#xff0c;美乐家开始全国范围内推动了“微行动&#xff0c;守…

C语言 | Leetcode C语言题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {int m matrixSize, n matrixColSize[0];int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 low;int x matrix[mid /…

等保测评—Linux-CentOS标准范例截图

密码输入错误无法登录 用户账户情况包含root、guanli、shenji 查看审计用户权限 身份鉴别&#xff1a; cat /etc/passwd&#xff0c;核查用户名和 UID&#xff0c;是否存在同样的用户名和 UID cat /etc/shadow&#xff0c;查看文件中各用户名状态 &#xff0c; 核查密码一栏为…

Springboot工程创建

目录 一、步骤 二、遇到的问题及解决方案 一、步骤 打开idea,点击文件 ->新建 ->新模块 选择Spring Initializr&#xff0c;并设置相关信息。其中组为域名&#xff0c;如果没有公司&#xff0c;可以默认com.example。点击下一步 蓝色方框部分需要去掉&#xff0c;软件包…

Win11安装Docker Desktop运行Oracle 11g 【详细版】

oracle docker版本安装教程 步骤拉取镜像运行镜像进入数据库配置连接数据库&#xff0c;修改密码Navicat连接数据库 步骤 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g运行镜像 docker run -d -p 1521:1521 --name oracle11g registry.cn-ha…

React常用组件分享

1、轮播组件&#xff1a; React Awesome Slider React Slider Carousel Component - react-awesome-slider

一起深度学习24/04/30——ResNet

ResNet神经网络 定义ResNet Block定义ResNet18加载数据集并训练、测试 定义ResNet Block ResNet Block 的作用&#xff1a; 是一个残差块&#xff0c;用于构建ResNet 主要是为了解决神经网络中的梯度爆炸和梯度消失问题&#xff0c;以及缓解训练过程中的退化问题。 在传统的神经…

【Spring Security注解详解】

Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架&#xff0c;广泛用于Java应用程序中以确保安全。它提供了多种注解来简化安全控制的实现&#xff0c;特别是在方法级别的权限控制上。以下是几个核心的Spring Security注解及其用途的详细介绍&#xff1a; 1…

MySQL动态列转行

介绍​​ 在实际的数据库查询中&#xff0c;有时候我们需要将表中的动态列&#xff08;即列数不固定&#xff09;转换为行&#xff0c;以便更好地进行数据分析和展示。在MySQL中&#xff0c;可以通过使用一些技巧和函数来实现动态列转行的功能。本文将介绍怎么实现MySQL动态列…

提升执行力的方法论

2024-5-7记录于PR办公室 一个关于求职的节目&#xff0c;提到如果在一个岗位做了多年&#xff0c;不论你是产品经理或项目经理&#xff0c;是否总结出一套产品/项目/研发的方法论。就这件事&#xff0c;我咨询过一个C语言大师星哥&#xff0c;他是这样说的:一件事在不同的时间段…

Arralist训练之罗马字符转换

1.1.1题目&#xff1a; /*键盘录用一个字符串 要求1.长度小于等于9 要求2.只能是数字 将阿拉伯数字与罗马数字对应 注意的是罗马数字里面没有0 1.1.2思路: 把题目分解成小目标 1.键盘录用一个字符串 2.要求 1.长度小于等于9 2.只能是数字 3.将阿拉伯数字与罗马数字对应…

延时任务通知服务的设计及实现(三)-- JDK的延迟队列DelayQueue

一、接着上文 上文我们讲述了使用redisson的RDelayedQueue实现分布式延迟队列&#xff0c;本文我们将自己JDK的延迟队列DelayQueue实现。 相比前者的实现&#xff0c;作为进程内的延迟队列&#xff0c;它会遇到许多技术难点&#xff1a; 如何支持分布式的多个节点部署场景应…

Android Native内存泄漏检测方案详解

文章目录 1. AddressSanitizer (ASan)2. LeakSanitizer (LSan)3. Valgrind4. 手动检测5. 实践建议6. 总结 在Android Native层开发过程中&#xff0c;内存泄漏是一个常见的问题。内存泄漏不仅会导致应用程序占用越来越多的内存&#xff0c;还可能引发性能问题和崩溃。因此&…