【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,业务迭代非常多…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
