拿捏单链表

目录

引言

一:链表的定义

二:单链表的定义 

三:单链表的增删查改 

1.单链表增删查改及遍历的声明

注:在测试中创建指向头结点的指针plist 

2.二级指针应用的说明 

 3.单链表的遍历

4.创建节点 

5.单链表的插入 

(1)头插

(2) 尾插

 (3)任意位置之前插入

(4)任意位置之后插入

6.单链表的删除 

(1)头删

(2) 尾删

(3) 任意位置删除

7.单链表的查找 

8.单链表的修改 

四:关于单链表的介绍就到此为止了,青山不改,绿水长流,后会有期。 


接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

引言

   链表是一种常见的数据结构,它可以用来存储数据,并可以快速的进行增删查改的目的。相对于数组来说链表更加灵活和高效,数组的优势在于数组下标的随机访问,链表则可以更好的解决数组容量的大小,频繁扩容等一系列问题。

   接下来本文将介绍关于链表的定义以及单链表的增删查改,知识云游号即将发车

   辞忧提醒你请系好安全带,准备发车

一:链表的定义

1.链表是由一系列的节点构成,每个节点包含一个数据内容的数据域和一个指向下一个节点的指针的指针域。

2.每个节点是由malloc申请来的,所以每个节点是在内存空间中的堆区中,并且是在堆中随即申请的,所以各结点的地址是不连续的,是随机的。并且与在栈中申请的局部变量不同,局部变量出作用域销毁,而节点是在堆中,不销毁。

3.每个链表都包含一个头节点和一个指向头结点的指针变量,用来对链表进行各种操作。每个链表的尾节点中指针域为NULL。

二:单链表的定义 

三:单链表的增删查改 

1.单链表增删查改及遍历的声明


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int SListDatatype;typedef struct SListNode
{SListDatatype data;struct SListNode* next;
}SLTNode;//打印单链表数据
void SLTPrint(SLTNode*phead);//单链表之创建节点
SLTNode* CreatNode(SListDatatype x);//单链表之头插
void SLTPushFront(SLTNode** pphead,SListDatatype x);//单链表之尾插
void SLTPushBack(SLTNode** pphead, SListDatatype x);//单链表之头删
void SLTPopFront(SLTNode**pphead);//单链表之尾删
void SLTPopBack(SLTNode **pphead);//单链表之查找
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype data);//单链表之修改
void SLTModifyData(SLTNode** pphead, SListDatatype place,SListDatatype data);//单链表之任意位置之前插入
void SLTPushArbit(SLTNode**pphead,SListDatatype place,SListDatatype data);//单链表之任意位置删除
void SLTPopArbit(SLTNode** pphead, SListDatatype place);//单链表之任意位置之后插入
void SLTPushBackArbit(SLTNode** pphead, SListDatatype place, SListDatatype data);
注:在测试中创建指向头结点的指针plist 

2.二级指针应用的说明 

二级指针顾名思义就是指向指针的指针,在最早接触指针的时候,有一个最简单的例子,就是用函数来实现两数交换,这个问题最初我们写的代码就如下

发现根本没有解决问题,主要原因是改变形参不改变实参,因此便想到运用指针的方法:

这次发现 便可以,因此要改变int类型的值必须传int*,改变int*的值必须传int**,对于单链表中的结构体也一样,改变头节点的指针,就得使用头节点指针的指针。

 3.单链表的遍历

void SLTPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur != NULL){printf("%d->",cur->data);cur = cur->next;}printf("NULL\n");
}

4.创建节点 

SLTNode* CreatNode(SListDatatype x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc newnode");return ;}newnode->data = x;newnode->next = NULL;return newnode;
}

注:x为数据域的内容

5.单链表的插入 

(1)头插
void SLTPushFront(SLTNode** pphead,SListDatatype x)
{assert(pphead);SLTNode* newnode = CreatNode(x);newnode->next = *pphead;*pphead = newnode;
}

 

