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

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

文章目录

  • 单链表定义
  • 创建单链表
  • 打印单链表
  • 对单链表进行冒泡排序
  • 删除单链表中值为key的节点
  • TODO

单链表定义

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;
}

TODO

Date: 2025-02-21

相关文章:

  • 【Linux基础】Linux下常用的系统命令
  • 工业路由器和工业交换机,打造高效稳定的工业网络?
  • 达梦统计信息
  • 龙臻:独立电影的创新力量与国际认可
  • ArcGIS Pro中等高线的生成与应用详解
  • 【Unity】Unity clone 场景渲染的灯光贴图异位问题
  • 网页五子棋——对战后端
  • 全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
  • 学习aigc
  • 深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )
  • 驱动开发WDK(1)-环境准备和初始程序。详细教程
  • 低概率发生调用`pthread_cond_wait`的线程没有被唤醒
  • 一种简单有效的分析qnx+android智能座舱项目中的画面闪烁的方法(8155平台)
  • solidity之Foundry安装配置(一)
  • Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复
  • shell 脚本中的 sh 和 bash 是有区别的
  • Ollama Linux 部署指南
  • 国产开源PDF解析工具MinerU
  • 【鸿蒙开发】第四十章 Form Kit(卡片开发服务)
  • JavaScript系列(79)--Web Worker 高级应用
  • 俄外长与美国务卿通电话,讨论俄美接触等问题
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • 俄媒:俄乌代表团抵达谈判会场
  • 竞彩湃|欧联杯决赛前,曼联、热刺继续划水?
  • 中方是否计划解除或调整稀土出口管制?外交部回应
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战