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

单链表接口函数的实现(增删查改)

一、单链表的实现形式以及接口函数的声明

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType ;typedef struct SListNode
{DataType data;struct SListNode* next;
}SLTNODE;
void SLTPrint(SLTNODE* phead);//打印链表
SLTNODE* SLTBuyNode(DataType x);//创建节点
void SLTPushBack(SLTNODE** phead, DataType x);//尾插
void SLTPushFront(SLTNODE** phead, DataType x);//头插
void SLTPopBack(SLTNODE** phead);//尾删
void SLTPopFront(SLTNODE** phead);//头删
SLTNODE* SLTFind(SLTNODE* phead, DataType x);//查找
void SLTInsert(SLTNODE** phead, SLTNODE* pos, DataType x);//待定位置之前的插入
void SLTInsertAfter( SLTNODE* pos, DataType x);//待定位置之后的插入
void SLTErase(SLTNODE** phead, SLTNODE* pos);//删除待定节点
void SLTEraseAfter( SLTNODE* pos);//删除待定节点之后的节点
void SLTDestroy(SLTNODE** phead);//销毁链表

二、接口函数的实现

1.打印链表

代码如下(示例):

void SLTPrint(SLTNODE* phead)//打印链表
{SLTNODE* cur = phead;while (cur){printf("%d->", cur->data);cur = cur->next;}puts("NULL");
}

2.创建节点

代码如下(示例):

SLTNODE* SLTBuyNode(DataType x)//创建节点
{SLTNODE* newnode = (SLTNODE*)malloc(sizeof(SLTNODE));assert(newnode);newnode->data = x;newnode->next = NULL;return newnode;
}

3.尾插

代码如下(示例):

void SLTPushBack(SLTNODE** phead, DataType x)//尾插
{
    assert(phead);
    SLTNODE* newnode = SLTBuyNode(x);
    if (*phead == NULL)
    {
        *phead = newnode;
    }
    else
    {
        SLTNODE* tail = *phead;
        while (tail->next)
        {
            tail = tail->next;
        }
        tail->next = newnode;
    }
}

4.头插

代码示例:

void SLTPushFront(SLTNODE** phead, DataType x)//头插
{
    assert(phead);
    SLTNODE* newnode = SLTBuyNode(x);
    newnode->next = *phead;
    *phead = newnode;
}

5.尾删

代码示例:

void SLTPopBack(SLTNODE** phead)//尾删
{
    assert(phead && *phead);
    if ((*phead)->next == NULL)
    {
        free(*phead);
        *phead = NULL;
    }
    else
    {
        SLTNODE* prev = NULL;
        SLTNODE* tail = *phead;
        while (tail->next)
        {
            prev = tail;
            tail = tail->next;
        }
        free(tail);
        prev->next = NULL;
    }
}

6.头删

代码示例:

void SLTPopFront(SLTNODE** phead)//头删
{
    assert(phead && *phead);
    SLTNODE* next = (*phead)->next;
    free(*phead);
    *phead = next;
}

7.查找

代码示例:

