【数据结构】 单向链表的实现

单向链表是数据结构中的一种,它由节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储节点的值,指针域则用于指向下一个节点。单向链表的特点是只能从头节点开始遍历到尾节点,不能反向遍历。

1 单向链表的节点定义

typedef struct node
{
    int data; //数据域 用来存放数据 整型
    struct node * next; //指针域 用来存放下一个节点的首地址
}link_node_t;
单向链表的操作 ( 有头的单向链表 )
//1. 创建一个空的链表 createEmpty()
//2. 遍历链表的有效元素 showLinknode()
//3. 求链表的长度 getLen()
//4. 向链表的指定位置插入数据 insertInto
//5. 判断链表是否为空 , 空返回 1 ,未空返回 0 isEmpty()
//6. 删除链表指定位置的数据 deleteFrom()
//7. 查找指定数据,出现在链表中的位置 findData()
//8. 清空链表 clear()

2.创建一个空的链表 

//1.创建一个空的链表(本质上只有一个头节点链表,将头节点的首地址返回)
link_node_t* createEmptyLinklist()
{
    //创建一个空的头节点
    link_node_t* p = malloc(sizeof(link_node_t));
    if(p == NULL)
    {
        printf("createEmptyLinklist malloc failed!!\n");
        return NULL;//表达申请失败
    }
    //申请空间,就是为了装东西
    p->next = NULL;//指针域初始化为NULL,数据域不用初始化,因为头节点数据域无效
    //将头节点的首地址返回
    return p;
}

3.遍历有头链表的有效元素

void showLinklist(link_node_t* p)
{
    while(p->next != NULL)
    {
        p = p->next;
        printf("%d ",p->data);
    }
    printf("\n");
}

4.求链表的长度  

int getLengthLinklist(link_node_t* p)
{
    int len = 0;//统计长度
    while(p->next != NULL)
    {
        p = p->next;
        len++;//打印一次,就计数一次
    }
    return len;
}

5.判断链表是否为空,空返回1,未空返回0

//6. 判断链表是否为空 空返回1,未空返回0
int isEmptyLinklist(link_node_t* p)
{
    //p指向头节点
    //p->next代表头节点的指针域,头节点的指针域为空,说明后面什么没有了
    return p->next == NULL ? 1 : 0;
}

6.向链表的指定位置插入数据

