数据结构———链表

链表是经常用到的一种基础数据结构,接下来我们讲讲链表。

链表:

特点:

链表可分为有头/无头链表,循环/无环,双向/单向链表,每个链表节点都包含一个数据和下一个链表节点的地址。

每个链表节点都指向下一个链表节点,以达到连接的目的。

接下来我们基于C语言实现一个无头无环单向链表的增删查改功能。

代码实现:

链表数据结构定义:

首先定义链表节点的数据结构,用于后续链表实现:

typedef struct Node {
	int data;
	struct Node* Next;
}Node;

初始化链表节点:

有了链表的数据结构定义,接下来就应该是用值val初始化一个链表节点,并且返回该新节点的地址

Node* GetNewNode(int val) {
	Node* p = (Node*)malloc(sizeof(Node));
	p->data = val;
	p->Next = NULL;
	return p;
}

销毁链表:

由于使用了malloc函数来分配内存空间,所以我们就必须要实现一个函数用于释放分配的内存空间以防止内存泄漏:

void Free(Node *head) {
	if (head == NULL) {
		return;
	}
	for (Node *p = head, *q; p; p = q) {
		q = p->Next;
		free(p);
	}
	return;
}

链表的插入:

有了初始化和销毁链表的函数,那么接下来我们应该实现一个函数用于链表插入

在链表节点插入过程中,我们的操作顺序一定不能错,假设有链表节点D要插入到链表节点B后,第一步,首先将寻找链表节点B的地址,使链表指针指向链表节点B;

第二步,让链表节点D指向链表节点C;

第三步,让链表节点B指向链表节点D;

至此就完成了链表的插入。

对于头部和尾部的插入则更是简单,对于头部插入,只需要将待插入节点指向链表头部即可;

链表的插入
链表的插入

对于尾部插入,只需要将链表尾部指向待插入链表节点即可。

接下来是插入函数的C语言代码:

Node* Insert(Node* head, int pos, int val) {
	if (pos == 0) {
		Node* p = GetNewNode(val);
		p->Next = head;
		return p;
	}
	Node* p = head;
	for (int i = 0; i < pos - 1; i++) {
		p = p->Next;
	}
	Node* q = GetNewNode(val);
	q->Next = p->Next;
	p->Next = q;
	return head;
}

链表的删除:

假设删除某个链表节点B,我们只需要寻找到该链表节点的前一个链表节点A的地址并且保存链表节点B的地址,让链表节点A指向链表节点B的下一个节点,最后释放链表节点B即可。

其中,操作顺序一定不能改变,一定是先将A链表指向的B节点的下一个节点地址,然后释放链表节点B。

Node* Delete(Node* head, int pos) {
	if (pos == 0) {
		return;
	}
	Node* p = head;
	for (int i = 0; i < pos - 1; i++) {
		p = p->Next;
	}
	Node* q = p->Next;
	p->Next = q->Next;
	return head;
}

链表的查找:

假如查找某个特定数值A的链表节点地址,我们只需要顺序遍历一遍链表即可,若找到该链表节点则返回该节点的地址,反之返回一个NULL即可。

int Check(Node* head, int val) {
	Node* p = head;
	int n = 0;
	for (; p; p = p->Next) {
		if (p->data == val) {
			return n;
		}
		n++;
	}
	return NULL;
}

至此,我们就学习完了链表这一基础数据结构。

如果我的文章对你有所帮助,不妨给我个关注何点赞吧

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

树-层序遍历序列构造二叉树(mid)

一、问题描述 二、实现思路 问题给出了层序遍历序列&#xff0c;我们使用队列来实现二叉树的构造过程&#xff1a; 这里注意&#xff1a;在写代码时&#xff0c;比较字符串数组内元素str和某个字符串是否相等时用str.equals("#")的操作&#xff0c;如果用 会引发比较…

上市即交付,比亚迪秦L DM-i万人交车暨千媒众测开营

6月6日&#xff0c;“引领中级 开创油耗2时代”秦L DM-i万人交车暨千媒众测开营仪式在比亚迪大本营深圳盛大举行。 众多车主代表亲临现场&#xff0c;与全国各地的比亚迪4S店千店联动&#xff0c;将秦L DM-i全国交付推向新的高潮。发布即量产&#xff0c;上市即交付&#xff0…

leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历、 对称二叉树等的介绍

文章目录 前言一、单值二叉树二、相同的树三、二叉树的前序遍历四、二叉树的中序遍历五、二叉树的后序遍历六、另一棵树的子树七、二叉树的遍历八、 对称二叉树总结 前言 leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、…

STM32项目分享:智能家居语音系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB打板焊接图: 五、程序设计 六、实验效果 七、包含内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com…

删除的照片为什么总是反复出现?6种有效解决方案

在您使用手机时可能会遇到这样的问题&#xff1a;为什么删除了照片后它又回来了&#xff1f;这种奇怪的情况可能会让用户感到不安&#xff0c;并且质疑设备的可靠性。本文将解释导致这种现象的原因&#xff0c;并探讨确保永久删除图像的有效方法。让我们来解决“为什么我的照片…

【软件项目管理篇】怎样平衡软件质量与时间成本范围的关系?

你会发现&#xff0c;在实际的软件项目中不乏这样的例子&#xff1a; 一个项目&#xff0c;正常估算&#xff0c;要三个月才能完成&#xff0c;但是老板或客户要压缩到一个月完成&#xff0c;而你不知道如何说服他们&#xff1b;项目开发一半&#xff0c;产品经理告诉你&#…

