数据结构---单链表实现

news2024/11/24 0:45:15

单链表是什么

我的理解是“特殊的数组”,通过访问地址来连接起来

1怎么创建链表 ----通过结构体(成员有存入数据的data和指向下一个节点的地址的指针(结构体指针)next

初始架构---DataType 对应存入数据类型,此处的Node==struct node *

//头文件
#include<stdio.h>
//宏定义
#define DataType int 

//全局变量

//结构体
typedef struct node
{
	DataType data;
	struct node* next;
}node, * Node;

int main()
{


	return 0;
}

2初始化链表+尾插+打印



Node Init(Node phead)
{
	phead = (Node)malloc(sizeof(node));
	if (phead == -1)
		return -1;
	phead->next = NULL;
}

int PushBack(Node phead, DataType num)
{
	//创建新节点
	Node newnode = malloc(sizeof(node));
	newnode->next = NULL;
	newnode->data = num;
	//创建指针找到链表的尾,然后插入,
	Node p = NULL;
	//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了
	for (p = phead; p->next != NULL; p = p->next);
	p->next = newnode;
	return 0;
}

void show_list(Node phead)
{
	
	Node cur = NULL;
	cur = phead;
	//判断是否为空
	if (phead == NULL)
	{
		printf("NULL\n");
	}
	//遍历头节点没有数据所有从头节点下一个数据开始打印
	for (cur = phead->next; cur != NULL; cur = cur->next)
	{
		printf("%d->", cur->data);
	}
	printf("NULL\n");
}

现象:


//头文件
#include<stdio.h>
#include<stdlib.h>

//宏定义
#define DataType int 
//全局变量

//结构体
typedef struct node
{
	DataType data;
	struct node* next;
}node, * Node;

Node Init(Node phead)
{
	phead = (Node)malloc(sizeof(node));
	if (phead == -1)
		return -1;
	phead->next = NULL;
}

int PushBack(Node phead, DataType num)
{
	//创建新节点
	Node newnode = malloc(sizeof(node));
	newnode->next = NULL;
	newnode->data = num;
	//创建指针找到链表的尾,然后插入,
	Node p = NULL;
	//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了
	for (p = phead; p->next != NULL; p = p->next);
	p->next = newnode;
	return 0;
}

void show_list(Node phead)
{
	
	Node cur = NULL;
	cur = phead;
	//判断是否为空
	if (phead == NULL)
	{
		printf("NULL\n");
	}
	//遍历头节点没有数据所有从头节点下一个数据开始打印
	for (cur = phead->next; cur != NULL; cur = cur->next)
	{
		printf("%d->", cur->data);
	}
	printf("NULL\n");
}

int main()
{
	Node phead = NULL;
	phead = Init(phead);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	show_list(phead);

	return 0;
}

3添加删除和修改的功能 

删除时利用两个指针一个找一个删,再指向

修改就是在查找的基础上再加一个if判断

#define _CRT_SECURE_NO_WARNINGS
//头文件
#include<stdio.h>
#include<stdlib.h>

//宏定义
#define DataType int 
//全局变量

//结构体
typedef struct node
{
	DataType data;
	struct node* next;
}node, * Node;

Node Init(Node phead)
{
	phead = (Node)malloc(sizeof(node));
	if (phead == NULL)
		return -1;
	phead->next = NULL;
}

int PushBack(Node phead, DataType num)
{
	//创建新节点
	Node newnode = malloc(sizeof(node));
	newnode->next = NULL;
	newnode->data = num;
	//创建指针找到链表的尾,然后插入,
	Node p = NULL;
	//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了
	for (p = phead; p->next != NULL; p = p->next);
	p->next = newnode;
	return 0;
}

void show_list(Node phead)
{
	
	Node cur = NULL;
	cur = phead;
	//判断是否为空
	if (phead == NULL)
	{
		printf("NULL\n");
	}
	//遍历头节点没有数据所有从头节点下一个数据开始打印
	for (cur = phead->next; cur != NULL; cur = cur->next)
	{
		printf("%d->", cur->data);
	}
	printf("NULL\n");
}
int Delect(Node phead,DataType num)
{
	if (phead == NULL)
	{
		printf("peahd is NULL\n");
		return -1;
	}
	Node cur1= NULL;
	Node cur2 = NULL;
	for (cur1 = phead, cur2 = phead->next; cur1->next != NULL; cur1 = cur2, cur2 = cur2->next)
	{
		if (cur2->data == num)
		{
			cur1->next = cur2->next;
			free(cur2);
			return 0;
			}
	}
	printf("no find num\n");
	return -1;
}

int Change(Node phead, int num1, int num2)
{
	if (phead == NULL)
	{
		printf("peahd is NULL\n");
		return -1;
	}
	Node cur = NULL;
	for (cur = phead->next;cur != NULL; cur = cur->next)
	{
		if (cur->data == num1)
		{
			cur->data = num2;
			return 0;
		}
	}
	printf("no find num1\n");
	return -1;
}
int main()
{
	Node phead = NULL;
	phead = Init(phead);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	Change(phead, 1, 2);
	show_list(phead);
	Delect(phead, 1);
	show_list(phead);
	Delect(phead, 1);
	Delect(phead, 1);
	Delect(phead, 1);
	show_list(phead);
	Delect(phead, 1);
	show_list(phead);
	Change(phead, 1, 2);
	show_list(phead);

	return 0;
}

4释放---释放后链表为空,不会显示后面功能


void Releas(Node phead)
{
	Node cur1 = NULL;
	Node cur2 = NULL;
	for (cur1 = cur2 = phead; cur1->next != NULL; cur1 = cur2)
	{
		cur2 = cur1->next;
		free(cur1);
	}
}
int main()
{
	Node phead = NULL;
	phead = Init(phead);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	Change(phead, 1, 2);
	Releas(phead);
	show_list(phead);
	Delect(phead, 1);
	show_list(phead);
	Delect(phead, 1);
	Delect(phead, 1);
	Delect(phead, 1);
	show_list(phead);
	Delect(phead, 1);
	show_list(phead);
	Change(phead, 1, 2);
	show_list(phead);

	return 0;
}

5最终代码---链表实现方法有很多掌握自己熟练的解决问题才是关键

#define _CRT_SECURE_NO_WARNINGS
//头文件
#include<stdio.h>
#include<stdlib.h>

//宏定义
#define DataType int 
//全局变量

//结构体
typedef struct node
{
	DataType data;
	struct node* next;
}node, * Node;

Node Init(Node phead)
{
	phead = (Node)malloc(sizeof(node));
	if (phead == NULL)
		return -1;
	phead->next = NULL;
}

int PushBack(Node phead, DataType num)
{
	//创建新节点
	Node newnode = malloc(sizeof(node));
	newnode->next = NULL;
	newnode->data = num;
	//创建指针找到链表的尾,然后插入,
	Node p = NULL;
	//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了
	for (p = phead; p->next != NULL; p = p->next);
	p->next = newnode;
	return 0;
}

void show_list(Node phead)
{
	
	Node cur = NULL;
	cur = phead;
	//判断是否为空
	if (phead == NULL)
	{
		printf("NULL\n");
	}
	//遍历头节点没有数据所有从头节点下一个数据开始打印
	for (cur = phead->next; cur != NULL; cur = cur->next)
	{
		printf("%d->", cur->data);
	}
	printf("NULL\n");
}
int Delect(Node phead,DataType num)
{
	if (phead == NULL)
	{
		printf("peahd is NULL\n");
		return -1;
	}
	Node cur1= NULL;
	Node cur2 = NULL;
	for (cur1 = phead, cur2 = phead->next; cur1->next != NULL; cur1 = cur2, cur2 = cur2->next)
	{
		if (cur2->data == num)
		{
			cur1->next = cur2->next;
			free(cur2);
			return 0;
			}
	}
	printf("no find num\n");
	return -1;
}

int Change(Node phead, int num1, int num2)
{
	if (phead == NULL)
	{
		printf("peahd is NULL\n");
		return -1;
	}
	Node cur = NULL;
	for (cur = phead->next;cur != NULL; cur = cur->next)
	{
		if (cur->data == num1)
		{
			cur->data = num2;
			return 0;
		}
	}
	printf("no find num1\n");
	return -1;
}
void Releas(Node phead)
{
	Node cur1 = NULL;
	Node cur2 = NULL;
	for (cur1 = cur2 = phead; cur1->next != NULL; cur1 = cur2)
	{
		cur2 = cur1->next;
		free(cur1);
	}
}
int main()
{
	Node phead = NULL;
	phead = Init(phead);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	PushBack(phead, 1);
	Change(phead, 1, 2);
	Releas(phead);
	show_list(phead);
	Delect(phead, 1);
	show_list(phead);
	Delect(phead, 1);
	Delect(phead, 1);
	Delect(phead, 1);
	show_list(phead);
	Delect(phead, 1);
	show_list(phead);
	Change(phead, 1, 2);
	show_list(phead);

	return 0;
}

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

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

相关文章

一款基于Java外卖配送系统,专为多商户入驻设计,包含用户端、商家端、配送端以及总管理后台(附源码)

前言 在当前的外卖配送市场中&#xff0c;软件系统的状态常常面临一些挑战&#xff0c;例如多商户管理复杂性、用户体验不一致、后端服务的稳定性和安全性等。这些痛点不仅影响了商户和用户的满意度&#xff0c;也限制了平台的扩展性和发展潜力。 为了解决这些现状&#xff0…

B站搜索建库架构优化实践

前言 搜索是B站的重要基础功能&#xff0c;需要对包括视频、评论、图文等海量的站内优质资源建立索引&#xff0c;处理来自用户每日数亿的检索请求。离线索引数据的正确、高效产出是搜索业务的基础。我们在这里分享搜索离线架构整体的改造实践&#xff1a;从周期长&#xff0c;…

【论文阅读】BoT-SORT: Robust Associations Multi-Pedestrian Tracking

题目&#xff1a;BoT-SORT: Robust Associations Multi-Pedestrian Tracking 作者&#xff1a;Nir Aharon* Roy Orfaig Ben-Zion Bobrovsky motivation: 作者来得很直接&#xff0c;就说他们用相机运动模型和优化卡尔曼做了个可以解决具有挑战的跟踪问题的算法:BOT-SORT;说他们…

工程数学线性代数(同济大学数学系)第六版(更新中)

第1章 行列式 2 全排列和对换 一、排列及其逆序数 全排列 1个逆序、逆序数 奇排列&#xff0c;偶排列 二、对换 对换&#xff1a;排列中任意两个元素对调 相邻对换&#xff1a;相邻两个元素对换 对换改变排列的奇偶性。 4 行列式的性质 5 行列式按行&#xff08;列&…

有趣的的rce漏洞复现分析

目录 无字母数字绕过正则表达式 解读代码 解题思路 异或 或 取反 无字母数字绕过正则表达式 首先我们依然是搭建环境&#xff08;环境依然是Ubuntu下部署&#xff0c;和之前的漏洞环境一样&#xff09; <?php error_reporting(0); highlight_file(__FILE__); $code…

<数据集>车间工人、安全帽、安全背心识别<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3465张 标注数量(xml文件个数)&#xff1a;3465 标注数量(txt文件个数)&#xff1a;3465 标注类别数&#xff1a;3 标注类别名称&#xff1a;[person, helmet, vest] 序号类别名称图片数框数1person346594732helm…

Android 13 GMS 内置壁纸

如图&#xff0c;原生系统上&#xff0c;设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸&#xff0c;就显示默认的壁纸。点击进去就是预览页面 扩展下&#xff0c;默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…

云开发微信小程序--即时聊天(单人聊天,多人聊天室)

云开发微信小程序–即时聊天 介绍&#xff1a;本小程序包含欢迎界面&#xff0c;注册&#xff0c;登录&#xff0c;一对一聊天&#xff0c;群聊&#xff0c;好友添加请求验证过程&#xff0c;修改好友备注以及删除好友&#xff0c;退出群聊&#xff0c;特殊角色卡片展示&#…

Android中的EventBus的用法

1. EventBus简介 EventBus是一个优化了的事件发布/订阅模式实现的库&#xff0c;常用于Android程序组件间的通信。它可以简化不同组件之间的通信工作&#xff0c;避免复杂和耦合的依赖关系。EventBus通过事件驱动来降低代码耦合度&#xff0c;提高开发效率和代码清晰性。 2. …

自动化数据采集:Lua爬虫与JSON解析的深度整合

在互联网数据采集领域&#xff0c;自动化技术的应用日益广泛。Lua语言以其轻量级和灵活性&#xff0c;成为开发高效爬虫的理想选择。而JSON作为Web数据交换的标准格式&#xff0c;其解析技术在Lua爬虫开发中占据了核心地位。本文将探讨如何将Lua爬虫与JSON解析深度整合&#xf…

C++学习指南(四)------string

欢迎来到繁星的CSDN。本期内容主要包括字符串string。 一、什么是string&#xff1f; C语言中的string 我们在C语言中已经遇到过字符串了。 那为什么C还要单独的列出来string呢&#xff1f; 尽管这里包的头文件是iostream&#xff0c;但arr数组储存常量字符串123456789的形式仍…

Leetcode - 周赛410

目录 一&#xff0c;3248. 矩阵中的蛇 二&#xff0c;3249. 统计好节点的数目 三&#xff0c;3250. 单调数组对的数目 I dfs记忆化 dfs记忆化1&#xff1a;1改递推 四&#xff0c;3251. 单调数组对的数目 II 一&#xff0c;3248. 矩阵中的蛇 本题就是一道纯模拟题&#x…

JavaScript Web API入门day3

目录 1.事件流 1.1 事件流和两个阶段说明 1.2 事件捕获 1.3 事件冒泡 1.4 阻止冒泡 1.5 解除默认行为 1.6 解绑事件 2.事件委托 3.其他事件 3.1 页面加载事件 3.1.1 load方式 3.1.2 DOMContentLoaded 3.2 元素滚动事件 3.2.1 什么是元素滚动事件 3.2.2 获取元素…

【qt小系统】通过qt折线图实现论文内容-快餐店排队效能分析

摘要&#xff1a; 商户收银需求与收银能力不匹配&#xff0c;是一个普遍问题&#xff0c;高峰不足/平常过剩。参考论文《混合制排队模型下中式快餐店排队系统的优化_荣艳蕊.pdf》&#xff0c;本文主要使用QT5、QtChart等完成了基于以上论文模型的关于排队模型优化的图表对比功能…

精品UI资源下载分享类响应式模板素材资源下载站源码

在其他网站看到的这个源码&#xff0c;感觉UI挺漂亮的&#xff0c;就搬来了。 感兴趣的自己下载后搭建下看看&#xff0c;个人感觉UI很漂亮 2024/8/10修复&#xff1a; 标签页面显示的文章跳转链接不正确 源码下载&#xff1a;https://download.csdn.net/download/m0_66047…

开源免费的表单收集系统TDuck

TDuck&#xff08;填鸭表单&#xff09;是一款开源免费的表单收集系统&#xff0c;它基于Apache 2.0协议开源&#xff0c;用户可以随时下载源码&#xff0c;自由修改和定制&#xff0c;也可以参与到项目的贡献和反馈中。TDuck表单系统不仅支持私有化部署&#xff0c;还提供了丰…

uniapp预览图片uni.previewImage图片放大

<image v-if"file.image!" :src"file.image" click"previewImage(file.image)"></image>file: {image: ,status: 1}, // 预览 图片previewImage() {uni.previewImage({current: 1,urls: [this.img] // 是个 数组 单张的&#xff08…

【产品那些事】什么是应用程序安全态势管理(ASPM)?

文章目录 前言当前应用安全(AppSec)推进遇到的问题关于ASPM的定义 为什么需要ASPM&#xff1a;B端客户核心需求ASPM产品关键策略理想状态下的ASPMASPM与CSPM的区别国内外产品参考 前言 随着现代软件开发实践的快速演变&#xff0c;特别是在敏捷开发和 DevOps 的推动下&#xf…

与人工智能相比,人类智能里包含有信仰

信仰是人类智能的一个重要方面&#xff0c;它影响我们的意图、动机、决策和行为。 人类智能中信仰是一种独特的因素&#xff0c;影响我们如何看待世界、做决定以及形成价值观。与此相比&#xff0c;人工智能虽然可以处理大量数据并模拟决策过程&#xff0c;但它不具备信仰、情感…

哈尔滨等保测评的政策解读与最佳实践分享

哈尔滨&#xff0c;这座北方城市&#xff0c;在数字化转型的浪潮中&#xff0c;对网络安全的重视程度日益提升。其中&#xff0c;等保测评&#xff08;等级保护测评&#xff09;作为信息安全领域的基石政策&#xff0c;正引领企业构建坚不可摧的安全防线。今天&#xff0c;就让…