当前位置: 首页 > news >正文

手搓单链表(无哨兵位)(C语言)

目录

SLT.h

SLT.c

SLTtest.c

测试示例

单链表优劣分析


SLT.h

#pragma once#include <stdio.h>
#include <assert.h>
#include <stdlib.h>typedef int SLTDataType;typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;//打印单链表
void SLTPrint(SLTNode* phead);
//创建节点
SLTNode* BuySLTNode(SLTDataType x);
//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
//尾删
void SLTPopBack(SLTNode** pphead);
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);
//头删
void SLTPopFront(SLTNode** pphead);//单链表查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);
//在pos之前插入
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
//删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);//单链表在pos位置之后插入x
void SListInsertAfter(SLTNode* pos, SLTDataType x);
//单链表删除pos位置之后的值
void SListEraseAfter(SLTNode* pos);//销毁单链表
void SLTDestroy(SLTNode** pphead);

SLT.c

#include "SLT.h"//打印单链表
void SLTPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur){printf("%d->", cur->data);cur = cur->next;}printf("NULL\n");
}//创建节点
SLTNode* BuySLTNode(SLTDataType x)
{SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));if (node == NULL){perror("SLTBuysNode");exit(-1);}node->data = x;node->next = NULL;return node;
}//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);if (*pphead == NULL){*pphead = BuySLTNode(x);}else{SLTNode* tail = *pphead;while (tail->next){tail = tail->next;}tail->next = BuySLTNode(x);}
}//尾删
void SLTPopBack(SLTNode** pphead)
{assert(pphead);assert(*pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* tail = *pphead;while (tail->next->next){tail = tail->next;}free(tail->next->next);tail->next = NULL;}
}//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = BuySLTNode(x);newnode->next = *pphead;*pphead = newnode;
}//头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead);assert(*pphead);SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;
}// 单链表查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{SLTNode* cur = phead;while (cur){if (cur->data == x){//找到了return cur;}cur = cur->next;}//找不到return NULL;
}//在pos之前插入
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pphead);if (*pphead == pos){SLTNode* newnode = BuySLTNode(x);newnode->next = *pphead;*pphead = newnode;}else{SLTNode* cur = *pphead;while (cur->next != pos){cur = cur->next;}SLTNode* newnode = BuySLTNode(x);cur->next = newnode;newnode->next = pos;}}// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead);assert(*pphead && pos);if (*pphead == pos){SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;}else{SLTNode* cur = *pphead;while (cur->next != pos){cur = cur->next;}SLTNode* pos_next = pos->next;free(pos);cur->next = pos_next;}}// 单链表在pos位置之后插入x
void SListInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = BuySLTNode(x);newnode->next = pos->next;pos->next = newnode;
}// 单链表删除pos位置之后的值
void SListEraseAfter(SLTNode* pos)
{assert(pos && pos->next);SLTNode* pos_next_next = pos->next->next;free(pos->next);pos->next = pos_next_next;
}//销毁单链表
void SLTDestroy(SLTNode** pphead)
{assert(pphead);assert(*pphead);while (*pphead){SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;}
}

SLTtest.c

