当前位置: 首页 > 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…...

createAsyncThunk完整用法介绍

createAsyncThunk 是 Redux Toolkit 库中的一个功能&#xff0c;它用于创建处理异步逻辑的 thunk action creator。Redux Toolkit 是一个官方推荐的库&#xff0c;用于简化 Redux 开发过程&#xff0c;特别是处理常见的 Redux 模式&#xff0c;如异步数据流。createAsyncThunk …...

[书生·浦语大模型实战营]——第六节 Lagent AgentLego 智能体应用搭建

1. 概述和前期准备 1.1 Lagent是什么 Lagent 是一个轻量级开源智能体框架&#xff0c;旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力。 Lagent 目前已经支持了包括 AutoGPT、ReAct 等在内的多个经典智能体范式&#x…...

Word文档如何设置限制编辑和解除限制编辑操作

Word文档是大家经常使用的一款办公软件&#xff0c;但是有些文件内容可能需要进行加密保护&#xff0c;不过大家可能也不需要对word文件设置打开密码。只是需要限制一下编辑操作就可以了。今天和大家分享&#xff0c;如何对word文件设置编辑限制、以及如何取消word文档的编辑限…...

IO进程线程(六)进程

文章目录 一、进程状态&#xff08;二&#xff09;进程状态切换实例1. 实例1 二、进程的创建&#xff08;一&#xff09;原理&#xff08;二&#xff09;fork函数--创建进程1. 定义2. 不关注返回值3. 关注返回值 &#xff08;三&#xff09; 父子进程的执行顺序&#xff08;四&…...

机器视觉——找到物块中心点

首先先介绍一下我用的是HALCON中的HDevelop软件。 大家下载好软件后可以测试一下&#xff1a; 在程序编辑器窗口中输入下面指令&#xff1a; read_image(Image,monkey) 那么如果出现这样的图片&#xff0c;说明是没有问题的 那么本次编程采用的是下面这张图片 我们要达到的…...

重磅消息! Stable Diffusion 3将于6月12日开源 2B 版本的模型,文中附候补注册链接。

在OpenAI发布Sora后&#xff0c;Stability AI也发布了其最新的模型Stabled Diffusion3, 之前的文章中已经和大家介绍过&#xff0c;感兴趣的小伙伴可以点击以下链接阅读。Sora是音视频方向&#xff0c;Stabled Diffusion3是图像生成方向&#xff0c;那么两者没有必然的联系&…...

Python报错:AttributeError: <unknown>.DeliveryStore 获取Outlook邮箱时报错

目录 报错提示&#xff1a; 现象描述 代码解释&#xff1a; 原因分析&#xff1a; 报错提示&#xff1a; in get_outlook_email return account.DeliveryStore.DisplayName line 106, in <module> email_address get_outlook_email() 现象描述 获取outlook本地邮箱…...

如何 Logrus IT 的质量评估门户帮助提升在线商店前端(案例研究)

在当今竞争激烈的电子商务环境中&#xff0c;一个运作良好的在线店面对商业成功至关重要。然而&#xff0c;确保目标受众获得积极的用户体验可能是一项挑战&#xff0c;尤其是在使用多种语言和平台时。Logrus IT的质量评估门户是一个强大的工具&#xff0c;可帮助企业简化内容和…...

程序调试

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在程序开发过程中&#xff0c;免不了会出现一些错误&#xff0c;有语法方面的&#xff0c;也有逻辑方面的。对于语法方面的比较好检测&#xff0c;因…...

深度学习-07-反向传播的自动化

深度学习-07-反向传播的自动化 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xf…...

网站模板中心/网站秒收录工具

文章目录1、下载MySQL2、下载完成后&#xff0c;解压、创建my.ini文件3、安装mysql4、修改密码5、创建用户和数据库&#xff0c;并将数据库授权用户备注&#xff1a;当用MySQL可视化工具---Navicat连接测试时&#xff0c;出现了1251错误提示&#xff08;或者提示client需要更新…...

建设银行的网站是什么情况/如何在百度推广自己

1. 中间件 中间件也称为“前置”(pre)和“后置”(post)钩子&#xff0c;是在执行异步功能期间传递控制的函数。中间件在模式(Schema)级别指定&#xff0c;对编写插件很有用。Mongoose中有4种类型的中间件&#xff1a;文档(document)中间件&#xff0c;模型(model)中间件&#…...

wordpress以前版本/网站推广优化平台

1、java日志记录错误的文件、方法、行号、报错信息StackTraceElement s e.getStackTrace()[0];1.1、记录保存的文件s.getFileName()1.2、记录保存的方法s.getMethodName()1.3、记录报错的行号 s.getLineNumber()1.4、记录报错的信息(不全面) e.getMessage()1.5、互利报错的类名…...

做网站最便宜多少钱/管理系统

近期&#xff0c;一些小伙伴说电脑开机出现错误代码0xc0000001&#xff0c;重新启动好几次还是一样&#xff0c;电脑开机出现错误代码0x0000001&#xff0c;一般是设备出现问题&#xff0c;又或者是一些文件损坏导致。遇此故障问题&#xff0c;大家别着急着重装系统&#xff0c…...

python做的网站/天津谷歌优化

第一种 # 安装mysql:5.7,直接docker run 他会自动去官方镜想下载 # MYSQL_ROOT_PASSWORD[的数据库密码&#xff0c;此处写的是123456 # -d 表示容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)&#xff1b;使用 -d 参数启动后…...

杭州响应式网站案例/企业seo排名费用报价

https://github.com/chenshuo/muduo/blob/master/muduo/base/Condition.h 前面分析了互斥锁MutexLock的实现&#xff0c;这里分析一下条件变量Condition的实现。条件变量需要一个互斥锁来保护。关于互斥锁和条件变量的基本用法见这里。 成员变量 MutexLock& mutex_;pthrea…...