SLTNODE* SLTFind(SLTNODE* phead, DataType x)//查找
{
    assert(phead);
    SLTNODE* cur = phead;
    while (cur)
    {
        if (cur->data == x)
        {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

8.指定位置之前的插入

代码如下:

void SLTInsert(SLTNODE** phead, SLTNODE* pos, DataType x)//待定位置之前的插入
{
    assert(phead && *phead);
    assert(pos);
    if (pos == *phead)
    {
        SLTPushFront(phead, x);//头插
    }
    else
    {
        SLTNODE* newnode = SLTBuyNode(x);
        SLTNODE* prev = *phead;
        while (prev->next!=pos)
        {
            prev = prev->next;
        }
        newnode->next = prev->next;
        prev -> next = newnode;
    }
}

9.指定位置之后的插入

void SLTInsertAfter( SLTNODE* pos, DataType x)//待定位置之后的插入
{
    
    assert(pos);
    SLTNODE* newnode = SLTBuyNode(x);
    newnode->next = pos->next;
    pos->next = newnode;
}

10.删除待定位置的节点

代码示例:

void SLTErase(SLTNODE** phead, SLTNODE* pos)//删除待定节点
{
    assert(phead && *phead);
    assert(pos);
    if (pos == *phead)
    {
        SLTPopFront(phead);
    }
    else
    {
        SLTNODE* prev = *phead;
        while (prev->next != pos)
        {
            prev = prev->next;
        }
        prev->next = pos->next;
        free(pos);
    }
}

11.销毁链表

代码示例:

void SLTDestroy(SLTNODE** phead)//销毁链表
{
    assert(*phead && phead);
    SLTNODE* cur = *phead;
    while (cur)
    {
        SLTNODE* next = cur->next;
        free(cur);
        cur = next;
    }
    *phead = NULL;
}


相关文章:

单链表接口函数的实现(增删查改)

一、单链表的实现形式以及接口函数的声明 #include<stdio.h> #include<stdlib.h> #include<assert.h> typedef int DataType ;typedef struct SListNode {DataType data;struct SListNode* next; }SLTNODE; void SLTPrint(SLTNODE* phead);//打印链表 SLTNO…...

超低功耗Sub-1G收发芯片DP32RF002 M0内核(G)FSK/OOK 无线收发机的32位SoC芯片

产品概述 DP32RF002是深圳市动能世纪科技有限公司研制的基于ARMCortex-MO内核的超低功耗 高性能的、单片集成(G)FSK/OOK 无线收发机的32位SoC芯片。工作于200 ~960MHz范围内&#xff0c;支持灵活可设的数据包格式&#xff0c;支持自动应答和自动重发功能&#xff0c;支持跳频…...

uniapp_微信小程序_NaN

一、定义 isNaN() 函数用于检查一个值是否为 NaN。它接受一个参数&#xff0c;该参数可以是任何 JavaScript 数据类型&#xff0c;包括数字、字符串、对象等。如果参数是 NaN&#xff0c;或者不能被转换为数字&#xff0c;则 isNaN() 返回 true&#xff1b;否则返回 false。 …...

1043: 利用栈完成后缀表达式的计算

解法&#xff1a; #include<iostream> #include<stack> using namespace std; int main() {char a;stack<int> sk;while (cin >> a && a ! #) {if (a > 0 && a < 9) {sk.push(a - 0);}else {int num2 sk.top();sk.pop();int n…...

初学ELK - elk部署

一、简介 ELK是3个开源软件组合&#xff0c;分别是 Elasticsearch &#xff0c;Logstash&#xff0c;Kibana Elasticsearch &#xff1a;是个开源分布式搜索引擎&#xff0c;提供搜集、分析、存储数据三大功能。它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自…...

[Java EE] 计算机工作原理与操作系统简明概要

1. 计算机工作原理 1.1 生活中常见的计算机 计算机分为通用计算机和专用计算机,计算机并不单单指的是电脑,还有我们平时使用的手机,ipad,智能手表等终端设备都是计算机.还有我们用户不常见的计算机,比如服务器. 还有许多嵌入式设备(针对特定场景定制的"专用计算机"…...

【尚硅谷】Git与GitLab的企业实战 学习笔记

目录 第1章 Git概述 1. 何为版本控制 2. 为什么需要版本控制 3. 版本控制工具 4. Git简史 5. Git工作机制 6. Git和代码托管中心 第2章 Git安装 第3章 Git常用命令 1. 设置用户签名 1.1 基本语法 1.2 案例实操 2. 初始化本地库 2.1 基本语法 2.2 案例实操 3. 查…...

如何在MobaXterm上使用rz命令

1、首先输入命令和想下载的文件&#xff0c;如下图&#xff1a; 2、按住ctrl鼠标右键&#xff0c;选择如下选项&#xff1a; 上传命令是rz&#xff0c;选择Receive...... 下载命令是sz&#xff0c;选择Send...... 3、我这里是要把Linux上的文件下载到我的本地window磁盘&…...

【计算机考研】408网课汇总+资源分享

408王道的视频就比较通俗易懂 王道的教材非常契合408的大纲&#xff0c;是专门为408大纲而编写的&#xff0c;而教材是方方面面都讲解的透彻。 建议王道为主&#xff0c;网络搜索为辅&#xff01; 王道中讲解不清楚&#xff0c;看不懂的知识点&#xff0c;可以尝试在网络上进…...

如何在OceanBase v4.2 中快速生成随机数据

在使用传统数据库如 MySQL 和 Oracle 时&#xff0c;由于缺乏多样化的随机数据生成方案&#xff0c;或者实现成本过高&#xff0c;构造随机数据的开发成本受到了影响。OceanBase在老版本中虽然有相应的解决方案&#xff0c;但语法复杂和性能较差等问题仍然存在。 现在&#xf…...

nvm node.js的安装

说明&#xff1a;部分但不全面的记录 因为过程中没有截图&#xff0c;仅用于自己的学习与总结 过程中借鉴的优秀博客 可以参考 1,npm install 或者npm init vuelatest报错 2&#xff0c;了解后 发现是nvm使用的版本较低&#xff0c;于是涉及nvm卸载 重新下载最新版本的nvm 2…...

【Docker】安装Redis、Nginx

1、安装redis mkdir -p /docker/redis mkdir -p /docker/redis/data touch /docker/redis/redis.conf touch /docker/redis/redis.bash编辑配置文件 vim /docker/redis/redis.conf # Redis配置文件# Redis默认不是以守护进程的方式运行&#xff0c;可以通过该配置项修改&…...

RK3568 UBUNTU修改网卡名称

​​​​​​RK3568 UBUNTU系统有两个网卡&#xff0c;ETH0和ETH1&#xff0c;于设备机壳丝印ETH1、ETH2无法对应&#xff0c;于是百度了一下相关的修改办法&#xff0c;有修改设备树的等等&#xff0c;挑了一个最简单&#xff0c;验证通过 #第1步&#xff0c;将原网卡关闭ip …...

【华为OD机试C++】统计字符

《最新华为OD机试题目带答案解析》:最新华为OD机试题目带答案解析,语言包括C、C++、Python、Java、JavaScript等。订阅专栏,获取专栏内所有文章阅读权限,持续同步更新! 文章目录 描述输入描述输出描述示例代码描述 输入一行字符,分别统计出包含英文字母、空格、数字和其它…...

百货商场用户画像描绘and价值分析(下)

目录 内容概述数据说明技术点主要内容4 会员用户画像和特征字段创造4.1 构建会员用户基本特征标签4.2 会员用户词云分析 5 会员用户细分和营销方案制定5.1 会员用户的聚类分析及可视化5.2 对会员用户进行精细划分并分析不同群体带来的价值差异 内容概述 本项目内容主要是基于P…...

spring-cloud微服务gateway

核心部分&#xff1a;routes(路由)&#xff0c; predicates(断言)&#xff0c;filters(过滤器) id&#xff1a;可以理解为是这组配置的一个id值&#xff0c;请保证他的唯一的&#xff0c;可以设置为和服务名一致 uri&#xff1a;可以理解为是通过条件匹配之后需要路由到&…...

【python】在pycharm创建一个新的项目

双击打开pycharm,选择create new project 选择create,后进入项目 右键项目根目录,选择new一个新的python file 随意命名一下 输入p 然后后面就会出现智能补全提示,此时轻敲一下tab,代码就写好了,非常的方便 右键执行一下代码,下面两个直接运行和debug运行都是可以的 小结 …...

java小作业(9)----用函数实现斐波那契数列(第二遍)

代码&#xff1a; public class Main {public static void main(String[] args) {int n 20; // 你可以更改这个值来计算和输出前n个斐波那契数for (int i 0; i < n; i) {System.out.print(fibonacci(i) " ");}}public static int fibonacci(int n) {if (n <…...

部署项目的时候的一些错误

项目打jar包&#xff0c;找不到资源&#xff0c;连接不上数据库 项目打包后无法运行 直接在idea运行可以 解决方法&#xff1a;pom文件中增加&#xff08;配置文件如果是yml&#xff0c;写yml&#xff09; <resources><resource><directory>src/main/java&…...

1044: 顺序栈基本操作的实现

解法&#xff1a; #include<iostream> #include<stack> using namespace std; int main() {int n, a, k;stack<int> sk;cin >> n;while (n--) {cin >> a;sk.push(a);}cin >> k;while (k--) {sk.pop();}if (!sk.empty()) {cout << s…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...