【零基础学数据结构】链表

 

目录

1.链表的概念

​编辑 2.链表的雏形

​编辑 3.链表的组成

​编辑 4.链表代码

 4.1创建节点

 4.2链表的打印

 4.3链表的尾插

 4.4链表的头插

 4.5链表的尾删

 4.6链表的头删

 4.7链表的查找

 4.8链表在指定位置之前插⼊数据

 4.9链表在指定位置之后插⼊数据

 4.9-1删除pos节点

 4.9-2删除pos之后的节点

4.9-3销毁链表

补充:测试文件:


1.链表的概念

 2.链表的雏形

 3.链表的组成

 4.链表代码

 创建准备;

  • SListNode.h文件
  • SListNode.c文件
  • text.c文件 

 4.1创建节点

 数据+指向下一个节点的指针

// 首先定义数据的类型,方便后续更改
typedef int SLTNodeDataType;// 创建节点
typedef struct SListNode
{SLTNodeDataType data; // 存储数据struct SListNode* next;// 指向下一个节点的指针
}SLTNode;

 4.2链表的打印

 头文件声明:

void SLTPrint(SLTNode* phead);

执行文件代码实现: 

// 链表的打印
void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;// 保证phead指向的位置是收节点,方便后续再次遍历while (pcur)// 等价于 pcur != NULL;{printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}

 4.3链表的尾插

 头文件声明:

void SLTPushBack(SLTNode** pphead, SLTNodeDataType x);
// 创建新的节点
SLTNode* SLTBuyNode(SLTNodeDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (NULL == newnode){perror("SLTBuyNode malloc err!");exit(1);}// 创建节点成功newnode->data = x;newnode->next = NULL;// 返回return newnode;
}

 执行文件代码实现: 

// 链表的尾插
void SLTPushBack(SLTNode** pphead, SLTNodeDataType x)
{// 传参不可为空assert(pphead);// 创建一个新的节点SLTNode* newnode = SLTBuyNode(x);// 空链表和非空链表if (*pphead == NULL){*pphead = newnode;}else{// 找尾巴SLTNode* ptail = *pphead;while (ptail->next) // 等价于ptail->next !=NULL;{ptail = ptail->next;}// 找到尾巴,开始连接ptail->next = newnode;}}

 4.4链表的头插

  头文件声明:

// 链表的头插
void SLTPushFront(SLTNode** pphead, SLTNodeDataType x);

 执行文件代码实现:

// 链表的头插
void SLTPushFront(SLTNode** pphead, SLTNodeDataType x)
{// 传参不可为空assert(pphead);// 创建一个新的节点SLTNode* newnode = SLTBuyNode(x);// 头插newnode->next = *pphead;*pphead = newnode;
}

 4.5链表的尾删

 头文件声明:

void SLTPopBack(SLTNode** pphead);

  执行文件代码实现:

// 链表的尾删
void SLTPopBack(SLTNode** pphead)
{// 链表不可以为空,传参不可为空assert(pphead && *pphead);// 链表有一个节点和多个节点// 一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else //多个节点{// 找尾SLTNode* prev = *pphead;SLTNode* ptail = *pphead;while (ptail->next){prev = ptail;ptail = ptail->next;}free(ptail); // 释放空间ptail = NULL;// 防止野指针prev->next = NULL;}}

 4.6链表的头删

 头文件声明:

void SLTPopFront(SLTNode** pphead);

   执行文件代码实现:

// 链表的头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}

 4.7链表的查找

 头文件声明:

SLTNode* SLTFind(SLTNode* phead, SLTNodeDataType x);

 执行文件代码实现:

// 链表的查找
SLTNode* SLTFind(SLTNode* phead, SLTNodeDataType x)
{SLTNode* prev = phead;while (prev)// 等价于 prev != NULL;{if (prev->data == x){return prev;}prev = prev->next;}// 遍历完毕没有找到,返回空。return NULL;
}

 4.8链表在指定位置之前插⼊数据

 头文件声明:

void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTNodeDataType x);

 执行文件代码实现:

// 链表在指定位置之前插⼊数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTNodeDataType x)
{// 不可以传入NULLassert(pphead && *pphead);assert(pos);// 创建一个新的节点SLTNode* newnode = SLTBuyNode(x);// 如果节点只有一个,就是头插if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* pcur = *pphead;// pcur所指向的节点不为pos前一个节点while (pcur->next != pos){pcur = pcur->next;}// pcur所指向的节点为pos前一个节点newnode->next = pos;pcur->next = newnode;}
}

 4.9链表在指定位置之后插⼊数据

  头文件声明:

void SLTInsertAfter(SLTNode* pos, SLTNodeDataType x);

 执行文件代码实现:

// 链表在指定位置之后插⼊数据
void SLTInsertAfter(SLTNode* pos, SLTNodeDataType x)
{assert(pos);// 创建要插入的节点SLTNode* newnode = SLTBuyNode(x);// 开始插入newnode->next = pos->next;pos->next = newnode;
}

 4.9-1删除pos节点

 头文件声明:

void SLTErase(SLTNode** pphead, SLTNode* pos);

  执行文件代码实现:

//删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);if (*pphead == pos){SLTPopFront(pphead);}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}// prev所指向的就是pos前一个节点prev->next = pos->next;free(pos);pos = NULL;}}

 4.9-2删除pos之后的节点

 头文件声明:

void SLTEraseAfter(SLTNode* pos);

 执行文件代码实现:

//删除pos之后的节点
void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next); // 传过来的参数不可以为空,pos下一个的参数也不可以是NULLSLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}