(2) 尾插
void SLTPushBack(SLTNode** pphead, SListDatatype x)
{assert(pphead);SLTNode* newnode = CreatNode(x);//1.空链表if (*pphead == NULL){*pphead = newnode;}else   //2.不是空链表{//找尾SLTNode* cur = *pphead;while (cur->next != NULL){cur = cur->next;}cur->next = newnode;}
}

 

 (3)任意位置之前插入
//查找代码
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{assert(pphead);assert(*pphead);//空链表不需查找SLTNode* cur = *pphead;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
void SLTPushFrontArbit(SLTNode** pphead, SListDatatype place,SListDatatype data)
{assert(pphead);assert(*pphead);//空链表不能任意位置插入SLTNode* PushPlace = SLTFindData(pphead, place);if (PushPlace != NULL){if (PushPlace == *pphead)//1.只有一个节点{SLTPushFront(pphead, data);}else//2.一个以上节点{SLTNode* newnode = CreatNode(data);SLTNode* cur = *pphead;while (cur->next != PushPlace){cur = cur->next;}cur->next = newnode;newnode->next = PushPlace;}}else{printf("无此位置");return;}
}

 

(4)任意位置之后插入
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{assert(pphead);assert(*pphead);//空链表不需查找SLTNode* cur = *pphead;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
void SLTPushBackArbit(SLTNode** pphead, SListDatatype place, SListDatatype data)
{assert(pphead);assert(*pphead);//空链表不需查找插入SLTNode* PushPlace = SLTFindData(pphead, place);if (PushPlace){SLTNode* newnode = CreatNode(data);if (*pphead == PushPlace)//头节点之后插入{(*pphead)->next = newnode;}else if(PushPlace->next==NULL)//尾节点之后插入{SLTNode* cur = *pphead;while (cur != PushPlace){cur = cur->next;}cur->next = newnode;}else{SLTNode* cur = *pphead;while (cur != PushPlace){cur = cur->next;}SLTNode* curr = cur->next;newnode->next = curr;cur->next = newnode;}}else{printf("找不到");return;}
}

 

6.单链表的删除 

(1)头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead);assert(*pphead);//空链表不能删除//1.只有一个节点if ((*pphead)->next == NULL){*pphead = NULL;free(*pphead);}else  //2.一个以上节点{SLTNode* del = *pphead;*pphead = del->next;del->next = NULL;free(del);}
}

 

(2) 尾删
void SLTPopBack(SLTNode** pphead)
{assert(pphead);assert(*pphead);//空链表不能删除//1.只有一个节点if ((*pphead)->next == NULL){*pphead = NULL;free(*pphead);}else{SLTNode* cur = *pphead;while (cur->next->next != NULL){cur = cur->next;}cur->next = NULL;free(cur->next);}
}

 

 

