数据结构---单链表实现

单链表是什么

我的理解是“特殊的数组”,通过访问地址来连接起来

1怎么创建链表 ----通过结构体(成员有存入数据的data和指向下一个节点的地址的指针(结构体指针)next

初始架构---DataType 对应存入数据类型,此处的Node==struct node *

//头文件
#include<stdio.h>
//宏定义
#define DataType int //全局变量//结构体
typedef struct node
{DataType data;struct node* next;
}node, * Node;int main()
{return 0;
}

2初始化链表+尾插+打印

Node Init(Node phead)
{phead = (Node)malloc(sizeof(node));if (phead == -1)return -1;phead->next = NULL;
}int PushBack(Node phead, DataType num)
{//创建新节点Node newnode = malloc(sizeof(node));newnode->next = NULL;newnode->data = num;//创建指针找到链表的尾,然后插入,Node p = NULL;//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了for (p = phead; p->next != NULL; p = p->next);p->next = newnode;return 0;
}void show_list(Node phead)
{Node cur = NULL;cur = phead;//判断是否为空if (phead == NULL){printf("NULL\n");}//遍历头节点没有数据所有从头节点下一个数据开始打印for (cur = phead->next; cur != NULL; cur = cur->next){printf("%d->", cur->data);}printf("NULL\n");
}

现象:


//头文件
#include<stdio.h>
#include<stdlib.h>//宏定义
#define DataType int 
//全局变量//结构体
typedef struct node
{DataType data;struct node* next;
}node, * Node;Node Init(Node phead)
{phead = (Node)malloc(sizeof(node));if (phead == -1)return -1;phead->next = NULL;
}int PushBack(Node phead, DataType num)
{//创建新节点Node newnode = malloc(sizeof(node));newnode->next = NULL;newnode->data = num;//创建指针找到链表的尾,然后插入,Node p = NULL;//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了for (p = phead; p->next != NULL; p = p->next);p->next = newnode;return 0;
}void show_list(Node phead)
{Node cur = NULL;cur = phead;//判断是否为空if (phead == NULL){printf("NULL\n");}//遍历头节点没有数据所有从头节点下一个数据开始打印for (cur = phead->next; cur != NULL; cur = cur->next){printf("%d->", cur->data);}printf("NULL\n");
}int main()
{Node phead = NULL;phead = Init(phead);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);show_list(phead);return 0;
}

3添加删除和修改的功能 

删除时利用两个指针一个找一个删,再指向

修改就是在查找的基础上再加一个if判断

#define _CRT_SECURE_NO_WARNINGS
//头文件
#include<stdio.h>
#include<stdlib.h>//宏定义
#define DataType int 
//全局变量//结构体
typedef struct node
{DataType data;struct node* next;
}node, * Node;Node Init(Node phead)
{phead = (Node)malloc(sizeof(node));if (phead == NULL)return -1;phead->next = NULL;
}int PushBack(Node phead, DataType num)
{//创建新节点Node newnode = malloc(sizeof(node));newnode->next = NULL;newnode->data = num;//创建指针找到链表的尾,然后插入,Node p = NULL;//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了for (p = phead; p->next != NULL; p = p->next);p->next = newnode;return 0;
}void show_list(Node phead)
{Node cur = NULL;cur = phead;//判断是否为空if (phead == NULL){printf("NULL\n");}//遍历头节点没有数据所有从头节点下一个数据开始打印for (cur = phead->next; cur != NULL; cur = cur->next){printf("%d->", cur->data);}printf("NULL\n");
}
int Delect(Node phead,DataType num)
{if (phead == NULL){printf("peahd is NULL\n");return -1;}Node cur1= NULL;Node cur2 = NULL;for (cur1 = phead, cur2 = phead->next; cur1->next != NULL; cur1 = cur2, cur2 = cur2->next){if (cur2->data == num){cur1->next = cur2->next;free(cur2);return 0;}}printf("no find num\n");return -1;
}int Change(Node phead, int num1, int num2)
{if (phead == NULL){printf("peahd is NULL\n");return -1;}Node cur = NULL;for (cur = phead->next;cur != NULL; cur = cur->next){if (cur->data == num1){cur->data = num2;return 0;}}printf("no find num1\n");return -1;
}
int main()
{Node phead = NULL;phead = Init(phead);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);Change(phead, 1, 2);show_list(phead);Delect(phead, 1);show_list(phead);Delect(phead, 1);Delect(phead, 1);Delect(phead, 1);show_list(phead);Delect(phead, 1);show_list(phead);Change(phead, 1, 2);show_list(phead);return 0;
}

