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 还可以…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