4.9-3销毁链表

 文件声明:

void SListDesTroy(SLTNode** pphead);

 执行文件代码实现:

//销毁链表
void SListDesTroy(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}// 全部销毁完后,置为空NULL;*pphead = NULL;
}

补充:测试文件:

//void SListNodeText01()
//{
//	// 创建节点
//	SLTNode* node1 = (SLTNode*)malloc(sizeof(SLTNode));
//	node1->data = 1;
//
//	SLTNode* node2 = (SLTNode*)malloc(sizeof(SLTNode));
//	node2->data = 2;
//
//	SLTNode* node3 = (SLTNode*)malloc(sizeof(SLTNode));
//	node3->data = 3;
//
//	SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode));
//	node4->data = 4;
//
//	// 将四个节点连接起来
//	node1->next = node2;
//	node2->next = node3;
//	node3->next = node4;
//	node4->next = NULL;
//
//	// 打印
//	SLTPrint(node1);
//}void SLTNodeText02()
{//SLTNode* plist = NULL;// 测试尾插//SLTPushBack(&plist, 1);//SLTPushBack(&plist, 2);//SLTPushBack(&plist, 3);//SLTPushBack(&plist, 4);/*SLTPrint(plist);*/// 1->2->3->4->NULL;// 测试头插/*SLTPushFront(&plist, 5);SLTPrint(plist);SLTPushFront(&plist, 6);SLTPrint(plist);SLTPushFront(&plist, 7);SLTPrint(plist);SLTPushFront(&plist, 8);SLTPrint(plist);*/// 测试尾删//SLTPopBack(&plist);//SLTPrint(plist);//SLTPopBack(&plist);//SLTPrint(plist);//SLTPopBack(&plist);//SLTPrint(plist);//SLTPopBack(&plist);//SLTPrint(plist);// 测试头删//SLTPopFront(&plist);//SLTPrint(plist);//SLTPopFront(&plist);//SLTPrint(plist);//SLTPopFront(&plist);//SLTPrint(plist);//SLTPopFront(&plist);//SLTPrint(plist);// 报错//SLTPopFront(&plist);//SLTPrint(plist);// 测试查找//SLTNode* find = SLTFind(plist, NULL);//if (find == NULL)//{//	printf("没有找到!\n");//}//else//{//	printf("找到了!\n");//}// 测试在pos位置之前插⼊数据//SLTNode* find = SLTFind(plist, 1);//SLTInsert(&plist, find, 11);//SLTPrint(plist);// 测试链表在指定位置之后插⼊数据/*SLTNode* find = SLTFind(plist, 4);SLTInsertAfter(find, 11);SLTPrint(plist);*/// 测试删除pos之后的节点/*SLTNode* find = SLTFind(plist, 1);SLTEraseAfter(find);SLTPrint(plist);*/// 测试销毁SListDesTroy(&plist);
}int main()
{//SListNodeText01();SLTNodeText02();return 0;
}

 

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

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

相关文章

做抖音小店保证金可以不交吗?不交保证金,会有什么后果?

哈喽~我是电商月月 说到最赚钱的软件,大家第一个想的就是抖音了,很多不想直播,但又想在抖音上赚钱的人就选择了抖音小店 但普通人创业,开店遇到的第一个困难就是类目保证金的缴纳 几千块钱虽然能拿的出来,但怕就怕在…

数据结构 -- 二分查找

本文主要梳理了二分查找算法的几种实现思路,基本概念参考 顺序、二分、哈希查找的区别及联系_生成一个大小为10万的有序数组,随机查找一个元素,分别采用顺序查找和二分查找方式-CSDN博客 1、基本概念 (1)前提条件:待查找数据必须…

java--包装类

目录 1、包装类的定义 2、意义 3、八大基本类型的包装类 4、转换 5、自动拆箱和自动装箱 6、面试问题:请阐述128陷阱以及出现的原因 1、包装类的定义 把基本类型包装--包装类 2、意义 1、在面向对象中,“一切皆为对象”,但是基本类型不…

fiddler使用(三)-工具栏介绍

Fiddler是一个强大的网络调试工具,它可以帮助用户捕获HTTP和HTTPS请求和响应,从而进行调试和分析。在Fiddler的用户界面中,工具栏是一个非常重要的组成部分,它提供了许多常用的操作和功能,方便用户进行网络调试。以下是…

布局香港之零售中小企篇 | 传承之味,迈向数字化经营的时代

随着内地与香港两地经贸合作日渐紧密,越来越多内地消费品牌将目光投向香港这片充满机遇的热土,纷纷入驻香港市场。「北店南下」蔚然成风,其中不乏已在内地市场深耕多年的传统老字号。数字化经营时代,老字号焕新刻不容缓&#xff0…