4释放---释放后链表为空,不会显示后面功能


void Releas(Node phead)
{Node cur1 = NULL;Node cur2 = NULL;for (cur1 = cur2 = phead; cur1->next != NULL; cur1 = cur2){cur2 = cur1->next;free(cur1);}
}
int main()
{Node phead = NULL;phead = Init(phead);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);Change(phead, 1, 2);Releas(phead);show_list(phead);Delect(phead, 1);show_list(phead);Delect(phead, 1);Delect(phead, 1);Delect(phead, 1);show_list(phead);Delect(phead, 1);show_list(phead);Change(phead, 1, 2);show_list(phead);return 0;
}

5最终代码---链表实现方法有很多掌握自己熟练的解决问题才是关键

#define _CRT_SECURE_NO_WARNINGS
//头文件
#include<stdio.h>
#include<stdlib.h>//宏定义
#define DataType int 
//全局变量//结构体
typedef struct node
{DataType data;struct node* next;
}node, * Node;Node Init(Node phead)
{phead = (Node)malloc(sizeof(node));if (phead == NULL)return -1;phead->next = NULL;
}int PushBack(Node phead, DataType num)
{//创建新节点Node newnode = malloc(sizeof(node));newnode->next = NULL;newnode->data = num;//创建指针找到链表的尾,然后插入,Node p = NULL;//出来for循环就插入不用考虑链表为空因为for循环里面已经考虑判断了for (p = phead; p->next != NULL; p = p->next);p->next = newnode;return 0;
}void show_list(Node phead)
{Node cur = NULL;cur = phead;//判断是否为空if (phead == NULL){printf("NULL\n");}//遍历头节点没有数据所有从头节点下一个数据开始打印for (cur = phead->next; cur != NULL; cur = cur->next){printf("%d->", cur->data);}printf("NULL\n");
}
int Delect(Node phead,DataType num)
{if (phead == NULL){printf("peahd is NULL\n");return -1;}Node cur1= NULL;Node cur2 = NULL;for (cur1 = phead, cur2 = phead->next; cur1->next != NULL; cur1 = cur2, cur2 = cur2->next){if (cur2->data == num){cur1->next = cur2->next;free(cur2);return 0;}}printf("no find num\n");return -1;
}int Change(Node phead, int num1, int num2)
{if (phead == NULL){printf("peahd is NULL\n");return -1;}Node cur = NULL;for (cur = phead->next;cur != NULL; cur = cur->next){if (cur->data == num1){cur->data = num2;return 0;}}printf("no find num1\n");return -1;
}
void Releas(Node phead)
{Node cur1 = NULL;Node cur2 = NULL;for (cur1 = cur2 = phead; cur1->next != NULL; cur1 = cur2){cur2 = cur1->next;free(cur1);}
}
int main()
{Node phead = NULL;phead = Init(phead);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);PushBack(phead, 1);Change(phead, 1, 2);Releas(phead);show_list(phead);Delect(phead, 1);show_list(phead);Delect(phead, 1);Delect(phead, 1);Delect(phead, 1);show_list(phead);Delect(phead, 1);show_list(phead);Change(phead, 1, 2);show_list(phead);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400114.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字引领风尚·智能改变生活“青岛电博会”路演活动(济南站)

