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

server/2024/10/18 22:31:02/

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

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.创建一个新的节点,保存插入的数据xlink_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.ppmy.cn/server/5633.html

相关文章

怎么用手机远程控制电脑 远程控制怎么用

怎么用手机远程控制电脑&#xff1a;远程控制怎么用 在这个科技日新月异的时代&#xff0c;远程控制电脑已经成为了很多人的需求。有时&#xff0c;我们可能在外出时突然需要访问家中的电脑&#xff0c;或者在工作中需要远程操控办公室的电脑。这时&#xff0c;如果能用手机远…

服务器有哪些特性?

服务器是计算机的一种&#xff0c;但是和普通的计算机是不同的&#xff0c;服务器比普通计算机的运行速度更快、负载能力更高&#xff0c;可以在网络中为其它客户机或是大型设备提供计算或者是应用服务&#xff0c;服务器有着高速的CPU运算能力、能够进行长时间的运行有着更好的…

Leetcode 560. 和为 K 的子数组和Leetcode 189. 轮转数组

文章目录 Leetcode 560. 和为 K 的子数组题目描述C语言题解和思路解题思路 Leetcode 189. 轮转数组题目描述C语言题解和思路解题思路 Leetcode 560. 和为 K 的子数组 题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数…

计算机视觉——OpenCV Python位运算与图像掩码

概述 位运算与图像掩码的结合允许对图像的特定区域进行精确的操作。通过使用位运算&#xff08;如AND、OR、XOR和NOT&#xff09;&#xff0c;可以基于掩码的选择性地修改图像数据。位运算与图像掩码结合使用的一些关键点和应用场景&#xff1a; 选择性修改&#xff1a; 通过位…

【后端】Thymeleaf模板引擎学习笔记

文章目录 1. java体系模板引擎介绍2. 使用2.1 初步使用 视频地址 1. java体系模板引擎介绍 FreeMarkerThymeleafVelocity 2. 使用 2.1 初步使用 引入依赖 <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><…

C++知识点总结(30):递归进阶练习

递归进阶练习 一、 2 2 2 的幂数1. 审题2. 参考答案2.1 递归2.2 循环 二、汉诺塔移动次数1. 审题2. 思路3. 参考答案 三、数字乘积分解1. 审题2. 参考答案 四、数字重复分解1. 审题2. 参考答案 五、烤鸡调料1. 审题2. 参考答案 一、 2 2 2 的幂数 1. 审题 如果这个整数是由若…

Sublime Text下载,安装,安装插件管理器,下载汉化插件

SublimeTest官网 © Sublime Text中文网 下载安装 一路点击安装即可 安装插件管理器 管理器官网安装 - 包控制 (packagecontrol.io) 手动安装将3 位置点击网址下载 再打开SublimeTest 点击 选择第一个Browse Packages..... 将会跳转到文件夹中 进入上一个文件夹 在进入…

vscode设置conda默认python环境,简单有效

本地conda 可能安装了各种环境&#xff0c;默认的vscode总是base环境&#xff0c;这时你想要在vscode调试python代码&#xff0c;使用默认的环境没有安装对应的包就会遇到报错解决这个问题的方法很简单ctrlshiftp 调出命令面板 再输入 select interpreter , 选择 python 选择解…