手撕单链表

目录

链表的概念和结构

单链表的实现

申请新结点

打印

尾插

头插

 尾删

头删

 ​编辑

 查找

在pos位置前插入元素 

 在pos位置后插入元素

删除pos位置的元素 

 删除pos位置之后的位置的元素​编辑

完整代码

SListNode.h

 

SListNode.c


链表的概念和结构

链表是一种物理存储上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的

链式结构逻辑连续,物理不一定连续

单链表的实现

无头 单向 非循环链表

申请新结点

打印

尾插

 

头插

 

 尾删

 

头删

 

 

 查找

在pos位置前插入元素 

 ​​​​

 

 在pos位置后插入元素

删除pos位置的元素 

 

 删除pos位置之后的位置的元素

完整代码

SListNode.h

 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int SLTDataType;typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;SLTNode* BuySListNode(SLTDataType x);     //申请一个结点void SListNodePrint(SLTNode* plist);      //打印void SListPushBack(SLTNode** pplist, SLTDataType x);    //尾插void SListPushfront(SLTNode** pplist, SLTDataType x);    //头插void SListPopBack(SLTNode** pplist);    //尾删void SListPopfront(SLTNode** pplist);    //头删SLTNode* SListFind(SLTNode* plist, SLTDataType x);        //查找void SListInsert(SLTNode** pplist, SLTNode* pos, SLTDataType x);    //在pos位置前插入元素void SListInsertAfter(SLTNode* pos, SLTDataType x);   //在pos位置后插入元素void SListErase(SLTNode** pplist, SLTNode* pos);     //删除pos位置前的元素void SListEraseAfter(SLTNode* pos);          //删除pos位置之后的位置的元素

SListNode.c

#define _CRT_SECURE_NO_WARNINGS 1#include "SListNode.h"SLTNode* BuySListNode(SLTDataType x)            //申请一个新结点
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc failed");exit(-1);}newnode->data = x;newnode->next = NULL;return newnode;
}void SListNodePrint(SLTNode* plist)      //打印
{SLTNode* cur = plist;while (cur){printf(" %d ->", cur->data);cur = cur->next;}printf("NULL");printf("\n");
}void SListPushBack(SLTNode** pplist, SLTDataType x)    //尾插
{assert(pplist);SLTNode* newnode = BuySListNode(x);if (*pplist == NULL){*pplist = newnode;}else{SLTNode* tail = *pplist;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;}
}void SListPushfront(SLTNode** pplist, SLTDataType x)    //头插
{assert(pplist);SLTNode* newnode = BuySListNode(x);newnode->next = *pplist;*pplist = newnode;}void SListPopBack(SLTNode** pplist)    //尾删
{assert(pplist);assert(*pplist);//空链表//一个结点if ((*pplist)->next == NULL){free(*pplist);*pplist = NULL;}//一个以上结点else{SLTNode* tail = *pplist;while (tail->next->next != NULL){tail = tail->next;}free(tail->next);tail->next = NULL;}
}void SListPopfront(SLTNode** pplist)    //头删
{assert(pplist);assert(*pplist);SLTNode* cur = *pplist;*pplist = (*pplist)->next;free(cur);
}SLTNode* SListFind(SLTNode* plist, SLTDataType x)        //查找
{SLTNode* cur = plist;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}void SListInsert(SLTNode** pplist, SLTNode* pos, SLTDataType x)    //在pos位置前插入元素
{assert(pplist);assert(pos);if (*pplist == pos){SListPopfront(pplist, x);}else{SLTNode* cur = *pplist;while (cur->next != pos){cur = cur->next;}SLTNode* newnode = BuySListNode(x);newnode->next = cur->next;cur->next = newnode;}
}void SListInsertAfter(SLTNode* pos, SLTDataType x)   //在pos位置后插入元素
{assert(pos);SLTNode* newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;
}void SListErase(SLTNode** pplist, SLTNode* pos)     //删除pos位置的元素
{assert(pplist);assert(pos);if (*pplist == pos){SListPopfront(pplist);}else{SLTNode* cur = *pplist;while (cur->next->next = pos){cur = cur->next;}cur->next = pos->next;free(pos);pos = NULL;}
}void SListEraseAfter(SLTNode* pos)          //删除pos位置之后的位置的元素
{assert(pos);assert(pos->next);SLTNode* cur = pos->next;pos->next = cur->next;free(cur);cur = NULL;
}

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

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

相关文章

【JavaSE】Java方法的使用

【本节目标】 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 4. 掌握递归 目录 1.方法概念及使用 1.1什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 3. 递归 3.…

【uni-app报错】获取用户收货地址uni.chooseAddress()报错问题

chooseAddress:fail the api need to be declared in …e requiredPrivateInf 原因&#xff1a; 小程序配置 / 全局配置 (qq.com) 解决&#xff1a; 登录小程序后台申请接口 按照流程申请即可 在项目根目录中找到 manifest.json 文件&#xff0c;在左侧导航栏选择源码视图&a…

杭电比赛总结

我们的队伍&#xff1a;team013 另外两队&#xff1a;team014、team015 ​ 今天是我第一次打杭电&#xff0c;发现杭电多数都是猜结论题 先给一下我们的提交数据 Submit TimeProblem IDTimeMemoryJudge Status4:59:59101115 MS1692 KWrong Answer4:59:55101115 MS1684 KWrong…