2024CICE中国国际消费电子博览会路演活动&#xff08;济南站&#xff09;成功举行 数字引领风尚&#xff0c;智能改变生活。 8月7日&#xff0c;50余家行业协会、企业嘉宾、展商代表等云集2024中国国际消费电子博览会路演活动&#xff08;济南站&#xff09;现场&#xff0c;共…

瑞萨电子并购Altium 引领行业创新与发展

公开资料显示&#xff0c;2023 年 6 月&#xff0c;瑞萨电子曾宣布在 Altium 的 Altium 365 云平台上实现了所有 PCB 设计的标准化开发。瑞萨电子一直与 Altium 合作&#xff0c;将其所有产品的 ECAD 库发布到 Altium Public Vault。借助 Altium365 上的制造商零件搜索等功能&a…

Wireshark分析工具

简单用例 首先打开软件,左上角点文件,选中要分析的文件列表。 导入用tcpdump抓的包后进行分析,这里要输入过滤条件,对网络包进行一定的过滤处理。(这里172网段是阿里云的地址,用自己写的python2脚本对阿里云进行压测。) 这里输入过滤条件 tcp.port == 80 ,语法含义是…

Java虚拟机:类的加载机制

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 034 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

【ARM CoreLink 系列 5.1 -- CI-700 各种 Node 组件详细介绍】