编程思想 :
0. 容错判断( post <= 0 || post > getLinkLen ( p ) + 1
1. 创建新的节点,保存插入的数据 x 也就是 100
2. 将头指针移动到插入位置的前一个位置
3. 将新的节点插入 ( 先连后面,再连前面 )
int insertIntoLinklist(link_node_t* p, int post, int x)
{
    int i;
    //0.容错判断
    if(post < 1 || post > getLengthLinklist(p)+1)
    {
        printf("insertIntoLinklist failed!!\n");
        return -1;
    }
    //1.创建一个新的节点,保存插入的数据x
    link_node_t* pnew = malloc(sizeof(link_node_t));
    if(pnew == NULL)
    {
        printf("pnew malloc failed!!\n");
        return -1;
    }
    //申请空间,就是为了装东西,立刻装东西
    pnew->data = x;
    pnew->next = NULL;
    //准备开始插入
    //2.将头指针指向(移动)插入位置的前一个位置
    for(i = 0; i < post-1; i++)
        p = p->next;
    //3.将新节点插入链表(先连后面,再连前面)
    pnew->next = p->next;//连后面
    p->next = pnew;//连前面
    return 0;
}

7.删除链表指定位置的数据

编程思想 :
1. 将头指针移动到删除位置的前一个位置
2. 定义一个指针,指向被删除节点
3. 跨过被删除节点
4. 释放被删除节点
int deleteFromLinklist(link_node_t* p, int post)
{
    //0.容错判断
    if(post < 1 || post > getLengthLinklist(p) || isEmptyLinklist(p))
    {
        printf("deleteFromLinklist failed!!\n");
        return -1;
    }
    //1. 将头指针移动到删除位置的前一个位置
    int i;
    for(i = 0; i < post-1; i++)
        p = p->next;
    //2.定义了指针变量4个字节,指向被删除节点
    link_node_t* pdel = p->next;
    //3.跨过被删除节点
    p->next = pdel->next;
    //4. 释放被删除节点
    free(pdel)
    pdel = NULL;
    return 0;
}

8.清空链表

编程思想:
1. 将头指针移动到删除位置的前一个位置 可以不写
2. 定义了指针变量 4 个字节 , 指向被删除节点
3. 跨过被删除节点
4. 释放被删除节点
void clearLinklist(link_node_t* p)
{
    //砍头思想:每次删除的是头节点的下一个节点
    while(p->next != NULL)
    //只要链表不为空,就执行删除操作 p->next == NULL循环结束,此时是空的表
    {
        //1. 将头指针移动到删除位置的前一个位置
        //第一步可以省略不写,因为每次删除的是头节点的下一个节点,
        //那么头节点就是每次被删除节点的前一个位置
        //2.定义了指针变量4个字节,指向被删除节点
        link_node_t* pdel = p->next;
        //3.跨过被删除节点
        p->next = pdel->next;
        //4. 释放被删除节点
        free(pdel);
        pdel = NULL;
    }
}

9.查找指定数据x出现的位置

int searchDataLinklist(link_node_t* p, int x)
{
    int post = 0;
    while(p->next != NULL)
    {
        p = p->next;
        post++;//用来记录第几个
        if(p->data == x)
            return post;//返回值是第几个
    }
    return -1;//不存在
}

结语

以上就是单向链表的基本使用,本次代码分享到此结束,后续还会分享单向链表的尾插法以及头插法。最后的最后,还请大家点点赞,点点关注,谢谢大家!

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

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

相关文章

近屿OJAC带你解读:什么是预训练(pre-training)?

预训练&#xff08;Pre-training&#xff09;是深度学习中一种常见的技术&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;和计算机视觉等领域。预训练模型的目的是在特定任务之前&#xff0c;先在大量数据上训练一个模型&#xff0c;使其学习到通用的特征和知识。…

EelasticSearch安装及分词器安装

Docker安装 首先在你的linux系统的opt目录下创建一个es7文件夹&#xff0c;然后再在里面创建一个data文件夹&#xff08;data可省略在运行下面命令时它会自动创建&#xff09; docker run -d --name es7 -e ES_JAVA_POTS"-Xms256m -Xmx256m" -e "discovery.ty…

Ai2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe illustrator&#xff0c;常被称为“AI”&#xff0c;是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。作为一款非常好的矢量图形处理工具&#xff0c;该软件主要应用于印刷出版、海报书籍排版、专业插画、多…

Vue3从入门到实战:深度掌握组件通信(下部曲)

5.组件通信方式5-$attrs $attrs的概念&#xff1a; 在Vue中&#xff0c;$attrs 是一个特殊的属性&#xff0c;用于访问父组件向子组件传递的非特定属性。它可以让子组件轻松地获取父组件传递的属性&#xff0c;而无需在子组件中显式声明这些属性。 想象一下你有一个父组件和…

Latent Guard、Tokenization in LLM、​3D Human Scan、FusionPortableV2

本文首发于公众号&#xff1a;机器感知 https://mp.weixin.qq.com/s/HlVV3VnqocBI4XBOT6RFHg A Multi-Level Framework for Accelerating Training Transformer Models The fast growing capabilities of large-scale deep learning models, such as Bert, GPT and ViT, are r…

微软开源 WizardLM-2,70B优于GPT4-0613,7B持平阿里最新的Qwen1.5-32B

当地时间4月15号&#xff0c;微软发布了新一代大语言模型 WizardLM-2&#xff0c;新家族包括三个尖端型号:WizardLM-2 8x22B, WizardLM-2 70B&#xff0c;和WizardLM-2 7B&#xff0c;作为下一代最先进的大型语言模型&#xff0c;它在复杂聊天、多语言、推理和代理方面的性能有…

算法打卡day37

今日任务&#xff1a; 1&#xff09;1049. 最后一块石头的重量 II 2&#xff09;494. 目标和 3&#xff09;474.一和零 4&#xff09;复习day12 1049. 最后一块石头的重量 II 题目链接&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 题目难…

B1100 校庆

输入样例&#xff1a; 5 372928196906118710 610481197806202213 440684198612150417 13072819571002001X 150702193604190912 6 530125197901260019 150702193604190912 220221196701020034 610481197806202213 440684198612150417 370205198709275042 输出样例&#xff1a;…

LINUX中使用cron定时任务被隐藏,咋回事?

一、问题现象 线上服务器运行过程中&#xff0c;进程有莫名进程被启动&#xff0c;怀疑是有定时任务自动启动&#xff0c;当你用常规方法去查看&#xff0c;比如使用crontab去查看定时器任务&#xff0c;提示no crontab for root 或者使用cat到/var/spool/cron目录下去查看定时…

python使用uiautomator2操作真机(华为Honor 10)

环境&#xff1a; python3.8.10&#xff0c;华为手机Honor 10(6G,64g)&#xff0c;版本android 9。 之前写过一篇文章&#xff1a; python使用uiautomator2操作真机_python uiautomator2 控制真机-CSDN博客 今天再拿另外一部手机测试。 一、将手机设置为开发者模式 1、设…

基于ssm冀中工程技师校园网站设计与实现论文

摘 要 使用旧方法对冀中工程技师学院网站的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在冀中工程技师学院网站的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次…

【数据恢复软件】:Magnet AXIOM V8.0

Magnet AXIOM V8.0重大更新 1、全新的UI设计 2、更快的相应速度 3、补全工件分析 4、支持亚马逊AWS云数据&#xff08; 获取同一帐户或安全帐户上下文中的快照。 支持Windows实例、加密卷和超过1 TB的卷、具有多个卷的实例等等&#xff01; &#xff09; 5、Bug修复 6、AI支持…

Promise模块化编程ES6新特性

文章目录 Promise&模块化编程1.Promise基本介绍2.快速入门1.需求分析2.原生ajax jQuery3.Promise使用模板 3.课后练习1.原生ajax jQuery2.promise 4.模块化编程基本介绍5.CommonJS基本介绍6.ES5模块化编程1.题目2.示意图3.代码实例—普通导入导出function.jsuse.js 4.代码…

JVM垃圾回收与算法

1. 如何确定垃圾 1.1 引用计数法 在 Java 中&#xff0c;引用和对象是有关联的。如果要操作对象则必须用引用进行。因此&#xff0c;很显然一个简单 的办法是通过引用计数来判断一个对象是否可以回收。简单说&#xff0c;即一个对象如果没有任何与之关 联的引用&#xff0c;即…

推荐系统综述

推荐系统研究综述 - 中国知网 传统推荐方法主要分类&#xff1a; 1)基于内容推荐方法 主要依据用户与项目之间的特征信息,用户之间的联系不会影响推荐结果,所以不存在冷启动和稀疏问题,但是基于内容推荐的结果新颖程度低并且面临特征提取的问题。 基于内容的推荐方法的思想非…

能源成果3D网络三维展厅越发主流化

在这个数字化飞速发展的时代&#xff0c;我们为您带来了全新的展览形式——线上3D虚拟展厅。借助VR虚拟现实制作和web3d开发技术&#xff0c;我们能够将物品、图片、视频和图文信息等完美融合&#xff0c;通过计算机技术和3D建模&#xff0c;为您呈现一个逼真、生动的数字化展览…

动态规划|1049.最后一块石头的重量II

力扣题目链接 class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum 0;for (int i 0; i < stones.size(); i) sum stones[i];int target sum / 2;for (int i 0; i < stones.size(); i) { // 遍…

开源项目one-api的k8s容器化部署(下)-- 部署至k8s

一、接着上文 本文讲述如何把上文制作好的docker镜像部署到K8S&#xff0c;会涉及以下部分&#xff1a; 健康检测应用程序的配置应用程序的端口日志路径 二、健康检测 1、健康状态 从官方的docker-compose.yml可以得知其健康检测方法 curl http://localhost:5175/api/statu…

03-JAVA设计模式-迭代器模式

迭代器模式 什么是迭代器模式 迭代器模式&#xff08;demo1.Iterator Pattern&#xff09;是Java中一种常用的设计模式&#xff0c;它提供了一种顺序访问一个聚合对象中各个元素&#xff0c;而又不需要暴露该对象的内部表示的方法。迭代器模式将遍历逻辑从聚合对象中分离出来…

Latex学习(从入门到入土)2

第一章 &#xff1a;插图 在LaTeX中插入插图可以通过graphicx宏包来实现&#xff0c;这个宏包提供了强大的图像处理功能。以下是如何使用graphicx宏包插入图像的基本步骤&#xff1a; ### 1. 加载宏包 在文档的序言部分&#xff08;\begin{document}之前&#xff09;&#x…
最新文章