C语言链表使用

目录

  • 双链表增删改查
  • 链表带功能函数

双链表增删改查

#include <stdio.h>
#include <stdlib.h>// 双链表结点的定义
typedef struct DNode{int data;struct DNode *prev;struct DNode *next;
} DNode;// 创建双链表
DNode *createDoublyLinkedList() {int n, i;printf("请输入双链表的长度:");scanf("%d", &n);if (n <= 0) {printf("输入的长度无效!\n");return NULL;}DNode *head = NULL;  // 双链表的头结点DNode *tail = NULL;  // 双链表的尾结点// 创建双链表的结点for (i = 0; i < n; i++) {int data;printf("请输入第 %d 个结点的数据:", i+1);scanf("%d", &data);DNode *newNode = (DNode*)malloc(sizeof(DNode));newNode->data = data;newNode->prev = NULL;newNode->next = NULL;if (head == NULL) {head = newNode;tail = newNode;} else {tail->next = newNode;newNode->prev = tail;tail = newNode;}}return head;
}// 遍历双链表
void traverseDoublyLinkedList(DNode *head) {if (head == NULL) {printf("双链表为空!\n");return;}DNode *current = head;printf("双链表的数据为:");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}// 在指定位置插入结点
void insertNode(DNode **head, int position, int data) {if (*head == NULL) {printf("双链表为空!\n");return;}DNode *current = *head;int currentPosition = 1;// 找到指定位置的结点while (currentPosition < position && current->next != NULL) {current = current->next;currentPosition++;}if (currentPosition < position) {printf("插入位置无效!\n");return;}// 创建新结点DNode *newNode = (DNode*)malloc(sizeof(DNode));newNode->data = data;newNode->prev = NULL;newNode->next = NULL;if (currentPosition == 1) {newNode->next = *head;(*head)->prev = newNode;*head = newNode;} else {newNode->next = current;newNode->prev = current->prev;current->prev->next = newNode;current->prev = newNode;}printf("成功插入结点!\n");
}// 删除指定位置的结点
void deleteNode(DNode **head, int position) {if (*head == NULL) {printf("双链表为空!\n");return;}DNode *current = *head;int currentPosition = 1;// 找到指定位置的结点while (currentPosition < position && current != NULL) {current = current->next;currentPosition++;}if (current == NULL) {printf("删除位置无效!\n");return;}if (currentPosition == 1) {*head = (*head)->next;if (*head != NULL) {(*head)->prev = NULL;}} else {current->prev->next = current->next;if (current->next != NULL) {current->next->prev = current->prev;}}free(current);printf("成功删除结点!\n");
}// 按值查找结点
DNode *searchNode(DNode *head, int data) {if (head == NULL) {printf("双链表为空!\n");return NULL;}DNode *current = head;// 遍历双链表,找到指定值的结点while (current != NULL) {if (current->data == data) {return current;}current = current->next;}printf("未找到指定结点!\n");return NULL;
}//获取指定位置数据
int get_node_value(DNode* head, int pos) {if (head == NULL) {  // 判断链表是否为空printf("链表为空,无法查找!\n");return -1;}int count = 0;DNode* current = head;while (current != NULL) {if (count == pos) {return current->data;  // 找到指定位置的节点,返回节点的值}count++;current = current->next;  // 继续遍历下一个节点}printf("指定位置不存在节点!\n");  // 遍历完整个链表仍然没有找到节点return -1;
}//查看节点数量
int get_node_count(DNode* head) {int count = 0;DNode* current = head;while (current != NULL) {count++;current = current->next;}return count;
}//打印链表数据
void print_list(DNode* head) {DNode* current = head;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}//从尾部添加数据
DNode* create_node(int data) {DNode* newNode = (DNode*)malloc(sizeof(DNode));newNode->data = data;newNode->next = NULL;return newNode;
}
void append_node(DNode** head, int data) {DNode* newNode = create_node(data);if (*head == NULL) {// 如果链表为空,则将新节点作为头节点*head = newNode;} else {// 找到链表的末尾节点DNode* current = *head;while (current->next != NULL) {current = current->next;}// 将新节点添加到末尾current->next = newNode;}
}// 释放双链表的内存
void freeDoublyLinkedList(DNode **head) {DNode *current = *head;while (current != NULL) {DNode *temp = current;current = current->next;free(temp);}*head = NULL;printf("成功释放双链表的内存!\n");
}int main() {DNode *head = NULL;// 创建双链表head = createDoublyLinkedList();// 遍历双链表traverseDoublyLinkedList(head);// 在指定位置插入结点int insertPosition, insertData;printf("请输入要插入的位置和数据(以空格分隔):");scanf("%d %d", &insertPosition, &insertData);insertNode(&head, insertPosition, insertData);traverseDoublyLinkedList(head);// 删除指定位置的结点int deletePosition;printf("请输入要删除的位置:");scanf("%d", &deletePosition);deleteNode(&head, deletePosition);traverseDoublyLinkedList(head);// 按值查找结点int searchData;printf("请输入要查找的值:");scanf("%d", &searchData);DNode *searchResult = searchNode(head, searchData);if (searchResult != NULL) {printf("成功找到结点!");}int position;printf("请输入要查找的位置:");scanf("%d", &position);int value = get_node_value(head, position);if (value == -1) {printf("位置超出链表范围!\n");} else {printf("位置 %d 的值为:%d\n", position, value);}   int count = get_node_count(head);printf("链表中共有 %d 个数据节点\n", count);append_node(&head, 30);print_list(head);// 释放双链表的内存freeDoublyLinkedList(&head);return 0;
}

链表带功能函数

#include <stdio.h>
#include <stdlib.h>typedef struct DNode {int data;void (*Function)(const char*);struct DNode* prev;struct DNode* next;
} DNode;// 创建节点
DNode* createNode(int data, void (*function)(const char*)) {DNode* node = (DNode*)malloc(sizeof(DNode));node->data = data;node->Function = function;node->prev = NULL;node->next = NULL;return node;
}// 插入节点到链表末尾
void insertNode(DNode** head, DNode* node) {if (*head == NULL) {*head = node;} else {DNode* current = *head;while (current->next != NULL) {current = current->next;}current->next = node;node->prev = current;}
}// 执行链表中的节点功能函数
void executeListFunction(DNode* head, const char* param) {DNode* current = head;while (current != NULL) {if (current->Function != NULL) {current->Function(param);}current = current->next;}
}void executeListFunctions(DNode* head, int searchData, const char* param) {DNode* current = head;while (current != NULL) {if (current->data == searchData && current->Function != NULL) {current->Function(param); //执行对应功能函数。}current = current->next;}
}
// 示例的功能函数
void function1(const char* param) {printf("执行功能函数1,参数:%s\n", param);
}void function2(const char* param) {printf("执行功能函数2,参数:%s\n", param);
}int main() {// 创建节点DNode* node1 = createNode(1, function1);DNode* node2 = createNode(2, function2);// 构建链表DNode* head = NULL;insertNode(&head, node1);insertNode(&head, node2);// 执行链表中的功能函数executeListFunctions(head, 1, "参数");// 释放内存free(node1);free(node2);return 0;
}

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

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

相关文章

【C语言】qsort的秘密

一&#xff0c;本文目标 qsort函数可以对任意类型数据甚至是结构体内部的数据按照你想要的规则排序&#xff0c;它的功能很强大&#xff0c;可是为什么呢&#xff1f; 我将通过模拟实现qsort函数来让你对这整个过程有一个清晰的深刻的理解。 二&#xff0c;qsort函数原型 v…

leetcode刷题详解一

算法题常用API std::accumulate 函数原型&#xff1a; template< class InputIt, class T > T accumulate( InputIt first, InputIt last, T init );一般求和的&#xff0c;代码如下&#xff1a; int sum accumulate(vec.begin() , vec.end() , 0);详细用法参考 lo…

【python海洋专题四十七】风速的风羽图

【python海洋专题四十七】风速的风羽图 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Pyth…

记一次linux操作系统实验

前言 最近完成了一个需要修改和编译linux内核源码的操作系统实验&#xff0c;个人感觉这个实验还是比较有意思的。这次实验总共耗时4天&#xff0c;从对linux实现零基础&#xff0c;通过查阅资料和不断尝试&#xff0c;直到完成实验目标&#xff0c;在这过程中确实也收获颇丰&…

pytorch模型优化简介,未完结版

如有帮助&#xff0c;点赞收藏关注&#xff01; 如需转载&#xff0c;请注明出处&#xff01; 今天来介绍torch模型中的优化器 优化是指在每个训练步骤中调整模型参数以减少模型误差的过程。 优化算法定义如何执行这个过程 所有优化逻辑都封装在优化器对象中。在这里&#xf…

【黑马甄选离线数仓day04_维度域开发】

1. 维度主题表数据导出 1.1 PostgreSQL介绍 PostgreSQL 是一个功能强大的开源对象关系数据库系统&#xff0c;它使用和扩展了 SQL 语言&#xff0c;并结合了许多安全存储和扩展最复杂数据工作负载的功能。 官方网址&#xff1a;PostgreSQL: The worlds most advanced open s…

音视频项目——RTSP服务器解析(1)

介绍 利用线程池&#xff0c;实现 RTSP 服务器的高并发请求处理。 RTSP 是音视频的控制视频的协议&#xff0c;如果您还不了解&#xff0c;可以看看之前我解析 RTSP 协议的文章。音视频协议解析(RTP/RTCP/RTSP/RTMP)——RTSP解析-CSDN博客 解析 我们先来看 RTP 的实现。RTP 是音…

Django框架之auth模块

目录 一、Auth模块引入 二、创建超级用户(管理员) 三、依赖于auth_user表完成登录注册功能 【1】基础登陆 【2】保存用户状态 【3】登录后跳转 (1) 登录后才能访问页面 -- 局部配置 (2) 登录后才能访问页面 -- 全局配置 (3) 小结 三、修改密码 四、注销 五、注册…

Springboot将多个图片导出成zip压缩包

Springboot将多个图片导出成zip压缩包 将多个图片导出成zip压缩包 /*** 判断时间差是否超过6小时* param startTime 开始时间* param endTime 结束时间* return*/public static boolean isWithin6Hours(String startTime, String endTime) {// 定义日期时间格式DateTimeFormatt…

【数据结构】—搜索二叉树(C++实现,超详细!)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;消えてしまいそうです—真夜中 1:15━━━━━━️&#x1f49f;──────── 4:18 &#x1f504; ◀️ ⏸ ▶️…

函数计算的新征程:使用 Laf 构建 AI 知识库

Laf 已成功上架 Sealos 模板市场&#xff0c;可通过 Laf 应用模板来一键部署&#xff01; 这意味着 Laf 在私有化部署上的扩展性得到了极大的提升。 Sealos 作为一个功能强大的云操作系统&#xff0c;能够秒级创建多种高可用数据库&#xff0c;如 MySQL、PostgreSQL、MongoDB …

js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj,将数组中的内容作为对象的key转化为对象,对应的值转换为对象对应的值

1.需求场景 哈喽 大家好啊&#xff0c;今天遇到一个场景&#xff0c; js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj&#xff0c;将数组中的内容作为对象的key转化为对象&#xff0c;对应的值转换为对象对应的值 数组对象中某个属性的值&#xff0c;转…

元宇宙现已开放!

在 2023 年 11 月 3 日 The Sandbox 首个全球创作者日上&#xff0c;The Sandbox 联合创始人 Arthur Madrid 和 Sebastien Borget 宣布元宇宙已开放&#xff0c;已创作完整体验的 LAND 持有者可以自行将体验发布至 The Sandbox 地图上。 精选速览 LAND 持有者&#xff1a;如果…

在JVM中 判定哪些对象是垃圾?

目录 垃圾的条件 1、引用计数法 2、可达性分析 3、强引用 4、软引用 5、弱引用 6、虚引用 判断垃圾的条件 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾收集器负责管理内存&#xff0c;其中的垃圾收集算法用于确定哪些对象是垃圾&#xff0c;可以被回收…

VBA即用型代码手册之工作薄的关闭保存及创建

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

[Latex] Riemann 问题中的激波,接触间断,膨胀波的 Tikz 绘图

Latex 代码 \begin{figure}\begin{subfigure}[b]{0.32\textwidth}\centering\resizebox{\linewidth}{!}{\begin{tikzpicture}\coordinate (o) at (0,0);\coordinate (Si) at (2.5,2.5);\coordinate (x) at (1,0);\draw[->] (0,0) -- (3,0) node[right] {$x$};\draw[->] …

ArkTS-自定义组件学习

文章目录 创建自定义组件页面和自定义组件生命周期自定义组件和页面的区别页面生命周期(即被Entry修饰的组件)组件生命周期(即被Component修饰的组件) Builder装饰器&#xff1a;自定义构建函数按引用传递参数按值传递参数 BuilderParam装饰器&#xff1a;引用Builder函数 这个…

Python 将列表拼接为一个字符串,Python join

目录 join方法的源码&#xff1a; 列表数据为字符串 列表数据为数字 三引号也可以使用join join方法的源码&#xff1a; def join(self, abNone, pqNone, rsNone): # real signature unknown; restored from __doc__"""Concatenate any number of strings.T…

harmonyos应用开发者高级认证考试部分答案

1只要使用端云一体化的云端资源就需要支付费用&#xff08;错&#xff09; 2所有使用Component修饰的自定义组件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期函数。&#xff08;错&#xff09; 3 HarmonyOS应用可以兼容OpenHarmony生态&#xff08;对&#…

一文读懂如何安全地存储密码

目录 引言 明文存储 基本哈希存储 加盐哈希存储 适应性哈希算法 密码加密存储 小结 引言 密码是最常用的身份验证手段&#xff0c;既简单又高效。密码安全是网络安全的基石&#xff0c;对保护个人和组织信息的安全具有根本性的作用。然而有关密码泄漏的安全问题一再发生…