Java算法_ 检查对称树(LeetCode_Hot100)

题目描述&#xff1a;给你一个二叉树的根节点 &#xff0c; 检查它是否轴对称。root 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Author: LJJ* 3 * Date: 2023/8/17 8:47* 4*/ public class SymmetricTree {static class…

vue之动态表单(优化)

代码资源在这儿 ↑ vue之动态表单优化 vue2js动态表单优化vue3ts动态表单优化 vue2js动态表单优化 效果图 目录结构 五个文件的完整代码: 以下是App.vue <template><div><router-view></router-view><Formpage /></div> </templa…

web连接桌面打开gptmap

一&#xff1a;环境配置 需要的材料&#xff1a; python-3.10.4 我使用的是这个版本的&#xff0c;3.8.10 该版本和以下版本组件组合&#xff0c;验证过能正常运行&#xff08;python 3.6.8测试异常&#xff09; websockify 该项目有python版本和node js版本 noVNC 形式的app…

LeetCode150道面试经典题-- 环形链表(简单)

1.题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&…

分布式光伏运维平台在公益场馆屋顶光伏发电系统的应用分析

摘要&#xff1a;2021年9月&#xff0c;国家发改委印发烷善能源消费强度和总量双控制度方案》&#xff0c;提出鼓励可再生能源的使用&#xff0c;支持可再生能源发展。在这样的政策推动下&#xff0c;光伏发电市场无疑将迎来高质量发展的新机遇。现结合山东博物馆光伏电站日常管…

面试攻略,Java 基础面试 100 问(十八)

JAVA IO 包 JAVA NIO NIO 主要有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buffer(缓冲区), Selector。 传统 IO 基于字节流和字 符流进行操作&#xff0c;而 NIO 基于 Channel 和 Buffer(缓冲区)进行操作&#xff0c;数据总是从通道读取到缓冲区 中&#xff0c;或者…

TRT8系列—— 版本差异注意事项

TRT8 一个大版本&#xff0c;8.4-、 8.5、 8.6&#xff08;包含预览功能&#xff09;却有很多变动&#xff0c;一不注意就发现很混乱&#xff0c;特备注此贴。建议具体case可以参考这个合集&#xff0c;真心安利&#xff1a;https://github.com/NVIDIA/trt-samples-for-hackath…

Go语言GIN框架安装与入门

Go语言GIN框架安装与入门 文章目录 Go语言GIN框架安装与入门1. 创建配置环境2. 配置环境3. 下载最新版本Gin4. 编写第一个接口5. 静态页面和资源文件加载6. 各种传参方式6.1 URL传参6.2 路由形式传参6.3 前端给后端传递JSON格式6.4 表单形式传参 7. 路由和路由组8. 项目代码mai…

GaussDB 实验篇+openGauss的4种1级分区案例

✔ 范围分区/range分区 -- 创建表 drop table if exists zzt.par_range; create table if not exists zzt.par_range (empno integer,ename char(10),job char(9),mgr integer(4),hiredate date,sal numeric(7,2),comm numeric(7,2),deptno integer,constraint pk_par_emp pri…

Android Studio实现解析HTML获取图片URL,将URL存到list,进行瀑布流展示

目录 效果展示build.gradle(app)添加的依赖(用不上的可以不加)AndroidManifest.xml错误代码activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL效果展示 build.gradle(app)添加的依赖(用不上的可以不加) dependencies {implementation co…

Java版电子招投标管理系统源码-电子招投标认证服务平台-权威认证 tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;…

【java毕业设计】基于Spring Boot+Vue+mysql的论坛管理系统设计与实现(程序源码)-论坛管理系统

基于Spring BootVuemysql的论坛管理系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring BootVuemysql的论坛管理系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取…

创建远程仓库以及分支

1、 创建远程仓库 这里有两种方式 1.1 利用git的插件有Gitee、GitHub。 来到 GitHub 中发现已经帮我们创建好了 gitTest 的远程仓库。 1.2 通过Push的方式推送本地库到远程库 这种方式需要提前创建好仓库。 右键点击项目&#xff0c;可以将当前分支的内容 push 到 GitHub 的远…

Python爬虫——scrapy_工作原理

引擎向spiders要url引擎把将要爬取的url给调度器调度器会将url生成的请求对象放入到指定的队列中从队列中出队一个请求引擎将请求交给下载器进行处理下载器发送请求获取互联网数据下载器将数据返回给引擎引擎将数据再次给到spidersspiders通过xpath解析该数据&#xff0c;得到数…

【STM32】 工程

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…

Spring系列篇--关于AOP【面向切面】的详解

目录 一.AOP是什么 二.案例演示 1.前置通知1.1 先准备接口 1.2然后再准备好实现类 1.3对我们的目标对象进行JavaBean配置 1.4 编写前置系统日志通知 1.5配置系统通知XML中的JavaBean 1.6 配置代理XML中的JavaBean 1.7 测试代码开始测试 注意这里有一个报错问题&…

JVM虚拟机:初始化的介绍

本文重点 我们前面学习了三个步骤: 装载 连接 初始化 初始化 初始化的时候,会为静态成员变量赋值初始值,它有两种方式: ①声明类变量是指定初始值 ②使用静态代码块为类变量指定初始值 例子 最后输出的结果为3,它的过程是这样的: main方法中输出T.count,由于count是…