c实现链表
目录
c实现链表
链表的结构定义:
链表的结构操作:
1、初始化链表
2、销毁链表
3、插入结点
4、输出链表数据
5、查找链表数据
扩展
代码实现
c实现链表
链表的结构定义:
/*** 链表结构定义 ***/ typedef struct Node {int data; //数据领struct Node * next; //指针域 }Node;链表的结构操作:
1、初始化链表
//1、初始化 Node * getNewNode(int val){Node * p = (Node *)malloc(sizeof(Node)); //为新链表开辟空间p->data = val; //数据域赋值p->next = NULL; //指针域指向空return p; }2、销毁链表
//2、销毁链表 void clear(Node * head){if(head == NULL) return ;//不能直接释放结点,如果直接释放会导致内存泄漏for(Node *p = head, *q; p; p = q){q = p->next;free(p);}return ; }3、插入结点
// //3.1、无头链表:插入节点 // Node *insert(Node *head, int pos, int val){ // if( pos == 0 ){ // //如果插入位置是0也就是头指针的位置 // //先将val值包成一个新节点,然后让新节点指向原来链表的首地址,再返回新链表的首地址 // Node *p = getNewNode(val); // p->next = head; // return p; // }// int n = -1; // for (Node *p = head; p; p = p->next) n += 1; // if(pos > n) pos = n;// //定义指针p找到待插入位置的前一个元素 // Node *p = head; // for (int i = 0; i < pos; i++) p = p->next; // Node * node = getNewNode(val); // 将val值包成一个新节点,插入节点 // node->next = p->next; // p->next = node; // return head; //返回新链表 // } //3.2 有头链表:插入节点 Node *insert2(Node *head, int pos, int val){// 虚拟头节点 指针p指向虚拟头节点 插入结点开辟新的空间Node new_head, *p = &new_head, *node = getNewNode(val);new_head.next = head;//虚拟头节点指向链表for (int i = 0; i < pos; i++) p = p->next;//找到插入前一个位置node->next = p->next;p->next = node;return new_head.next; //返回头结点的所指向链表的地址 }4、输出链表数据
//4、输出链表数据 void output_linklist(Node *head){int n = 0;// 先统计有多少个结点for (Node *p = head; p; p = p->next) n += 1; for (int i = 0; i < n; i++){printf("%3d",i);printf(" ");}printf("\n");for(Node *p = head; p; p = p->next){printf("%3d",p->data);printf("->");}printf("\n\n\n");return ; }5、查找链表数据
//5、查找 int find(Node *head, int val){Node *p = head;int n = 0;while (p){if(p->data == val){output_linklist(head);int len = n * (3 + 2) + 2;for (int i = 0; i < len; i++) printf(" ");printf("^\n");for (int i = 0; i < len; i++) printf(" ");printf("|\n");return 1;}n += 1;p = p->next;}return 0; }
扩展
while(~scanf("%d", &n)) 等价于 while(scanf("%d",&n)!=EOF)
EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。EOF通常的值为-1。while(~scanf("%d", &n)) 意思就是当有值输入的时候,进入while,当没有值输入时就结束while。(输入了值,如果scanf成功读取了就返回1,取反的结果不为0,进入while;如果scanf没有成功读取,返回0,取反的结果不为0,进入while;如果没有输入,到达文件末尾则返回-1,取反的结果为0,结束while。)
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>/*** 链表结构定义 ***/
typedef struct Node
{int data; //数据领struct Node * next; //指针域
}Node;/*** 链表结构操作 ***/
//1、初始化
Node * getNewNode(int val){Node * p = (Node *)malloc(sizeof(Node)); //为新链表开辟空间p->data = val; //数据域赋值p->next = NULL; //指针域指向空return p;
}// //3.1、无头链表:插入节点
// Node *insert(Node *head, int pos, int val){
// if( pos == 0 ){
// //如果插入位置是0也就是头指针的位置
// //先将val值包成一个新节点,然后让新节点指向原来链表的首地址,再返回新链表的首地址
// Node *p = getNewNode(val);
// p->next = head;
// return p;
// }// int n = -1;
// for (Node *p = head; p; p = p->next) n += 1;
// if(pos > n) pos = n;// //定义指针p找到待插入位置的前一个元素
// Node *p = head;
// for (int i = 0; i < pos; i++) p = p->next;
// Node * node = getNewNode(val); // 将val值包成一个新节点,插入节点
// node->next = p->next;
// p->next = node;
// return head; //返回新链表
// }
//3.2 有头链表:插入节点
Node *insert2(Node *head, int pos, int val){// 虚拟头节点 指针p指向虚拟头节点 插入结点开辟新的空间Node new_head, *p = &new_head, *node = getNewNode(val);new_head.next = head;//虚拟头节点指向链表for (int i = 0; i < pos; i++) p = p->next;//找到插入前一个位置node->next = p->next;p->next = node;return new_head.next; //返回头结点的所指向链表的地址
}//2、销毁链表
void clear(Node * head){if(head == NULL) return ;//不能直接释放结点,如果直接释放会导致内存泄漏for(Node *p = head, *q; p; p = q){q = p->next;free(p);}return ;
}//4、输出链表数据
void output_linklist(Node *head){int n = 0;// 先统计有多少个结点for (Node *p = head; p; p = p->next) n += 1; for (int i = 0; i < n; i++){printf("%3d",i);printf(" ");}printf("\n");for(Node *p = head; p; p = p->next){printf("%3d",p->data);printf("->");}printf("\n\n\n");return ;
}//5、查找
int find(Node *head, int val){Node *p = head;int n = 0;while (p){if(p->data == val){output_linklist(head);int len = n * (3 + 2) + 2;for (int i = 0; i < len; i++) printf(" ");printf("^\n");for (int i = 0; i < len; i++) printf(" ");printf("|\n");return 1;}n += 1;p = p->next;}return 0;
}int main(void){srand(time(0));#define MAX_OP 7Node *head = NULL;for (int i = 0; i < MAX_OP; i++){int pos = rand() % (i+1), val = rand() % 100;printf("insert %d at %d to linklist.\n",val,pos);head = insert2(head,pos,val);output_linklist(head);}int val;while (~scanf("%d", &val)) {if (!find(head, val)) {printf("not found\n");}}clear(head);return 0;
}
相关文章:
c实现链表
目录 c实现链表 链表的结构定义: 链表的结构操作: 1、初始化链表 2、销毁链表 3、插入结点 4、输出链表数据 5、查找链表数据 扩展 代码实现 c实现链表 链表的结构定义: /*** 链表结构定义 ***/ typedef struct Node {int data; //…...
力扣231. 2 的幂(数学,二分查找,位运算)
Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1:位运算 1.易验证2的幂为正数; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2:数学 当给定数n大于1时…...
Maven私服部署与JAR文件本地安装
Nexus3 是一个仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。 平常我们在获取 maven 仓库资源的时候,都是从 maven 的官方(或者国内的镜像)获取。团队的多人员同样的依赖都要从远程获取一遍,从网络方…...
【MySQL】字符串函数的学习
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-J7VN4RbrBi51ozap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
AI助力农作物自动采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建作番茄采摘场景下番茄成熟度检测识别计数分析系统
去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物,专家设计出来了很多用于采摘不同农作物的大型机械,看着非常震撼,但是我们国内农业的发展还是相对比较滞后的࿰…...
记录下ibus-libpinyin输入法的重新安装
目前的版本为: 首先把现在的ibus-libpinyin卸了 sudo apt-get --purge remove ibus-libpinyin sudo apt-get autoremove 安装教程请参考 Installation libpinyin/ibus-libpinyin Wiki GitHub yilai sudo apt install pkg-config sudo apt-get install lib…...
第三百一十八回
文章目录 1. 概念介绍2. 使用方法2.1 本地缓冲2.2 服务器缓冲3. 示例代码4. 内容总结我们在上一章回中介绍了"如何让输入键盘不遮挡屏幕"相关的内容,本章回中将介绍如何有效地缓冲网络图片.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的…...
破除Github API接口的访问次数限制
破除Github API接口的访问次数限制 1、Github介绍2、Github API接口2.1 介绍2.2 使用方法 3、Github API访问限制3.1 访问限制原因3.2 访问限制类别 4、Github API访问限制破除4.1 限制破除原理4.2 限制破除示例 1、Github介绍 Github,是一个面向开源及私有软件项目…...
蓝桥杯嵌入式第8届真题(完成) STM32G431
蓝桥杯嵌入式第8届真题(完成) STM32G431 题目 分析和代码 对比第六届和第七届,这届的题目在逻辑思维上确实要麻烦不少,可以从题目看出,这届题目对时间顺序的要求很严格,所以就可以使用状态机的思想来编程,拿到类似题…...
第二节 zookeeper基础应用与实战
目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …...
改变AI服务器:探索界面互连芯片技术的创新突破
根据TrendForce的数据,AI服务器的出货量约为130,000台,占全球服务器总出货量的约1%。随着微软、Meta、百度和字节跳动等主要制造商相继推出基于生成式AI的产品和服务,订单量显著增加。预测显示,在ChatGPT等应用的持续需求推动下&a…...
【P1506 拯救oibh总部】
拯救oibh总部 题目背景 oibh 总部突然被水淹没了!现在需要你的救援…… 题目描述 oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示,而一个四面被围墙围住的区域洪水是进不去的。 oibh 总部内部也有许…...
应用层 HTTP协议(1)
回顾 前面我们说到了数据链路层,网络层IP协议,传输层的TCP/UDP协议一些知识点,现在让我们谈谈 应用层的HTTP协议的知识点. 这篇我们先从大局入手,仍然是对总体报文进行全局分析,再对细节报文进行拆解分析 版本 首先我们谈谈HTTP协议的版本 HTTP 0.9 (1991) HTTP 1.0 (1992 - 1…...
Linux学习笔记(centOS)—— 文件系统
目录 一、Linux中的文件 打开方式 二、目录结构 三、相关命令 切换目录命令 列出当前目录下的文件和目录命令 一、Linux中的文件 “万物皆文件。” 图1.1 所有文件 打开方式 图形化界面左上角的位置→计算机,打开以后就可以看到Linux全部的文件了…...
华视 CVR-100UC 身份证读取 html二次开发模板
python读卡:python读卡 最近小唐应要求要开发一个前端的身份证读卡界面,结果华视CVR-100UC 的读取界面是在是有点,而且怎么调试连官方最基本的启动程序都执行不了。CertReader.ocx 已成功,后面在问询一系列前辈之后,大…...
ubuntu彻底卸载cuda 重新安装cuda
sudo apt-get --purge remove "*cublas*" "*cufft*" "*curand*" \"*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*" cuda10以上 cd /usr/local/cuda-xx.x/bin/ s…...
【Java】学习笔记:关于java.sql;
Connection conn null; Connection:这是一个 Java 接口,表示与数据库的连接。在这里,conn 是一个 Connection 类型的变量。 conn:这是变量的名称,可以根据需要进行更改。通常,conn 被用作表示数据库连接的…...
python web 框架Django学习笔记
2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式,把程序或者项目分为三个主要组成部分,Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…...
ubuntn20 搭建 redmine
安装数据库 更新包列表:sudo apt update 安装MySQL服务器:sudo apt install mysql-server 运行安全性脚本:MySQL服务器安装后,运行以下命令以加固安装:sudo mysql_secure_installation 这个脚本将引导您完成几个安全选…...
每日五道java面试题之java基础篇(三)
第一题. switch 是否能作⽤在 byte/long/String 上? Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。从 Java 5 开始,Java 中引⼊了枚举类型, expr 也可以是 enum 类型。从 Java 7 开始,expr 还可以…...
3大核心功能打造专业级开源服装设计解决方案
3大核心功能打造专业级开源服装设计解决方案 【免费下载链接】Seamly2D Open source patternmaking software to democratize fashion. 项目地址: https://gitcode.com/gh_mirrors/se/Seamly2D Seamly2D作为一款开源服装制版软件,通过参数化设计、精确测量管…...
一般非线性最优问题的迭代解法思路
1.迭代方法在经典最优化极值问题中,解析法虽然具有概念简明,计算精确等优点,但因只能适用于简单或特殊问题的寻优,对于复杂的工程实际问题通常无能为力,一般采用迭代算法,逐渐逼近最优解。 最优化问题的迭…...
终极罗技鼠标压枪宏指南:3分钟快速上手,告别武器后坐力困扰!
终极罗技鼠标压枪宏指南:3分钟快速上手,告别武器后坐力困扰! 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg …...
高效清理重复文件:三步释放50GB存储空间的智能解决方案
高效清理重复文件:三步释放50GB存储空间的智能解决方案 【免费下载链接】czkawka 一款跨平台的重复文件查找工具,可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点,帮助用户释放存储空间。 项目地址: https://gi…...
延时补偿预测器
Active flux基于扰动观测器补偿仿真模型: (1)1.5周期延时补偿 (2)相电压补偿 (2)扰动观测器补偿最近在调试电机控制项目的时候,总遇到Active Flux观测器输出波形抖动的问题。工程师们…...
保姆级教程:用smartctl命令解读你的NVMe固态硬盘健康报告(附关键指标避坑指南)
保姆级教程:用smartctl命令解读你的NVMe固态硬盘健康报告(附关键指标避坑指南) 当你发现电脑突然卡顿、文件读取异常缓慢,或是系统频繁提示存储错误时,固态硬盘的健康状况往往是首要怀疑对象。作为数据存储的核心部件&…...
从报错到解决:Pycharm中Tensorflow2.x与1.x代码兼容性问题全解析
从报错到解决:Pycharm中Tensorflow2.x与1.x代码兼容性问题全解析 在深度学习领域,TensorFlow作为最受欢迎的框架之一,其版本迭代带来的变化常常让开发者感到头疼。特别是从TensorFlow 1.x升级到2.x版本后,许多核心API发生了重大改…...
OpenClaw+百川2-13B自动化数据分析:Excel报告生成与可视化
OpenClaw百川2-13B自动化数据分析:Excel报告生成与可视化 1. 为什么需要自动化数据分析工具 上周我接手了一个市场调研项目,需要分析来自5个渠道的销售数据。当我第三次因为手工复制粘贴数据出错而不得不重做报表时,突然意识到:…...
突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册
突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的革命性插件框架&…...
TouchGal Galgame社区终极指南:一站式游戏资源管理与交流平台
TouchGal Galgame社区终极指南:一站式游戏资源管理与交流平台 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 还在为寻找…...
