数据结构———链表

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

链表:

特点:

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

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

接下来我们基于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.rhkb.cn/news/342272.html

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

相关文章

0基础学习区块链技术——去中心化

大纲 去验证的中心化验证者如何验证验证者为什么要去传播 去确认的中心化去存储的中心化 “去中心化”是区块链技术的核心。那么我们该如何理解这个概念呢&#xff1f; 我们可以假想在一次现实转账中&#xff0c;有哪些“中心化”的行为&#xff1a; 判断余额是否足够。即判断…

SAP Build引言

前言 SAP Build 似乎是一个整合了很多低代码或无代码产品的平台&#xff0c;最早的时候应该都是各自分开的几个产品&#xff0c;近年合并到一块上了SAP Build平台 现在看官网的介绍应该是有三四个产品被集成进来了&#xff0c;分别是SAP IRPA&#xff0c;SAP Workflow&#xf…

怎么将图片里不需要的地方裁减掉?四种超好用的裁剪图片方法!

怎么将图片里不需要的地方裁减掉&#xff1f;在这个数字化时代&#xff0c;我们所处的世界变得更加多姿多彩&#xff0c;各种类型的图片不断涌现&#xff0c;从社交媒体上的自拍照到专业摄影师的作品&#xff0c;图片已经成为我们日常生活中不可或缺的一部分&#xff0c;然而&a…

docker网络详解

1. 网络模式 1.1 网络结构 当安装Docker以后&#xff0c;会自动创建三个网络。可以使用docker network ls命令列出这些网络。 $ docker network ls NETWORK ID NAME DRIVER SCOPE 440aefe8afa3 bridge bridge local aa8d6325580f host host …

flutter封装日历选择器(单日选择)

简单封装&#xff1a; 引入库&#xff1a;table_calendar import package:generated/l10n.dart; import package:jade/utils/JadeColors.dart; import package:jade/utils/Utils.dart; import package:util/easy_loading_util.dart; import package:flutter/material.dart; im…

低情商高情商的职场较量!有效职场沟通的技巧~

&#x1f538;你是否曾经在工作中遇到沟通障碍&#xff0c;导致项目进展缓慢&#xff0c;情绪受挫&#xff1f; &#x1f538;你是否渴望与同事建立更加紧密的关系&#xff0c;共同实现团队目标&#xff1f; &#x1f538;你是否想要在职场上展现更自信、高效的沟通能力&…

Python限制输入的数范围

在编程过程中&#xff0c;尤其是处理用户输入时&#xff0c;常常需要确保输入的数值在预期的范围内。这对于提高程序的鲁棒性和用户体验至关重要。本文将介绍如何使用Python限制用户输入的数值范围&#xff0c;并提供相应的代码示例和配图以帮助理解。 一、基础方法&#xff1…

5-Django项目--分页与搜索(资产页面)

目录 views/asset_data.py asset_data/asset_data.html 搜索与分页笔记: 搜索 整数搜索 字符串搜索 分页 views/asset_data.py # -*- coding:utf-8 -*- from django.shortcuts import render, redirect, HttpResponse from django.utils.safestring import mark_safe f…

从零开始:如何用Electron将chatgpt-plus.top 打包成EXE文件

文章目录 从零开始&#xff1a;如何用Electron将chatgpt-plus.top 打包成EXE文件准备工作&#xff1a;Node.js和npm国内镜像加速下载初始化你的Electron项目创建你的Electron应用运行你的Electron应用为你的应用设置图标打包成EXE文件结语 从零开始&#xff1a;如何用Electron将…

Linux系统安装APITable详细流程与远程访问本地平台数据分析

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前言 v…

Java中连接Mongodb进行操作

文章目录 1.引入Java驱动依赖2.快速开始2.1 先在monsh连接建立collection2.2 java中快速开始2.3 Insert a Document2.4 Update a Document2.5 Find a Document2.6 Delete a Document 1.引入Java驱动依赖 注意&#xff1a;启动服务的时候需要加ip绑定 需要引入依赖 <dependen…

Echarts柱状图数据太多,自定义长度之后,自适应浏览器缩放

不知道是不是最优解&#xff0c;但是当前解决了我遇到的问题&#xff0c;如有更好的方法&#xff0c;希望看到这篇文章的同学可以不吝指导一番&#xff0c;非常感谢 1、问题描述&#xff1a; 因Ecahrts柱状图数据有时多有时少&#xff0c;所以在数据达到一定程度之后&#xff…

java版CRM客户关系管理系统源码:CRM客户关系管理系统的功能详解

CRM客户关系管理系统是一款功能全面的客户管理工具&#xff0c;旨在帮助企业和销售团队提高客户管理效率&#xff0c;优化销售流程。该系统包含多个模块&#xff0c;覆盖了从线索到回款的全流程管理&#xff0c;为用户提供了一个集成化的客户关系管理平台。 一、待办事项模块&a…

Go语言-切片底层探索 —— 补充篇:切片和底层数组到底是什么关系?

之前的切片探索中&#xff0c;上篇通过一道算法题目&#xff0c;了解到切片的两大特性&#xff1a;一是&#xff1a;切片是引用类型&#xff0c;指向底层数组&#xff0c;修改其底层数组的时候&#xff0c;会影响切片中的值。二是&#xff1a;向切片中添加元素的时候&#xff0…

面试(03)————多线程

目录 一、线程和进程的区别&#xff1f; 二、并行和并发的区别&#xff1f; 三、线程创建的方式有哪些&#xff1f; 3.1、继承Thread类 3.2、实现Runnable接口 3.3、实现Callable接口 3.4、线程池 四、Runnable和Callable的区别&#xff1f; 五、在启动线程的时候&am…

Rocky Linux安装与基础配置

目录 背景与起源 主要特点 目标用户 发展前景 下载 安装 常用配置命令&#xff1a; 更换镜像源 Rocky Linux 是一个开源的、由社区驱动的操作系统&#xff0c;旨在使用 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源码构建的下游二进制兼容发行版。以下是关于…

Ubuntu22.04之解决:terminal使用alt+1/alt+2/alt+3失效问题(二百三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

2024050401-重学 Java 设计模式《实战代理模式》

重学 Java 设计模式&#xff1a;实战代理模式「模拟mybatis-spring中定义DAO接口&#xff0c;使用代理类方式操作数据库原理实现场景」 一、前言 难以跨越的瓶颈期&#xff0c;把你拿捏滴死死的&#xff01; 编程开发学习过程中遇到的瓶颈期&#xff0c;往往是由于看不到前进…

趣测小程序开发搭建,趣测趣玩小程序是何物?

一、趣测小程序简介 趣测趣玩小程序是一款提供趣味测试和玩乐功能的应用程序。用户可以通过该小程序参与各种有趣的测试&#xff0c;这些测试可能涵盖性格、情感、智力等多个方面&#xff0c;旨在为用户提供轻松愉快的体验。同时&#xff0c;该小程序还可能包含一些游戏元素&a…

Spring boot 随笔 1 DatasourceInitializer

0. 为啥感觉升级了 win11 之后&#xff0c;电脑像是刚买回来的&#xff0c;很快 这篇加餐完全是一个意外&#xff1a;时隔两年半&#xff0c;再看 Springboot-quartz-starter 集成实现的时候&#xff0c;不知道为啥我的h2 在应用启动的时候&#xff0c;不能自动创建quartz相关…