单链表相关操作(基于C语言)

ops/2025/2/25 5:27:49/

文章目录

  • 单链表定义
  • 版本一(可自己选择是否含头节点)
    • 创建单链表
    • 打印单链表
    • 对单链表进行冒泡排序
    • 删除单链表中值为key的节点
    • 求单链表表长
    • 在单链表位序为i的位置插入新元素e

单链表定义

typedef struct node
{int data;struct node* next;
}LinkNode,*LinkList;

版本一(可自己选择是否含头节点)

创建单链表

/*** @brief 创建单链表* @param head 单链表存储位置* @param data 存储单链表的整数数组* @param size 数组大小* @param is_have_head 是否创建头节点,是为1,否则为0*/
LinkList CreateList(int data[], int size, int is_have_head) {LinkList head = NULL;LinkNode* p = NULL;head = (LinkNode*)malloc(sizeof(LinkNode));  // 创建头结点head->next = NULL;p = head;for (int i = 0; i < size; i++) {LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));newNode->data = data[i];newNode->next = NULL;if (head == NULL) {head = newNode;p = head;}else {p->next = newNode;p = p->next;}}if (!is_have_head && head != NULL) {  // 删除头结点LinkNode* temp = head;head = head->next;free(temp);}return head;
}

打印单链表

/*** @brief 打印单链表* @param head 单链表指针* @param is_have_head 是否含头节点,是为1,否则为0*/
void PrintList(LinkList head, int is_have_head) {LinkNode* p = head;if (is_have_head) p = p->next;if (!p) printf("空链表!\a\n");else {while (p) {printf("%d->", p->data);p = p->next;}printf("NULL\n");}
}

对单链表进行冒泡排序

/*** @brief 对单链表进行冒泡排序* @param L 单链表指针L* @param is_have_head 是否含头节点,是为1,否则为0*/
void LinkBubbleSort(LinkList L, int is_have_head) {LinkNode* head = L;if (is_have_head) head = head->next;LinkNode* p = head, * q = p->next, * last = NULL;if (p == NULL || q == NULL) return;while (head->next != last) {while (q && q != last ) {if (p->data > q->data) {int temp = p->data;p->data = q->data;q->data = temp;}p = q;q = q->next;}last = p;p = head;q = p->next;}
}

删除单链表中值为key的节点

/*** @brief 删除单链表中值为key的节点* @param L 单链表L* @param key 目标值key* @param is_have_head 是否含头节点,是为1,否则为0* @return 删除成功返回true,否则返回false*/
bool ListDeleteNode(LinkList L, int key, int is_have_head) {LinkNode* p = L, * pre = NULL;if (is_have_head) {pre = p;p = p->next;}while (p && p->data != key) {pre = p;p = p->next;}if (!p) return false;pre->next = p->next;free(p);return true;
}

求单链表表长


/*** @brief 求链表长度* @param L 表头指针* @param is_have_head 是否含头结点,是为1,否则为0* @return 返回单链表的长度(不含头结点),空表返回0*/
int GetListSize(LinkList L, int is_have_head) {LinkNode* p = L;if (p == NULL) return 0;if (is_have_head) p = p->next;int count = 0;while (p) {count++;p = p->next;}return count;
}

在单链表位序为i的位置插入新元素e

/*** @brief 在单链表位序为i的位置插入新元素e* @param L 表头指针* @param i 插入位置(1<=i<=GetListSize(L)+1)* @param e 待插入元素e* @param is_have_head 是否含头结点,是为1,否则为0* @return 插入成功返回1,否则返回0*/
int ListInsert(LinkList L, int i, int e, int is_have_head) {int list_size = GetListSize(L, is_have_head);if (i < 1 || i > list_size + 1) return 0;  // 位序非法LinkNode* p = L, * pre = NULL;int cur = 1;if (is_have_head) {pre = p;p = p->next;}while (cur < i) {pre = p;p = p->next;cur++;}LinkNode* new_node = (LinkNode*)malloc(sizeof(LinkNode));new_node->data = e;if (pre == NULL) { // 第一个位置插入new_node->next = L;L = new_node;}else {new_node->next = p;pre->next = new_node;}return 1;
}

http://www.ppmy.cn/ops/161125.html

相关文章

网关和过滤器学习

一、网关是什么&#xff1f;有什么用&#xff1f; 在微服务架构中&#xff0c;一个模块可能会部署到多个不同地址的服务器上&#xff0c;比如一个item模块&#xff0c;它的端口号可能有8081、8082等。如果是以前&#xff0c;当用户发送请求时只能指定发送给某一个地址&#xff…

【VUE框架】深入剖析 Vue2 与 Vue3 的 Diff 算法区别

引言 在前端开发中&#xff0c;Vue 作为一款流行的 JavaScript 框架&#xff0c;以其高效的数据驱动和响应式特性受到广泛青睐。Diff 算法是 Vue 实现高效更新 DOM 的核心机制之一&#xff0c;它通过比较新旧虚拟 DOM&#xff08;Virtual DOM&#xff09;树的差异&#xff0c;…

mysql之InnoDB 统计信息收集

文章目录 InnoDB 统计信息收集核心概念&#xff1a;统计信息的价值表级别统计信息索引级别统计信息列统计(MySQL 8.0) 统计信息的存储位置统计信息的收集方式自动统计信息收集的触发条件自动统计信息收集的具体机制手动统计信息收集&#xff1a; ANALYZE TABLE 命令 统计信息的…

【Python爬虫(46)】解锁分布式爬虫:实时数据处理的奥秘

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

uniapp修改picker-view样式

解决问题&#xff1a; 1.选中文案样式&#xff0c;比如字体颜色 2.修改分割线颜色 3.多列时&#xff0c;修改两边间距让其平分 展示效果&#xff1a; 代码如下 <template><u-popup :show"showPicker" :safeAreaInsetBottom"false" close&quo…

Linux远程kill进程及$处理

个人博客地址&#xff1a;Linux远程kill进程及$处理 | 一张假钞的真实世界 在远程执行的命令中如果包含特殊字符&#xff08;$&#xff09;时需要转义&#xff0c;如下&#xff1a; ssh rootremote_host "ps -ef|grep process_name | grep -v grep | awk {print $2}&qu…

【后端基础】布隆过滤器原理

文章目录 一、Bloom Filter&#xff08;布隆过滤器&#xff09;概述1. Bloom Filter 的特点2. Bloom Filter 的工作原理 二、示例1. 添加与查询2. 假阳性 三、Bloom Filter 的操作1、假阳性概率2、空间效率3、哈希函数的选择 四、应用 Bloom Filter 是一种非常高效的概率型数据…

使用Hardhat实现ERC20 代币合约详解

ERC20 代币合约详解 &#x1f4b0; 1. 合约概览 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20;import "openzeppelin/contracts/token/ERC20/ERC20.sol";contract MyToken is ERC20 {constructor() ERC20("MyToken", "MTK") {_min…