请阅读【ARM CoreLink 文章专栏导读】 文章目录 CI-700 组件(Components)RN-I( I/O-coherent Request Node) 和 RN-D(I/O coherent Request Node with DVM)HN-F(Fully coherent Home Node)IO coherent Home Node (HN-I)IO coherent Home Node with Debug Trace Controller (H…

43.【C语言】指针(重难点)(F)

目录 15.二级指针 *定义 *演示 16.三级以及多级指针 *三级指针的定义 *多级指针的定义 17.指针数组 *定义 *代码 18.指针数组模拟二维数组 往期推荐 15.二级指针 *定义 之前讲的指针全是一级指针 int a 1; int *pa &a;//一级指针 如果写成 int a 1; int *pa &a…

机器学习——线性回归(sklearn)

目录 一、认识线性回归 1. 介绍 2. 多元线性回归的基本原理&#xff08;LinearRegression&#xff09; 二、多重共线性 1. 介绍 2. 多重共线性详细解释 三、岭回归&#xff08;解决多重共线性问题&#xff09; 1. 模型推导 2. 选取最佳的正则化参数取值 四、Lasso&am…

景联文科技:破解数据标注行业痛点,引领高质量AI数据服务

数据标注行业是人工智能和机器学习领域中一个非常重要的组成部分。随着AI技术的发展&#xff0c;对高质量标注数据的需求也在不断增长。 数据标注市场的痛点 1. 团队管理 在众包和转包模式下&#xff0c;管理大量的标注人员是一项挑战。 需要确保标注人员的专业性、稳定性和…

Pod的调度机制

文章目录 一、Pod调度概述二、Pod调度策略实现方式三、kube-scheduler调度1、kube-scheduler调度的流程2、过滤阶段3、打分阶段4、kube-scheduler 调度示例4.1、创建 Deployment 资源清单4.2、应用Deployment4.3、查看被kube-scheduler自动调度的Pod 四、nodeName调度1、创建Po…

Linux驱动入门实验班——LED驱动(附百问网视频链接)

目录 一、确定引脚编号 二、编写思路 2.1驱动层 2.2应用层 三、源码 四、实现 课程链接 一、确定引脚编号 首先&#xff0c;可以在开发板上执行如下命令查看已经在使用的GPIO状态&#xff1a; cat /sys/kernel/debug/gpio 可以看到每个gpio都有对应的编号&#xff0c;…

火语言RPA--火语言界面应用多窗体详解

多窗体 界面应用建立时默认加载一个窗体&#xff0c;若是程序运行时需要多个窗体配合&#xff0c;在通常情况下&#xff0c;您可将多窗体绑定在UI控件事件中&#xff0c;由界面交互来打开多窗体。 本章将介绍下如何建立多窗体以及在应用中如何运用多窗体完成多种场景的设置。 …

源代码防泄密怎么做?最好用的12款源代码加密软件推荐

源代码是企业的核心资产之一&#xff0c;其安全性直接关系到产品的竞争力和市场地位。防止源代码泄密是企业信息安全中的重中之重&#xff0c;本文将介绍几种有效的源代码防泄密方法&#xff0c;并推荐12款优秀的源代码加密软件。 1. 代码审查与权限管理 通过严格的代码审查流…

【MySQL】用户管理——用户、用户信息、创建用户、删除用户、修改用户密码、数据库的权限、给用户权限、回收权限

文章目录 MySQL1. 用户管理1.1 用户1.1.1 用户信息1.1.2 创建用户1.1.3 删除用户1.1.4 修改用户密码 1.2 数据库的权限1.2.1 给用户权限1.2.2 回收权限 MySQL 1. 用户管理 为什么MySQL要引入用户管理&#xff1f; 如果我们只能使用root用户&#xff0c;这样存在安全隐患。因为r…

[C++][opencv]基于opencv实现photoshop算法可选颜色调整

【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 SelectiveColor.hpp #ifndef OPENCV2_PS_SELECTIVECOLOR_HPP_ #define OPENCV2_PS_SELECTIVECOLOR_HPP_#include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "…

Mariadb数据库本机无密码登录的问题解决

Mariadb数据库本机无密码登录的问题解决 安装了mariadb后&#xff0c;发现Mariadb本机无密码才能登录 百度了很多文章&#xff0c;发现很多人是因为root的plugin设置的值不正确导致的&#xff0c;unix_socket可以不需要密码&#xff0c;mysql_native_password 是正常的。 解…

NLP_情感分类_预训练加微调方案

文章目录 项目背景代码导包一些模型以及训练的参数设置定义dataset定义模型读取数据声明训练及测试数据集将定义模型实例化打印模型结构模型训练测试集效果 同类型项目 项目背景 项目的目的&#xff0c;是为了对情感评论数据集进行预测打标。在训练之前&#xff0c;需要对数据…

Datawhale X 魔搭 AI夏令营 第四期魔搭-AIGC文生图方向Task2笔记

了解一下 AI生图技术 的能力&局限 对所有人来说&#xff0c;定期关注AI生图的最新能力情况都十分重要&#xff1a; 对于普通人来说&#xff0c;可以避免被常见的AI生图场景欺骗&#xff0c;偶尔也可以通过相关工具绘图 对于创作者来说&#xff0c;通过AI生图的工具可以快速…

全球 30 万台游戏服务器的 PlayFlow Cloud 如何通过 DigitalOcean 实现动态扩展

“我在 DigitalOcean 上首次接触了 Kubernetes。设置 Kubernetes 集群非常简单&#xff0c;使我能够轻松自动化扩展我们的游戏服务器。”——Haseeb Sheikh&#xff0c;PlayFlow Cloud 创始人兼首席执行官 PlayFlow Cloud 是由 Haseeb Sheikh 创立的&#xff0c;旨在通过简化游…

13 Listbox 组件

13 Listbox 组件 Tkinter 的 Listbox 组件是一个用于显示列表项的控件&#xff0c;用户可以从中选择一个或多个项目。以下是对 Listbox 组件的详细说明和一个使用案例。 Listbox 组件属性 基本属性 width: 控件的宽度&#xff0c;通常以字符数为单位。height: 控件的高度&a…

Docker 网络代理配置及防火墙设置指南

Docker 网络代理配置及防火墙设置指南 背景 在某些环境中&#xff0c;服务器无法直接访问外网&#xff0c;需要通过网络代理进行连接。虽然我们通常会在 /etc/environment 或 /etc/profile 等系统配置文件中直接配置代理&#xff0c;但 Docker 命令无法使用这些配置。例如&am…