(3) 任意位置删除
//查找
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{assert(pphead);assert(*pphead);SLTNode* cur = *pphead;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
void SLTPopArbit(SLTNode** pphead, SListDatatype place)
{assert(pphead);assert(*pphead);//空链表不能查找删除SLTNode* PopPlace = SLTFindData(pphead, place);if (PopPlace != NULL){if (*pphead == PopPlace)//只有一个节点{SLTPopFront(pphead);}else{SLTNode* cur = *pphead;while (cur->next != PopPlace){cur = cur->next;}SLTNode* del = PopPlace;cur->next = del->next;free(del);}}else{printf("无此位置");return;}
}

 

7.单链表的查找 

 

SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{assert(pphead);assert(*pphead);SLTNode* cur = *pphead;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}

8.单链表的修改 

//指定位置修改
void SLTModifyData(SLTNode** pphead, SListDatatype place,SListDatatype data)
{assert(pphead);assert(*pphead);//空链表不能修改SLTNode* ret = SLTFindData(pphead, place);ret->data = data;
}

四:关于单链表的介绍就到此为止了,青山不改,绿水长流,后会有期。 

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

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

相关文章

抖音私信自动回复工具使用教程!

该工具基于网页版抖音&#xff0c;可以用于抖音个人号等任何权限的账号&#xff01; 获取软件 联系我的v 信&#xff1a;llike620 基本使用 了解GPT的&#xff0c;可以配置FastGPT这种训练知识库的AI进行回复 不了解的&#xff0c;可以配置关键词回复 点击抖音私信按钮&a…

【leetcode994】腐烂的橘子(BFS)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 首先将所有烂橘子入队&#xff0c;然后常规BFS遍历&#xff0c;注意while的截止条件除了队列为空&#xff0c;新鲜橘子数量大于0&#xff08;没新鲜橘子也没必要继续遍历&#xff0c;保证时间计算的正确性&#xff09;&a…

关于Build Your Own Botnet的尝试

这是一次失败的尝试、 原文地址&#xff1a;关于Build Your Own Botnet的尝试 - Pleasure的博客 下面是正文内容&#xff1a; 前言 我在上一篇关于DDOS的文章种提到过这个项目&#xff0c;而且说明了由于这个项目是在2020年发布并开源的&#xff0c;并且已经有两年没有进行跟…

HMI界面:感官与体验俱佳的智能家居界面分享

Hello&#xff0c;我是大千UI工场&#xff0c;本期分享HMI人机交互界面在智能家居领域的案例&#xff0c;关注大千&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;可以联络。 设计感官和体验俱佳智能家居的UI界面时&#xff0c;可以考虑以下几个方面&#xff1a;…

【王道数据结构】【chapter5树与二叉树】【P159t17~19】【统考真题】

目录 2014年统考 2017年统考 2022年统考 2014年统考 #include <iostream> #include <stack> #include <queue> typedef struct treenode{int weight;struct treenode *left;struct treenode *right; }treenode,*ptreenode;ptreenode buytreenode(int x) {p…

python----输入输出算数运算

1.格式化输出 如果我们直接打印输出&#xff0c;就是输出变量的值&#xff0c;例如&#xff1a; 如果我们想打印a10就需要格式化字符串&#xff0c;就是使用f进行格式化&#xff0c;如图所示&#xff1b; 2.控制台输入 input执行的时候&#xff0c;就会等待用户进行输入&…

free pascal:fpwebview 组件通过 JSBridge 调用本机TTS

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr &#xff0c;编写 js_bind_speak.lpr 如下&#xff0c;通过 JSBridge 调用本…

相机图像质量研究(24)常见问题总结:CMOS期间对成像的影响--摩尔纹

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之XCP模块配置详解(上)

XCP模块配置详解 - 上 一、XCP模块配置项处理1.1 Tx Pdu配置项二、XCP模块其他配置项2.1 参数XcpMainFunctionPeriod2.2 参数XcpOnCanEnabled2.3 容器XcpOnCan总结从本节开始先专注与配置项错误处理以及构建Autosar Rh850的最小系统搭建。 XCP模块在汽车电子各控制器中处于十分…

摸索设计模式的魅力:从策略模式看软件设计的智慧-灵活应对变化的艺术

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、案例场景1.1 一坨坨代码实现1.2 存在的问题 二、使用策略模式解决问题2.1 使用策略模式重构代码2.2 克服了问题 三、模式讲解3.1 结构图及说明3.2 实现步骤和注意事项3.3 适用场景 四、优势和局限性4.1 优势4.2 局…

软件实例分享,门诊处方软件存储模板处方笺教程,个体诊所电子处方开单系统软件教程

软件实例分享&#xff0c;门诊处方软件存储模板处方笺教程&#xff0c;个体诊所电子处方开单系统软件教程、 一、前言 以下软件教程以 佳易王诊所电子处方管理软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 电子处方软件支持病历汇总…

Linux第54步_根文件系统第1步_编译busybox并安装_然后添加“根文件系统”的库

学习编译busybox&#xff0c;并安装&#xff0c;然后添加“根文件系统”的库。有人说busybox构建根文件系统&#xff0c;只适合学习&#xff0c;不适合做项目。 1、了解ubuntu的根文件系统 根文件系统的目录名为“/”&#xff0c;就是一个斜杠。 1)、输入“cd /回车”&…