#include "SLT.h"void SLTtest1()
{SLTNode* phead = NULL;SLTPrint(phead);SLTPushBack(&phead, 1);SLTPushBack(&phead, 2);SLTPushBack(&phead, 3);SLTPushBack(&phead, 4);SLTPushBack(&phead, 5);SLTPrint(phead);SLTPopBack(&phead);SLTPrint(phead);SLTPopBack(&phead);SLTPrint(phead);SLTPopBack(&phead);SLTPrint(phead);SLTPopBack(&phead);SLTPrint(phead);SLTPopBack(&phead);SLTPrint(phead);/*SLTPopBack(&phead);SLTPrint(phead);*/
}
void SLTtest2()
{SLTNode* phead = NULL;SLTPrint(phead);SLTPushFront(&phead, 1);SLTPushFront(&phead, 2);SLTPushFront(&phead, 3);SLTPushFront(&phead, 4);SLTPushFront(&phead, 5);SLTPrint(phead);/*SLTDestroy(&phead);SLTPrint(phead);*//*SLTPopFront(&phead);SLTPrint(phead);SLTPopFront(&phead);SLTPrint(phead);SLTPopFront(&phead);SLTPrint(phead);SLTPopFront(&phead);SLTPrint(phead);SLTPopFront(&phead);SLTPrint(phead);*//*SLTPopFront(&phead);SLTPrint(phead);*/
}
void SLTtest3()
{SLTNode* phead = NULL;SLTPrint(phead);SLTPushFront(&phead, 1);SLTPushFront(&phead, 2);SLTPushFront(&phead, 3);SLTPushFront(&phead, 4);SLTPushFront(&phead, 5);SLTPrint(phead);//在pos位置之前插入删除SLTInsert(&phead, phead, 10);SLTPrint(phead);SLTInsert(&phead, NULL, 20);SLTPrint(phead);SLTNode* pos = SLTFind(phead, 3);SLTInsert(&phead, pos, 30);SLTPrint(phead);//删除pos位置的值SLTErase(&phead, phead);SLTPrint(phead);pos = SLTFind(phead, 3);SLTErase(&phead, pos);SLTPrint(phead);pos = SLTFind(phead, 20);SLTErase(&phead, pos);SLTPrint(phead);
}void SLTtest4()
{SLTNode* phead = NULL;SLTPrint(phead);SLTPushFront(&phead, 1);SLTPushFront(&phead, 2);SLTPushFront(&phead, 3);SLTPushFront(&phead, 4);SLTPushFront(&phead, 5);SLTPrint(phead);//在pos位置之后插入SListInsertAfter(phead, 10);SLTPrint(phead);SLTNode* pos = SLTFind(phead, 3);SListInsertAfter(pos, 30);SLTPrint(phead);pos = SLTFind(phead, 1);SListInsertAfter(pos, 10);SLTPrint(phead);//删除pos位置之后的值SListEraseAfter(phead);SLTPrint(phead);pos = SLTFind(phead, 4);SListEraseAfter(pos);SLTPrint(phead);}
int main()
{//测试尾插尾删//SLTtest1();//测试头插头删//SLTtest2();//在pos位置之前插入删除//SLTtest3();//在pos位置之后插入删除//SLTtest4();return 0;
}

测试示例

尾插尾删:

头插头删:

在pos位置之前插入:

删除pos位置的值:

在pos位置之后插入删除:

单链表优劣分析

        单链表在逻辑上连续,在物理上不一定连续,用多少申请多少空间,因此不存在空间浪费且申请空间开销小;插入删除元素时无需挪动元素,只需要改变指向即可,但除头插头删,在pos位置之后插入删除外需要先遍历链表,效率低下;不支持随机访问;缓存利用率低。

        总结:单链表具有较大的缺陷,相较于顺序表而言没有明显的优势,因此在实践中几乎没有应用场景。

相关文章:

手搓单链表(无哨兵位)(C语言)

目录 SLT.h SLT.c SLTtest.c 测试示例 单链表优劣分析 SLT.h #pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h>typedef int SLTDataType;typedef struct SListNode {SLTDataType data;struct SListNode* next; }SLTNode;//打印…...

代码随想录算法训练营第18天|二叉树

513. 找树左下角的值 最左边的结点的特性 1.只能是叶子结点&#xff0c; 2.必须考虑是最底层&#xff0c;所以要考虑树的深度 3.同样的深度考虑左子树 考虑迭代法,层序遍历 递归优点难搞的 /*** Definition for a binary tree node.* function TreeNode(val, left, righ…...

使用tftpd更新开发板内核

我们升级内核可以通过原厂提供的升级软件来进行&#xff0c;比如瑞芯微的RKDevTool.exe&#xff0c;只不过这种方式必须通过指定的OTG升级口&#xff0c;还得借助按键进入loader模式后才可以。 其实还可以利用一些通用的工具来进行升级&#xff0c;比如tftpd工具。 下载地址p…...

MySQL数据库整体知识点简述

目录 第一章&#xff1a;数据库系统概述 第二章&#xff1a;信息与数据模型 第3章 关系模型与关系规范化理论 第四章——数据库设计方法 第六-七章——MySQL存储引擎与数据库操作管理 第九章——索引 第10章——视图 第11章——MySQL存储过程与函数 第12章——MySQL 触…...

深入理解MySQL索引下推优化

在MySQL中&#xff0c;索引的使用对于查询性能至关重要。然而&#xff0c;即使有合适的索引&#xff0c;有时查询性能仍然不尽如人意。索引下推&#xff08;Index Condition Pushdown&#xff0c;ICP&#xff09;是一项能够进一步优化查询性能的技术。本文将详细讲解索引下推的…...

论文降重技巧:AI工具如何助力论文原创性提升?

论文降重一直是困扰各界毕业生的“拦路虎”&#xff0c;还不容易熬过修改的苦&#xff0c;又要迎来降重的痛。 其实想要给论文降重达标&#xff0c;我有一些独家秘诀。话不多说直接上干货&#xff01; 1、同义词改写&#xff08;针对整段整句重复&#xff09; 这是最靠谱也是…...

el-date-picker的使用,及解决切换type时面板样式错乱问题

这里选择器的类型可以选择日月年和时间范围&#xff0c;根据类型不同&#xff0c;el-date-picker的面板也展示不同&#xff0c;但是会出现el-date-picker错位&#xff0c;或者面板位置和层级等问题。 源代码&#xff1a; <el-selectv-model"dateType"placeholder&…...

Flutter 中的 ToggleButtonsTheme 小部件:全面指南

Flutter 中的 ToggleButtonsTheme 小部件&#xff1a;全面指南 Flutter&#xff0c;作为由 Google 开发的跨平台 UI 框架&#xff0c;为开发者提供了丰富的组件来构建现代化的应用程序。ToggleButtons 是 Material Design 组件库中的一个组件&#xff0c;它允许用户从一组选项…...

新手教程之使用LLaMa-Factory微调LLaMa3

文章目录 为什么要用LLaMa-Factory什么是LLaMa-FactoryLLaMa-Factory环境搭建微调LLaMA3参考博文 为什么要用LLaMa-Factory 如果你尝试过微调大模型&#xff0c;你就会知道&#xff0c;大模型的环境配置是非常繁琐的&#xff0c;需要安装大量的第三方库和依赖&#xff0c;甚至…...

Java函数笔记

1. Statement.executeQuery 和 Statement.executeUpdate 作用&#xff1a; 用于执行SQL查询和更新操作。 问题&#xff1a; 容易导致SQL注入攻击。 解决方法&#xff1a; 使用PreparedStatement进行参数化查询。 // 不安全的做法 Statement stmt connection.createStat…...

Maven实战: 从工程创建自定义archetype

在上一节中(创建自定义archetype)我们手动创建了一个项目模板&#xff0c;经过5步能创建出一个项目模板&#xff0c;如果我有一个现成的项目&#xff0c;想用这个项目作为模板来生成其他项目呢&#xff1f;Maven提供了基于项目生成archetype模板的能力&#xff0c;我们分3步来讲…...

初识JAVA中的包装类,时间复杂度及空间复杂度

目录&#xff1a; 一.包装类 二.时间复杂度 三.空间复杂度 一.包装类&#xff1a; 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java 给每个基本类型都对应了一个包装类型。 1 基本数据类型和对应的包装类 &am…...

RapidMiner如何利用Hugging Face中的模型实现更有趣的事

RapidMiner Studio最新发布的功能更新&#xff0c;重点是嵌入Hugging Face和Open AI&#xff0c;Hugging face中含有大量的可用模型&#xff0c;包含翻译、总结、文本生成等等强大的模型&#xff0c;Open AI更不必说了&#xff0c;生成界的鼻祖。那么今天主要介绍一下RapidMine…...

Vue3 自定义Hooks函数的封装

1、如何理解vue3中的自定义hooks 在Vue 3中&#xff0c;自定义hooks允许开发者封装和重用逻辑代码。自定义hooks是使用Composition API时创建的函数&#xff0c;这些函数可以包含任意的组合逻辑&#xff0c;并且可以在多个组件之间共享。 自定义hooks通常遵循这样的命名约定&…...

python的DataFrame和Series

Series、DataFrame 创建 pd.Series() pd.DataFrame() # 字典{列名:[值1&#xff0c;值2],} [[]] [()] numpy Pandas的底层的数据结构&#xff0c;就是numpy的数组 ndarray 常用属性 shape (行数&#xff0c;) (行数&#xff0c;列数) values → ndarray index 索引名 siz…...

ARP欺骗的原理与详细步骤

ARP是什么&#xff1a; 我还记得在计算机网络课程当中&#xff0c;学过ARP协议&#xff0c;ARP是地址转换协议&#xff0c;是链路层的协议&#xff0c;是硬件与上层之间的接口&#xff0c;同时对上层提供服务。在局域网中主机与主机之间不能直接通过IP地址进行通信&#xff0c…...

25、DHCP FTP

DHCP 动态主机配置协议 DHCP定义&#xff1a; 服务器配置好了地址池 192.168.233.10 192.168.233.20 客户端从地址池当中随机获取一个ip地址&#xff0c;ip地址会发生变化&#xff0c;使用服务端提供的ip地址&#xff0c;时间限制&#xff0c;重启之后也会更换。 DHCP优点&a…...

spark学习记录-spark基础概念

背景需求 公司有项目需要将大容量数据进行迁移&#xff0c;经过讨论&#xff0c;采用spark框架进行同步、转换、解析、入库。故此&#xff0c;这里学习spark的一些基本的概念知识。 Apache Spark 是一个开源的大数据处理框架&#xff0c;可以用于高效地处理和分析大规模的数据…...

BGP数据包+工作过程

BGP数据包 基于 TCP的179端口工作;故BGP协议中所有的数据包均需要在tcp 会话建立后&#xff1b; 基于TCP的会话来进行传输及可靠性的保障; 首先通过TCP的三次握手来寻找到邻居&#xff1b; Open 仅负责邻居关系的建立&#xff0c;正常进收发一次即可;携带route-id; Keepli…...

【C语言】详解函数(庖丁解牛版)

文章目录 1. 前言2. 函数的概念3.库函数3.1 标准库和头文件3.2 库函数的使用3.2.1 头文件的包含3.2.2 实践 4. 自定义函数4.1 自定义函数的语法形式4.2 函数的举例 5. 形参和实参5.1 实参5.2 形参5.3 实参和形参的关系 6. return 语句6. 总结 1. 前言 一讲到函数这块&#xff…...

超分辨数据集全景图:从经典基准到实战选型指南

1. 超分辨数据集入门&#xff1a;为什么选择比努力更重要 刚接触超分辨率技术时&#xff0c;我和大多数新手一样&#xff0c;第一反应是赶紧找个开源模型跑起来。结果发现同样的代码&#xff0c;在Set5上PSNR能到40&#xff0c;换成自己的照片却糊成一团。后来才明白&#xff0…...

终极空洞骑士模组管理器:用Scarab实现10倍效率提升的完整指南

终极空洞骑士模组管理器&#xff1a;用Scarab实现10倍效率提升的完整指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾经为《空洞骑士》安装模组时感到头疼&#x…...

ROS实战:UZH-FPV数据集下PL-EVIO与主流VIO算法的性能对比

1. UZH-FPV数据集与无人机视觉里程计的挑战 UZH-FPV数据集是苏黎世联邦理工学院发布的专门针对高速无人机场景的多模态数据集。这个数据集最大的特点在于它完整记录了无人机在高速机动飞行&#xff08;最高速度超过10m/s&#xff09;时的多传感器数据&#xff0c;包括双目事件相…...

实战指南 — 基于TCGA数据的差异表达分析全流程与可视化呈现

1. TCGA数据获取与准备 第一次接触TCGA数据库时&#xff0c;我被它庞大的数据量震撼到了。作为癌症基因组图谱计划&#xff0c;TCGA收录了33种癌症类型、超过2万例患者的基因组数据。对于肝癌(LIHC)研究来说&#xff0c;这里简直就是一座金矿。 进入TCGA官网后&#xff0c;你会…...

Win11更新后Wifi图标消失?别急着重装系统,先试试这个官方驱动修复法

Win11更新后Wifi图标消失&#xff1f;三步精准定位官方驱动修复方案 刚更新完Windows 11系统&#xff0c;正准备继续手头的工作&#xff0c;突然发现任务栏右下角的Wifi图标不翼而飞。尝试重启电脑、重置网络设置&#xff0c;甚至检查了各种服务状态&#xff0c;问题依旧存在。…...

SuperSplat部署完全指南:从开发到生产环境的终极教程

SuperSplat部署完全指南&#xff1a;从开发到生产环境的终极教程 【免费下载链接】super-splat 3D Gaussian Splat Editor 项目地址: https://gitcode.com/gh_mirrors/su/super-splat SuperSplat是一款基于Web的免费开源3D高斯泼溅编辑器&#xff0c;专为检查、编辑、优…...

SPM12实战:手把手教你搞定fMRI数据预处理(从时间矫正到空间平滑)

SPM12实战&#xff1a;零基础入门fMRI数据预处理全流程解析 第一次接触功能磁共振成像&#xff08;fMRI&#xff09;数据分析时&#xff0c;面对SPM12复杂的界面和晦涩的术语&#xff0c;很多新手都会感到无从下手。这篇文章将带你从零开始&#xff0c;用最直观的方式掌握fMRI数…...

幻兽帕鲁存档迁移完全手册:告别数据丢失的终极解决方案

幻兽帕鲁存档迁移完全手册&#xff1a;告别数据丢失的终极解决方案 【免费下载链接】palworld-host-save-fix 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-host-save-fix 你是否曾在更换幻兽帕鲁服务器时&#xff0c;眼睁睁看着自己辛苦培养的角色数据消失无…...

拦截器与 JWT 联合使用详解

1. 核心概念1.1 什么是 JWT&#xff1f;JWT 是一个开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间以 JSON 对象的形式安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。JWT 结构&#xff1a;Header&#xff08;头部&#xff09;&…...

KityMinder:可视化思维的协作引擎 | 高效工作者必备工具

KityMinder&#xff1a;可视化思维的协作引擎 | 高效工作者必备工具 【免费下载链接】kityminder 百度脑图 项目地址: https://gitcode.com/gh_mirrors/ki/kityminder 在信息爆炸的时代&#xff0c;如何将零散的想法系统化、复杂的项目结构化&#xff1f;作为一款开源免…...