Git-常规用法-含解决分支版本冲突解决方法

目录 前置条件 已经创建了Gitee账号 创建一个远程仓库 Git的优点 版本控制 Git 下载 Git的使用 检查Git的是否安装成功 git的常用命令 常用流程 Git 分支 分支流程 Git 远程仓库 远程仓库流程 特殊 可能遇到的问题 前置条件 已经创建了Gitee账号 创建一个远程仓…

求1000以内正整数的平方根(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;int number 0;int result 0;//提示用户&#xff1b;printf("请输入1000以内求平方根的…

【c++leetcode】14. Longest Common Prefix

问题入口 解决方案 class Solution { public:string longestCommonPrefix(vector<string>& v) {string ans "";sort(v.begin(), v.end());int n v.size();string first v[0],last v[n - 1];for(int i 0; i < min(first.size(),last.size()); i){…

密码学 | 椭圆曲线数字签名方法 ECDSA(下)

目录 10 ECDSA 算法 11 创建签名 12 验证签名 13 ECDSA 的安全性 14 随机 k 值的重要性 15 结语 ⚠️ 原文&#xff1a;Understanding How ECDSA Protects Your Data. ⚠️ 写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留着学习。同时&#xff0c;经过几…

树莓派安装Nginx服务结合内网穿透实现无公网IP远程访问

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

CentOS7.9上安装Oracle11g详解

目录 一、环境准备1.安装依赖2.查看libaiobaio版本3.修改host&#xff0c;绑定主机名4.关闭selinux 二、安装配置1.创建组、用户2.修改内核参数3.配置Oracle用户参数4.修改/etc/pam.d/login 文件5.修改/etc/profile 文件6.创建数据库相关目录7.安装包上传、解压8.添加环境变量 …

修改element-ui中el-calendar(日历)的样式

效果图如下&#xff1a; <template><div class"dashboard-container"><el-card style"width: 350px; height: auto; border-radius: 8px"><div class"custom-style"><p class"new-data">{{ newDate }}&…

macbook怎么录屏幕视频?两款实用工具推荐!

在数字化时代&#xff0c;录制屏幕视频已成为我们日常生活和工作中不可或缺的一部分。MacBook作为一款广受欢迎的电脑品牌&#xff0c;为我们提供了高效且便捷的屏幕录制方式&#xff0c;可是很多用户不知道macbook怎么录屏幕视频。本文将介绍两种在Mac上录制屏幕视频的方法&am…

OpenCV——SUSAN边缘检测

目录 一、SUSAN算法二、代码实现三、结果展示 OpenCV——SUSAN边缘检测由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、SUSAN算法 Susan边缘检测是一种经典的边缘检测算&#xff0c;它由Susan Smith…

【muduo源码学习】one-loop-per-thread核心原理

在 TCP 网络编程中&#xff0c;这里我们特指在单机的环境下&#xff0c;主要关注两件事。第一&#xff0c;如何正确的处理TCP的连接和断开&#xff0c;以及正确处理数据的收发&#xff1b;在错综复杂的网络环境中&#xff0c;这并非易事&#xff0c;涉及很多细节。第二&#xf…

【JAVA基础篇教学】第十七篇:Java单元测试

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第十七篇&#xff1a;Java单元测试。 单元测试和集成测试是软件开发过程中至关重要的一部分&#xff0c;它们可以帮助确保代码的质量和稳定性。下面我将为您提供详细说明和代码案例。 一、单元测试&#xff08;Unit Test…

Leetcode 221. 最大正方形

心路历程&#xff1a; 这道题是一个动态规划题&#xff0c;但是其实递推关系很难想到&#xff0c;如下图所示&#xff1a; MDP建模&#xff1a; 状态&#xff1a;以i,j为右下角的正方形 动作候选集&#xff1a;这道题的动作候选集其实是是否选择其左上角邻接的三个位置&#x…

11.范式与反范式设计

范式 1.问题 MySQL的库表设计&#xff0c;在很多时候我们都是率性而为&#xff0c;往往在前期的设计中考虑不全面&#xff0c;同时对于库表结构的划分也并不明确&#xff0c;所以很多时候在开发过程中&#xff0c;代码敲着敲着会去重构某张表结构&#xff0c;甚至大面积重构多…

深圳比创达电子EMC|EMC电磁兼容性:电子设备稳定运行的保障

随着科技的飞速发展&#xff0c;电子设备在人们的日常生活中发挥着越来越重要的作用。然而&#xff0c;随之而来的电磁干扰问题也日益突出。电磁兼容性&#xff08;EMC&#xff09;作为衡量电子设备在电磁环境中正常工作能力的关键指标&#xff0c;其重要性不言而喻。 一、EMC…

IP地址是随着网络变化的吗?

IP地址&#xff0c;即互联网协议地址&#xff0c;是分配给每个联网设备或网络接口的数字标签。它在网络通信中起着至关重要的作用&#xff0c;是设备之间互相识别和通信的基础。然而&#xff0c;关于IP地址是否随着网络变化&#xff0c;这是一个值得深入探讨的问题&#xff0c;…