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

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实现链表 链表的结构定义&#xff1a; 链表的结构操作&#xff1a; 1、初始化链表 2、销毁链表 3、插入结点 4、输出链表数据 5、查找链表数据 扩展 代码实现 c实现链表 链表的结构定义&#xff1a; /*** 链表结构定义 ***/ typedef struct Node {int data; //…...

力扣231. 2 的幂(数学,二分查找,位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1&#xff1a;位运算 1.易验证2的幂为正数&#xff1b; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2&#xff1a;数学 当给定数n大于1时…...

Maven私服部署与JAR文件本地安装

Nexus3 是一个仓库管理器&#xff0c;它极大地简化了本地内部仓库的维护和外部仓库的访问。 平常我们在获取 maven 仓库资源的时候&#xff0c;都是从 maven 的官方&#xff08;或者国内的镜像&#xff09;获取。团队的多人员同样的依赖都要从远程获取一遍&#xff0c;从网络方…...

【MySQL】字符串函数的学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-J7VN4RbrBi51ozap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

AI助力农作物自动采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建作番茄采摘场景下番茄成熟度检测识别计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…...

记录下ibus-libpinyin输入法的重新安装

目前的版本为&#xff1a; 首先把现在的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&#xff0c;是一个面向开源及私有软件项目…...

蓝桥杯嵌入式第8届真题(完成) STM32G431

蓝桥杯嵌入式第8届真题(完成) STM32G431 题目 分析和代码 对比第六届和第七届&#xff0c;这届的题目在逻辑思维上确实要麻烦不少&#xff0c;可以从题目看出&#xff0c;这届题目对时间顺序的要求很严格&#xff0c;所以就可以使用状态机的思想来编程&#xff0c;拿到类似题…...

第二节 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的数据&#xff0c;AI服务器的出货量约为130,000台&#xff0c;占全球服务器总出货量的约1%。随着微软、Meta、百度和字节跳动等主要制造商相继推出基于生成式AI的产品和服务&#xff0c;订单量显著增加。预测显示&#xff0c;在ChatGPT等应用的持续需求推动下&a…...

【P1506 拯救oibh总部】

拯救oibh总部 题目背景 oibh 总部突然被水淹没了&#xff01;现在需要你的救援…… 题目描述 oibh 被突来的洪水淹没了&#xff0c;还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示&#xff0c;而一个四面被围墙围住的区域洪水是进不去的。 oibh 总部内部也有许…...

应用层 HTTP协议(1)

回顾 前面我们说到了数据链路层,网络层IP协议,传输层的TCP/UDP协议一些知识点,现在让我们谈谈 应用层的HTTP协议的知识点. 这篇我们先从大局入手,仍然是对总体报文进行全局分析,再对细节报文进行拆解分析 版本 首先我们谈谈HTTP协议的版本 HTTP 0.9 (1991) HTTP 1.0 (1992 - 1…...

Linux学习笔记(centOS)—— 文件系统

目录 一、Linux中的文件 打开方式 二、目录结构​ 三、相关命令 切换目录命令 列出当前目录下的文件和目录命令 一、Linux中的文件 “万物皆文件。” 图1.1 所有文件 打开方式 图形化界面左上角的位置→计算机&#xff0c;打开以后就可以看到Linux全部的文件了&#xf…...

华视 CVR-100UC 身份证读取 html二次开发模板

python读卡&#xff1a;python读卡 最近小唐应要求要开发一个前端的身份证读卡界面&#xff0c;结果华视CVR-100UC 的读取界面是在是有点&#xff0c;而且怎么调试连官方最基本的启动程序都执行不了。CertReader.ocx 已成功&#xff0c;后面在问询一系列前辈之后&#xff0c;大…...

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&#xff1a;这是一个 Java 接口&#xff0c;表示与数据库的连接。在这里&#xff0c;conn 是一个 Connection 类型的变量。 conn&#xff1a;这是变量的名称&#xff0c;可以根据需要进行更改。通常&#xff0c;conn 被用作表示数据库连接的…...

python web 框架Django学习笔记

2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式&#xff0c;把程序或者项目分为三个主要组成部分&#xff0c;Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…...

ubuntn20 搭建 redmine

安装数据库 更新包列表&#xff1a;sudo apt update 安装MySQL服务器&#xff1a;sudo apt install mysql-server 运行安全性脚本&#xff1a;MySQL服务器安装后&#xff0c;运行以下命令以加固安装&#xff1a;sudo mysql_secure_installation 这个脚本将引导您完成几个安全选…...

每日五道java面试题之java基础篇(三)

第一题. switch 是否能作⽤在 byte/long/String 上&#xff1f; Java5 以前 switch(expr)中&#xff0c;expr 只能是 byte、short、char、int。从 Java 5 开始&#xff0c;Java 中引⼊了枚举类型&#xff0c; expr 也可以是 enum 类型。从 Java 7 开始&#xff0c;expr 还可以…...

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 …...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...