智能电销机器人的作用和原理是什么?

要问世界上更火爆的创新技术&#xff0c;人工智能必然要算其一&#xff0c;人工智能正不断的改变着我们的生活&#xff0c;比如智能手机、智能家居、智能门锁等产品已经不断的渗透在了我们的生活之中&#xff0c;而近几年兴起的人工智能语音识别机器人&#xff0c;也迅速俘获了…

【蓝桥杯2025备赛】分巧克力

【蓝桥杯2025备赛】分巧克力 [蓝桥杯 2017 省 AB] 分巧克力 题目描述 儿童节那天有 K K K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N N N 块巧克力&#xff0c;其中第 i i i 块是 H i W i H_i \times W_i Hi​Wi​ 的方格组成的长方形…

GPT、Claude、Perplexity等AI集体宕机罢工,全球打工人崩溃了

就在昨天&#xff01;一个看似平常的周三上午&#xff0c;三大顶尖AI居然集体罢工了&#xff01; 首先&#xff0c;网友们发现OpenAI的ChatGPT崩了&#xff0c;接着Claude和Perplexity也接连陷入崩溃状态。而Gemini也出现了短暂下线问题&#xff0c;整整三个小时&#xff0c;这…

手写节流throttle

节流throttle 应用场景 滚动事件监听scroll&#xff1a;例如监听页面滚动到底部加载更多数据时&#xff0c;使用节流技术减少检查滚动位置的频率&#xff0c;提高性能。鼠标移动事件mousemove&#xff1a;例如实现一个拖拽功能&#xff0c;使用节流技术减少鼠标移动事件的处理…

封装了一个仿照抖音评论轮播效果的iOS轮播视图

效果图 原理 就是我们在一个视图里面有两个子视图&#xff0c;一个是currentView, 一个是willShowView,在一次动画过程中&#xff0c;我们改变current View的frame&#xff0c;同时改变willShowView的frame&#xff0c;同时&#xff0c;需要改变currentVIew 的transform.y不然…

酒店旅游API服务汇总

各大旅游平台常用API服务汇总&#xff1a; 实时房源服务【Airbnb】飞猪旅行开放服务途牛旅行开放平台API华为云数字差旅【差旅管理】动态信息接口【美团酒店】旅行商城商家管理API【马蜂窝】交易流程接口【美团酒店】电子导游【携程旅行】

【Linux】磁盘文件和软硬链接

上篇博客我们说了内存级文件&#xff0c;就是文件加载到内存中它的一些操作。那么不可能所有文件文件都要加载到内存中&#xff0c;大部分文件都要存在与一种可以永久性存储数据的硬件中&#xff0c;就是我们要说的磁盘。现在的笔记本电脑用的都是硬盘&#xff0c;你可以理解为…

12. MySQL 日志

文章目录 【 1. 日志的基本原理 】【 2. 错误日志 Error Log 】2.1 启动和设置错误日志2.2 查看错误日志2.3 删除错误日志 【 3. 二进制日志 Binary Log 】3.1 启动和设置二进制日志3.2 查看二进制日志3.3 删除二进制文件删除所有二进制日志删除小于指定编号的二进制日志删除创…

ICPC2024 邀请赛西安站(7/8/13)

心得 [ICPC2024 Xian I] ICPC2024 邀请赛西安站重现赛 - 比赛详情 - 洛谷 7表示赛时ac了7个&#xff0c;8表示含补题总共ac数&#xff0c;13表示题目总数 题目 M. Chained Lights 打表&#xff0c;发现只有k1是YES //#include <bits/stdc.h> #include<iostream&…

LCTF 2018 bestphp‘s revenge

考点:Soap原生类Session反序列化CRLF注入 <?php highlight_file(__FILE__); $b implode; call_user_func($_GET[f], $_POST); session_start(); if (isset($_GET[name])) { $_SESSION[name] $_GET[name]; } var_dump($_SESSION); $a array(reset($_…

路由黑洞处理

今天BGP基础实验碰到了路由黑洞 BGP承载于IGP之上&#xff0c;BGP路由天生要递归&#xff0c;才能找出口 在E的BGP去A&#xff0c;下一跳只有B&#xff0c;但是流量走了两条路&#xff0c;c和d BGP路由黑洞&#xff1a; 控制层面可达&#xff0c;数据层面不可达; 路由条目在BG…

查看远程桌面端口,查看服务器的远程桌面端口的方法

如果你正在寻找一种方法来检查服务器的远程桌面端口&#xff0c;那么请务必按照以下步骤操作&#xff0c;以确保准确且安全地获取所需信息。这不仅是一个技术问题&#xff0c;更是一个关于效率和安全性的重要议题。 首先&#xff0c;你需要明确&#xff0c;远程桌面端口通常是…

C++之第十一课

课程列表 十分抱歉拖更了这么久&#xff0c;在之前的第十课里也有网友反馈了一个问题&#xff1a; 说的没错&#xff0c;怪我在审稿时没有注意图片&#xff0c;所以这里修正一下&#xff1a; 在此也十分感谢“我有一些感想……”网友的提醒&#xff01; 好了&#xff0c;回到…

【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)

导航&#xff1a; 本文一些内容需要聚簇索引、非聚簇索引、B树、覆盖索引、索引下推等前置概念&#xff0c;虽然本文有简单回顾&#xff0c;但详细可以参考下文的【MySQL高级篇】 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成…