【C语言数据结构】线性表-链式存储-单链表
线性表-链式存储-单链表
- 代码实现
代码实现
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>//定义元素数据类型
#define ElemType int//定义结点结构体
typedef struct LNode {//数据域,说白了就是存放当前节点的数据的。ElemType data;//指针域,就是存放这个节点指向的下一个节点的地址struct LNode *next;
} LNode, *LinkList; //LinkList就是LNode的代指//函数声明
bool Empty(LinkList L);//初始化链表
void InitList(LinkList *L) {//给链表的开头的结点分配一个LNode结构体大小的内存空间*L = (LinkList) malloc(sizeof(LNode));//将后继结点设置为NULL,也就是现在只有这一个节点(*L)->next = NULL;
}//头插法建立单链表
LinkList ListInsert_Head(LinkList *L) {InitList(L);ElemType Elem;printf("请输入要插入的元素数据(输入0结束):");scanf("%d", &Elem);while (Elem != 0) {//建立一个新的节点LinkList newNode = (LinkList) malloc(sizeof(LNode));newNode->data = Elem;newNode->next = (*L)->next;(*L)->next = newNode;scanf("%d", &Elem);}return *L;
}//尾插法建立单链表
LinkList ListInsert_Tail(LinkList *L) {InitList(L);ElemType Elem;LNode *p,*r = (*L);printf("请输入要插入的元素(输入0结束):");scanf("%d", &Elem);while (Elem != 0) {p = (LinkList) malloc(sizeof(LNode));p->data = Elem;p->next = NULL;r->next = p;r = p;scanf("%d", &Elem);}return *L;
}//求单链表表长
int Length(LinkList L) {//新建一个移动结点,负责遍历链表,因为有头结点,所以移动结点从头结点的下一个结点算起LNode *p = L->next;//定义int变量,用于统计链表长度int num = 0;while (p != NULL) {num++;p = p->next;}return num;
}//按值查找操作
//int LocateElem(LinkList L, ElemType Elem) {
// //定义移动指针,指向头结点的下一个位置
// LNode *p = L->next;
//
// //定义当前索引,初始值为1,因为头结点为0
// int index = 1;
//
// //如果当前节点数据不为要寻找的那个值,就继续循环
// while (p != NULL && p->data != Elem) {
// index++;
// p = p->next;
// }
// if (p == NULL) {
// return -1;
// }
// return index;
//}
/*------------------------上面写了个返回位置,其实应该返回结点----------------------------*///按值查找操作(返回结点)
LNode *LocateElem(LinkList L, ElemType Elem) {LNode *p = L->next;while (p != NULL && p->data != Elem) {p = p->next;}return p;
}//按位查找操作(返回结点)
LNode *GetElem(LinkList L, int index) {LNode *p = L->next;if (index > Length(L)) {printf("索引超出链表长度!\n");return NULL;}//为什么要大于1呢,因为0是头结点。while (index > 1) {p = p->next;index--;}return p;
}//插入操作
void ListInsert(LinkList *L, int index, ElemType Elem) {if (index > Length(*L)) {printf("索引超出链表长度!\n");return;}//建立临时移动结点LNode *p = (*L);//建立新节点LinkList new;InitList(&new);new->data = Elem;//先找到index位置的上一个节点while (index > 1) {p = p->next;index--;}//把插入位置的上一个节点的下一个节点赋值给新节点new->next = p->next;p->next = new;
}//删除操作
void ListDelete(LinkList *L, int index) {if (index > Length(*L)) {printf("索引超出链表长度!\n");return;}//其实前面有索引判断了,这个判空好像没用if (Empty(*L)) {printf("删除失败,链表为空!\n");return;}LNode *p = (*L);//找到删除位置的上一个节点while (index > 1) {p = p->next;index--;}p->next = p->next->next;
}//判空函数
bool Empty(LinkList L) {if (L == NULL || L->next == NULL) {return true;}return false;
}//销毁单链表
void DestroyList(LinkList *L) {//定义移动结点LNode *p = (*L);while (p != NULL) {//定义一个地址信息保存pLNode *temp = p;p = p->next;free(temp);}//将头结点设置为空*L = NULL;}//打印链表数据
void PrintList(LinkList L) {if (Empty(L)) {printf("链表为空!\n");return;}//新建一个LNode结点结构体p,并将链头结点的后继设置为这个结点的后继LNode *p = L->next;printf("链表中的元素为:");//当下一个结点不为空的时候,一直打印while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");
}int main() {//定义头结点LinkList head;//定义元素值ElemType Elem;//定义索引int index;//头插法建立链表
// head = ListInsert_Head(&head);//尾插法建立链表head = ListInsert_Tail(&head);//打印链表PrintList(head);//输出链表长度printf("链表长度为:%d\n", Length(head));//查找指定元素值的对应值(搁这搁这呢)printf("请输入要查找的元素的值:");scanf("%d", &Elem);printf("值为%d的元素的值为%d\n", Elem, LocateElem(head, Elem)->data);//查找指定位置的对应值printf("请输入要查找的元素的位置:");scanf("%d", &index);printf("位置为%d的元素的值为%d\n", index, GetElem(head, index)->data);//插入元素printf("请输入要插入的元素的位置:");scanf("%d", &index);printf("请输入要插入的元素的值:");scanf("%d", &Elem);ListInsert(&head, index, Elem);printf("插入元素后的链表:\n");PrintList(head);//删除元素printf("请输入要删除的元素的位置:");scanf("%d", &index);ListDelete(&head, index);printf("删除元素后的链表:\n");PrintList(head);//销毁链表DestroyList(&head);printf("销毁后的链表:\n");PrintList(head);
}
相关文章:
【C语言数据结构】线性表-链式存储-单链表
线性表-链式存储-单链表 代码实现 代码实现 #include<stdio.h> #include<stdlib.h> #include<stdbool.h>//定义元素数据类型 #define ElemType int//定义结点结构体 typedef struct LNode {//数据域,说白了就是存放当前节点的数据的。ElemType d…...

tp8 Editor.md
Editor.md - 开源在线 Markdown 编辑器 放于public文件夹下 html代码: <div class"layui-col-md12" id"content"><textarea name"content" placeholder"详情" class"layui-textarea">{notempty nam…...

LM小型可编程控制器软件(基于CoDeSys)笔记三十一:保持变量和非保持变量
所谓变量,就是用字母、数字和下划线组成的一个标识符。 按照数据类型的不同,变量可以分为标准类型和用户自定义类型。其中标准类型包括布尔型 ( BOOL )、整型( INT )、实型( REAL )…...

「C++之STL」关于在模拟实现STL容器中的深浅拷贝问题
文章目录 前言杨辉三角深浅拷贝问题模拟实现的vector对题目杨辉三角引发的程序崩溃原因解决办法 前言 在学习STL容器中,不仅需要学会容器的使用,同时也需要了解容器的大体框架以及各个函数的模拟实现才能更好的去了解这个容器; 杨辉三角 在LeetCode中有一道这样的题目,给定一…...

文件内容显示
目录 1.浏览普通文件 1.1. 文件内容查看 1.1.1. cat 命令 例: 1.1.2 扩展tac命令: 1.1.3. more 命令 1.1.4. less命令 1.1.5. head命令 1.1.6. tail命令 1.2. 文件属性信息查看 1.2.1. file 命令 1.2.2. stat 命令 2. 文件内容过滤…...
Milvus+Attu
Milvus 1.下载 https://github.com/milvus-io/milvus/releases/wget https://github.com/milvus-io/milvus/releases/download/v2.3.0/milvus-standalone-docker-compose.yml下载milvus-standalone-docker-compose version: 3.5services:etcd:container_name: milvus-etcdim…...

LeetCode算法二叉树—226. 翻转二叉树
目录 226. 翻转二叉树 代码: 运行结果: 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入…...

AI项目十:Swin Transformer目标检测环境搭建
若该文为原创文章,转载请注明原文出处。 Swin Transformer是做什么的这里不做介绍,主要是记录下学习的全过程,Swin Transformer在搭建和训练的过程中,折腾了很久,主要是在折腾环境。 一、AutoDL租用实例 个人没有GP…...
【IPC 通信】信号处理接口 Signal API(5)
收发信号思想是 Linux 程序设计特性之一,一个信号可以认为是一种软中断,通过用来向进程通知异步事件。 本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解信号编程。 kill(2) 遵循 POSIX.1 - 2008 1.库 …...

Arduino PLC IDE
Arduino PLC IDE MCU单片机进入全新的PLC领域概述需要的硬件和软件下一步操作1. Arduino PLC IDE Tool Setup2. Arduino PLC IDE Setup3. Project Setup4. Download the Runtime5. Connect to the Device6. License Activation with Product Key (Portenta Machine Control) 结…...

记录使用iText7查找PDF内容关键字坐标,加盖电子签名、印章
一、前言 项目以前签字都是由C端那边进行合成操作,最近项目要求把那块功能,由后端进行实现,其中包含坐标、关键字、任意位置进行签字操作,坐标是最容易实现的,曾经也写过类似的功能在(添加图片印章到PDF&a…...

Java8实战-总结37
Java8实战-总结37 默认方法不断演进的 API初始版本的 API第二版 API 默认方法 传统上,Java程序的接口是将相关方法按照约定组合到一起的方式。实现接口的类必须为接口中定义的每个方法提供一个实现,或者从父类中继承它的实现。但是,一旦类库…...

【超详细】前段开发之详细的Vue3入门教程,特别适合小白系统学习,入门到熟练使用Vue看这一篇就够了!
前言: 这篇文章更加侧重的是Vue3不同于Vue2的知识点,如果学习Vue2请看下面这篇文章 Vue2详细系统入门教程 11.2 Vue3 声明:图片资源来自于黑马程序员公开学习资料 本人在学习当中,详细整理了笔记,供大家参考学习 1…...

【深度学习】ONNX模型多线程快速部署【基础】
【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…...
Python 同、异步HTTP客户端封装:性能与简洁性的较量
一、前言 引入异步编程趋势:Python的异步编程正变得越来越流行。在过去,同步的HTTP请求已经不足以满足对性能的要求。异步HTTP客户端库的流行:目前,有许多第三方库已经实现了异步HTTP客户端,如aiohttp和httpx等。然而…...

无代码赋能数字化,云表搭桥铺路链接“数据孤岛”
什么是信息孤岛 企业数字化转型过程中,信息孤岛是一个突出的问题。这种情况发生的原因是,企业内部使用了多种应用软件,时间一长,员工在不同的系统中积累了大量的企业数据资产。然而,由于这些系统之间的数据无法互通&am…...

无需公网IP,实现公网SSH远程登录MacOS【内网穿透】
目录 前言 1. macOS打开远程登录 2. 局域网内测试ssh远程 3. 公网ssh远程连接macOS 3.1 macOS安装配置cpolar 3.2 获取ssh隧道公网地址 3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址 4.1 保留一个固定TCP端口地址 4.2 配置固定TCP端口地址 5. 使用固定TCP端…...
网络爬虫学习笔记 1 HTTP基本原理
HTTP原理 ~~~~~ HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一种使用最为广泛的网络请求方式,常见于在浏览器输入一个地址。 1. URI和URL URL(Universal Resource Locator,统一资源定位器&…...

113. 路径总和ii
力扣题目链接(opens new window) 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树,以及目标和 sum 22, 在路径总和题目的基础上&…...

百度APP iOS端包体积50M优化实践(六)无用方法清理
一、前言 百度APP包体积经过一期优化,如无用资源清理,无用类下线,Xcode编译相关优化,体积已经有了明显的减少。但是优化后APP包体积在iPhone11上仍有350M的空间占用。与此同时百度APP作为百度的旗舰APP,业务迭代非常多…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...