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

创建一个简单的单链表

1.头文件的Slist.h的代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef int SListint;
typedef struct Slist//单链表
{SListint data;struct Slist* next;
}SL;//尾插
void SlistPushBank(SL** plist,SListint x);
//头插
void SlistPushFront(SL** plist, SListint x);
//打印
void Slist_print(SL** plist);
//尾删
void SlistPopBank(SL** plist);
//头删
void SlistPopFront(SL** plist);
//查找
SL* SlistFind(SL* plist, SListint x);
//在pos位置前插入x
void SlistInsert(SL** plist, SL* pos, SListint x);
//删除pos位置的值
void SListFrase(SL** plist, SL* pos);
//销毁
void SlistDestroyed(SL** plist);

2.源文件Slist.h的函数实现

#include"Slist.h"
//申请空间函数
SL* kuorong(SListint x)
{SL* newnode = (SL*)malloc(sizeof(SL));newnode->data = x;newnode->next = NULL;return newnode;
}
//尾插
void SlistPushBank(SL** plist, SListint x)
{assert(plist);SL* newnode = kuorong(x);if (*plist == NULL){*plist = newnode;}else { SL* pcur = *plist; while (pcur->next != NULL){pcur = pcur->next;}pcur->next = newnode;}
}
//头插
void SlistPushFront(SL** plist, SListint x)
{assert(plist);SL* newnode = kuorong(x);newnode->next = *plist;*plist = newnode;
}
//打印
void Slist_print(SL** plist)
{SL* ret = *plist;while (ret)//ret != NULL{printf("%d->", ret->data);ret = ret->next;}printf("NULL\n");
}
//尾删
void SlistPopBank(SL** plist)
{assert(*plist);//*plist == NULL   1if ((*plist)->next == NULL)//    2{free(*plist);*plist = NULL;}else                      //     3{SL* ret = *plist;SL* pcur = *plist;while (ret->next != NULL){pcur = ret;ret = ret->next;}free(ret);pcur->next = NULL;}
}
//头删
void SlistPopFront(SL** plist)
{assert(*plist);if ((*plist)->next == NULL){free(*plist);}else{SL* ret = (*plist)->next;free(*plist);*plist = ret;}
}
//查找
SL* SlistFind(SL* plist, SListint x)
{SL* ret = plist;while (ret){if (x == ret->data){return ret;}ret = ret->next;}return NULL;
}
//在pos之前插入数据
void SlistInsert(SL** plist, SL* pos, SListint x)
{assert(plist);if (pos == *plist){SlistPushFront(plist, x);//如果只有一个数值,那么调用头插,不然会报错}else{SL* ret = *plist;SL* newnode = kuorong(x);while (ret->next != pos){ret = ret->next;}newnode->next = ret->next;ret->next = newnode;}
}
//删除pos位置的值
void SListFrase(SL** plist, SL* pos)
{assert(plist);if (pos == *plist){SlistPopFront(plist);}else{SL* ret = *plist;while (ret->next != pos){ret = ret->next;}ret->next = pos->next;free(pos);}
}
//销毁
void SlistDestroyed(SL** plist)
{SL* ret = *plist;while (ret){SL* cur = ret->next;free(ret);ret = cur;}*plist = NULL;
}

3.测试test.c的代码
 

#define _CRT_SECURE_NO_WARNINGS 1
#include"Slist.h"
void menu()
{printf("*************************\n");printf("1.尾插             2.头插\n");printf("3.尾删             4.头删\n");printf("5.打印链表     6.查找元素\n");printf("7pos前插入      8.删除pos\n");printf("9.销毁        10.退出菜单\n");printf("*************************\n");
}
int main()
{int input = 0, x = 0, y = 0;SL* plist = NULL;do{menu();printf("请输入你的选择\n");scanf("%d", &input);switch (input){case 1:printf("\n请输入尾插的数值,输入-1结束\n");do{scanf("%d", &x);if (x != -1){SlistPushBank(&plist, x);}} while (x != -1);break;case 2:printf("请输入头插的数值,输入-1结束\n");do{scanf("%d", &x);if (x != -1){SlistPushFront(&plist, x);}} while (x != -1);break;case 3:SlistPopBank(&plist);printf("尾删成功\n");break;case 4:SlistPopFront(&plist);printf("头删成功\n");break;case 5:Slist_print(&plist);break;case 6:printf("请输入你要查找的元素\n");scanf("%d", &x);SL* ret = SlistFind(plist,x);if (ret != NULL){printf("找到了\n");}else{printf("没找到\n");}break;case 7:printf("请输入你要在哪个pos之前插入\n");scanf("%d", &x);SL* retpos1 = SlistFind(plist,x);if (retpos1 == NULL){printf("要插入的pos数值不存在\n");exit(1);}else {printf("请输入要插入的数值\n");scanf("%d", &y);SlistInsert(&plist, retpos1, y);printf("插入成功\n");}break;case 8:printf("请输入你要删除的pos数值\n");scanf("%d", &x);SL* retpos2 = SlistFind(plist,x);if (retpos2 == NULL){printf("要删除的pos节点不存在\n");exit(1);}else{SListFrase(&plist, retpos2);printf("删除成功\n");}break;case 9:SlistDestroyed(&plist);printf("销毁成功\n");break;case 10:input = -1;printf("退出中....\n");break;default:printf("请选择1-10的方法\n");break;}} while (input != -1);return 0;
}

相关文章:

创建一个简单的单链表

1.头文件的Slist.h的代码 #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef int SListint; typedef struct Slist//单链表 {SListint data;struct Slist* next; }SL;//尾插 void SlistPushBank(SL*…...

15.1 Zookeeper简介安装及基础使用

1. Zookeeper介绍 1.1 介绍 1.2 应用场景简介 1.3 zookeeper工作原理 1.4 zookeeper特点...

详细说明Java中Map和Set接口的使用方法

Map与Set的基本概念与场景 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有&#xff1a; 1. 直接遍历&#xff0c;时间复杂度为O(N)&#xff0c;元素如果比较多效率会非常慢。 2. 二分查找&#x…...

CSS3 scale 适配

Scale适配&#xff0c;在前端开发中&#xff0c;特别是在CSS3中&#xff0c;主要指的是使用scale()函数对元素进行缩放处理&#xff0c;以适应不同的屏幕尺寸或达到特定的视觉效果。以下是对Scale适配的详细介绍&#xff1a; 一、基本概念 scale() 是CSS3中transform属性的一…...

SX_初识GitLab_1

1、对GitLab的理解&#xff1a; 目前对GitLab的理解是其本质是一个远程代码托管平台&#xff0c;上面托管多个项目&#xff0c;每个项目都有一个master主分支和若干其他分支&#xff0c;远程代码能下载到本机&#xff0c;本机代码也能上传到远程平台 1.分支的作用&#xff1a…...

这才是 PHP 高性能框架 Workerman 的立命之本

大家好&#xff0c;我是码农先森。 在这个大家都崇尚高性能的时代&#xff0c;程序员的谈笑间句句都离不开高性能&#xff0c;仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low&#xff0c;其中众所皆知的 Nginx 就是高性能的代表。有些朋友可能连什么是高性能都不一定理解…...

Python——记录pip问题(解决下载慢、升级失败问题)

在python开发中&#xff0c;经常需要使用到各种各样的库。 pip又是我们常用的安装工具。但是国外的源下载速度实在太慢&#xff0c;经常导致超时。 有很多朋友刚刚学Python的时候&#xff0c;会来问为什么pip下载东西这么慢啊&#xff1f; 而且pycharm里面下载库也是非常的慢…...

Windows Server 2025 Preview 部署 Ⅰ—— ISO下载和硬件要求

目录 1. 预览版下载2. Windows 服务器的硬件要求2.1安装 Windows Server 2025 虚拟机注意事项2.2 CPU2.3 RAM / Memory2.4 存储 Storage2.5 网络 Network2.6 其他需求 1. 预览版下载 下载网站&#xff1a;https://www.microsoft.com/en-in/evalcenter/download-windows-server…...

AI2-CUDA、CuDNN、TensorRT的详细安装教程

一、查看本机的显卡 首先你要看你的电脑是否有NVIDIA的独立显卡&#xff0c;你可以在设备管理器-显示适配器中查看 点击“开始”--找到“NVIDA Control Panel” 点击帮助--系统信息--组件&#xff0c;查看NVCUDA.DLL对应的产品名称&#xff0c;就可以看住CUDA的版本号 这里的版…...

TCP连接中重复使用了两个相同的端口怎么办

1.检查并避免重复配置&#xff1a; 首先&#xff0c;应该检查系统的配置和应用程序的设置&#xff0c;确保没有错误地将多个服务或进程配置为使用相同的端口号。 使用网络监控工具&#xff08;如netstat、ss等&#xff09;来查看当前哪些端口正在被使用。 2.使用端口复用选项…...

如何自定义异常

目录 为什么自定义异常自定义异常的步骤参考资料 为什么自定义异常 自定义异常是指开发者根据应用程序的需求和逻辑&#xff0c;自行定义的异常类。与 Java 提供的标准异常类&#xff08;如 NullPointerException、IOException 等&#xff09;不同&#xff0c;自定义异常允许程…...

C++中的依赖注入

目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式&#xff0c;它允许我们在不直接创建对象的情况下为对象提供其依赖项&#xff1b;它通过将…...

CSS平面转换-平移

平面转换-平移 属性 transform: translate(X轴移动距离, Y轴移动距离); 取值 像素单位取值百分比&#xff08;参照盒子自身尺寸计算结果&#xff09;正负均可 技巧translate()只写一个值表示只沿着X轴移动单独设置X或Y轴距离&#xff1a;translateX()或translateY() 代码 …...

Linux-3:Shell编程——基础语法(0-50%)

目录 前言 一、变量 1.定义变量 2.使用变量 3.修改变量 4.将命令的结果赋值给变量 5.只读变量 6.删除变量 二、传递参数 三、字符串 1.字符串举例 2.统计字符串长度 3.字符串拼接 4.截取字符串 总结 前言 Shell是一种程序设计语言。作为命令语言&#xff0c;它…...

C++ --> string类模拟实现(附源码)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言&#xff1a; C中STL扮演着极其重要的角色&#xff0c;学习C重中之重的就是学习STL&#xff0c;虽然string不作为containers的其中一员&#xff0c;但是也是值得学习的le类。下面就进行string的模拟实现 string的模拟…...

基于PHP+MySQL组合开发的微信活动投票小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代&#xff0c;微信作为社交媒体的巨头&#xff0c;为企业和个人提供了丰富的互动营销平台。其中&#xff0c;投票活动作为一种有效的用户参与和互动方式&#xff0c;被广泛应用于各种场景。为了满足这一需求&#xff0c;我们推出了一款基于PHPMySQL组…...

利用Arcgis设置分式标注(分子分母标注)

因工作需要&#xff0c;需要设置分式标注&#xff0c;下面详细介绍下如何利用arcgis 设置分式标注&#xff0c;以下操作以供参考&#xff0c;如有疑义可提出。 一、准备工作 软件&#xff1a;arcmap 示例数据&#xff1a;行政区shp矢量图 二、操作步骤 1.添加数据 将行政区sh…...

大麦网抢票攻略:使用Python Selenium实现

随着互联网技术的发展&#xff0c;在线购票已成为人们获取演出、比赛等活动门票的主要方式。然而&#xff0c;面对热门活动&#xff0c;门票往往在开售瞬间被抢购一空。为了解决这一问题&#xff0c;本文将介绍如何利用Python和Selenium技术实现大麦网的自动抢票。 1. 环境准备…...

Navicat 在整个数据库中查找字符

Navicat 在整个数据库中查找字符 1.首先打开Navicat,连接目标数据库。2.选择工具选项卡&#xff0c;选择在数据库或模式中查找。3.查找前填入关键字信息&#xff0c;点击查找4.双击查找到数据&#xff0c;进行查看 说明&#xff1a;当我们知道数据库有数据的关键字&#xff0c;…...

Python基础—处理时间问题

一文帮助您解决99%时间处理问题...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...