11.链表

数组的分类:便于遍历

静态数组:int arr[10]数据过多造成空间溢出,数据过小空间浪费

动态数组:malloc calloc realloc 合理利用空间不能快捷的插入或删除数据(会涉及到大量的数据移动)

知识点一:链表的基本概念

链表的基本概念

链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构

链表由一系列节点( 链表中每一个元素称为节点)组成,节点在运行时动态生成(malloc) ,每个节点包括两个部分:

    1)存储数据元素的数据域          2)存储下一个节点地址的指针域

知识点二:链表结点的定义(结构体实现)

typedef struct stu
{//数据域(自定义)int num;char name[32];float score;//指针域struct stu *next;	//保存 下一个节点的地址:
}STU;

知识点三:静态链表

typedef struct stu
{int num;char name[32];float score;struct stu *next;	//保存 下一个节点的地址:
}STU;
void test1()
{    STU datal = {100, "德玛",59};STU data2 = {101, "小炮",89};STU data3 = {102, "小法",79};STU data4 = {103,"盲僧",99};STU data5 = {104, "快乐风男",39};//链表头STU *head = NULL;head = &datal;datal.next = &data2;data2.next = &data3;data3.next = &data4;data4.next = &data5;data5.next = NULL;//遍历链表STU *pb = head;while(pb != NULL){printf("%d %s %f\n", pb->num, pb->name, pb->score) ;pb = pb->next;    //pb指向下一一个节点}
}

知识点四:动态链表

1、布局整个框架(main.c)

#include<stdio.h>
#include<string.h>
void stu_help(void);
int main(int argc,char *argv[])
{stu_help();while(1){printf("请输入操作指令:");char cmd[32] = "";scanf( "%s",cmd);if(strcmp(cmd,"help") == 0){printf("-----help------\n");}else if(strcmp(cmd,"insert") == 0){printf("-----insert------\n");}else if(strcmp(cmd,"print") == 0){printf("-----print------\n");}else if(strcmp(cmd,"search") == 0){printf("-----search------\n");}else if(strcmp(cmd,"delete") == 0){printf("-----delete------\n");}else if(strcmp(cmd,"free") == 0){printf("-----free------\n");}else if(strcmp(cmd,"quit") == 0){break;}}        return 0;
}
void stu_help(void)
{printf("############################\n");printf("#help:打印帮助信息         #\n");printf("#insert:插入链表节点       #\n");printf("#print:遍历链表节点信息    #\n");printf("#search:查询链表节点       #\n");printf("#delete:删除链表节点       #\n");printf("#free:释放链表             #\n");printf("#quit:退出                 #\n");printf("############################\n");return;
}

2、链表插入节点之头部之前插入

链表插入节点之头部之前插入 头部之前插入原理分析图

3、在链表尾部插入

链表尾部插入

4、链表的有序插入

链表有序插入

知识点五:链表查询某个节点

链表查询某个节点

知识点六:删除链表指定节点

删除链表指定节点

知识点七:链表的释放

链表的释放
STU* free_link(STU *head)
{//1、判断链表是否存在if(head == NULL)//不存在 {printf("link not found\n");retrun head;} else	//存在 {STU *pb = head;//逐个节点释放while(pb != NULL){//head保存下一个节点的位置head = pb->next;//释放pb指向的节点free(pb);//pb指向headpb = head; }printf("链表已经释放完毕\n"); return head;}return head;
}

知识点八:链表逆序

链表逆序
STU* reverse_link(STU *head)
{//1、判断链表是否存在if(head == NULL)//不存在 {printf("link not found\n");retrun head;} else//存在 {//int *p,num;     //p为int *, num为intSTU *pb,*pr;    //pb为STU *,pr 为STU *//pb保存head->next ( 原因head->next会置NULL)pb = head->next;//将head->next置NULL(原因:头节点变尾节点)head->next = NULL;while(pb != NULL){//pr 保存pb->next ( 原因:pb->next会指向head)pr = pb -> next;//pb->next指向head ( 原因:逆转方向)pb->next = head ;//保存逆转方向的代码可以重复执行head = pb;pb = pr;}return head;}return head;
}

知识点九:链表排序

选择法排序:(以数组实现)

链表排序
#include<stdio.h>
int main()
{int arr[10] = {0};int n = sizeof(arr)/sizeof(arr[0]);int i = 0,j = 0,min = 0;printf("请输入%d个int数据\n", n);for(i = 0; i<n; i++){scanf("%d",arr+i);}for(i = 0;i < n-1;i++){for(min = i,j = min+1;j < n;j++){if (arr[min] > arr[j])min = j;}if (min != i){int tmp = 0;tmp = arr[i];arr[i] = arr[min];arr [min] = tmp;}}for(i = 0;i < n;i++) {printf("%d ",arr[i]);}printf("\n");return 0;
}

选择法排序:(以链表实现)

链表排序1

知识点十:认识双向链表

双向链表

知识点十一:双链表插入

双链表插入

知识点十二:双向链表删除指定节点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

知识点十三:结构的浅拷贝和深拷贝

1、指针变量作为结构体的成员

指针变量作为结构体的成员
typedef struct
{int num;char *name;//指针变量作为结构体的成员
}DATA;
void test01()
{DATA data = {100, "hehehehaha"};printf("%d\n",sizeof(DATA));//8字节printf("num = %d\n" ,data.num) ;//指针变量作为结构体的成员保存的是空间的地址printf("name = %s\n", data. name);
}

2、指针变量作为结构体的成员 操作前 必须有合法空间

指针变量作为结构体的成员1
void test02()
{DATA data;printf( "%d\n",sizeof(DATA));printf("num = %d\n", data.num) ;//指针变量作为结构体的成员操作前必须有合法的空间//data.name = "hehe" ;//给name事先申请一块堆区空间data.name = (char *)calloc(1,10);strcpy(data.name,"hahaha");printf("name = %s\n", data.name ) ;//如果name指向堆区空间一定要记得释放if(data. name != NULL ){free(data. name) ;data. name = NULL;}
}

3、指针变量作为结构体成员,结构体变量间的赋值操作容易导致“浅拷贝”发生

指针变量作为结构体的成员2

运行结果:出现段错误

两个结构体变量中的指针成员指向同-块堆区空间

void test03()
{DATA data1;DATA data2;data1.num = 100;data1.name = (char *)calloc(1,10);strcpy(data1.name,"my data");//指针变量作为结构体的成员结构体变量间的赋值操作容易导致"浅拷贝”发生data2 = data1;    //"浅拷贝”printf("data2: num = %d,name = %s\n", data2.num,data2.name); if(datal.name != NULL){free(data1.name);data1.name = NULL;}if( data2.name != NULL){free(data2.name);data2.name = NULL;}
}

4、深拷贝

前提:是指针变量作为结构体的成员

两个结构体变量中的指针成员指向各自的堆区空间

深拷贝
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{int num;char *name;
} DATA;
void test01()
{DATA datal ;DATA data2 ;datal.num = 100;datal.name = (char *)calloc(1,12);strcpy (datal.name,"my data");data2. num = datal. num;//为结构体变量 申请 独立空间 data2.name = (char *)calloc(1,12);strcpy(data2.name,datal.name) ;printf("data1:num = %d,name = %s\n",datal.num,datal.name);printf("data2:num = %d,name = %s\n",data2.num,data2.name);if (datal.name!=NULL){free(datal.name);datal.name = NULL;}if (data2.name!=NULL){free(data2.name);data2.name = NULL;}
}

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

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

相关文章

玉米粒计数检测数据集VOC+YOLO格式107张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;107 标注数量(xml文件个数)&#xff1a;107 标注数量(txt文件个数)&#xff1a;107 标注类别…

二分#背包#快排#LCS详解

二分#背包#快排#LCS详解 文章目录 二分#背包#快排#LCS详解1. 二分搜索2. 01背包问题3. 快速排序4. 最长公共子序列 1. 二分搜索 在处理大规模数据集时&#xff0c;查找操作的效率显得尤为重要。二分搜索是一种在有序数组中查找目标值的高效算法&#xff0c;其时间复杂度为O(lo…

【python报错】关于 xlrd.biffh.XLRDError: Excel xlsx file; not supported 解决方法【已解决】

【Python报错】关于xlrd.biffh.XLRDError: Excel xlsx file; not supported解决方法【已解决】 在使用Python进行数据分析时&#xff0c;经常需要处理Excel文件。xlrd库是一个流行的用于读取Excel文件的库&#xff0c;但如果你在使用xlrd打开.xlsx文件时遇到了xlrd.biffh.XLRDE…

区块链(Blockchain)调查研究(一)

文章目录 1. 区块链是什么&#xff1f;2. 区块链分类和特点3. 区块链核心关键技术3.1 共识机制3.2 密码学技术3.4 分布式存储3.5 智能合约 4. 区块链未来发展趋势5. 区块链能做什么、不能做什么&#xff1f;5.1 第一部分5.2 第二部分5.3 第三部分&#xff08;结论&#xff09; …

新书推荐:2.3 消息机制

Windows程序的消息机制是指在Windows操作系统下&#xff0c;应用程序与操作系统之间的一种通信方式。通过消息机制&#xff0c;应用程序可以接收来自操作系统的各种事件和请求&#xff0c;以便做出相应的响应和处理。 在Windows程序中&#xff0c;消息机制的实现是基于消息队列…

用 Axios 封装一个双 token 无感刷新

为什么要用双Token无感刷新&#xff0c;它解决了什么问题&#xff1f; 为了保证安全性&#xff0c;后端设置的Token不可能长期有效&#xff0c;过了一段时间Token就会失效。而发送网络请求的过程又是需要携带Token的&#xff0c;一旦Token失效&#xff0c;用户就要重新登陆&…

欢乐打地鼠小游戏html源码

这是一款简单的js欢乐打地鼠游戏&#xff0c;挺好玩的&#xff0c;老鼠出来用鼠标点击锤它&#xff0c;击中老鼠获得一积分。 欢乐打地鼠小游戏html源码

kopf,一个实用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个实用的 Python 库 - kopf。 Github地址&#xff1a;https://github.com/nolar/kopf 在 Kubernetes 中&#xff0c;Operator 是一种用于扩展 Kubernetes 功能的强大工具。Operator 可以自动化应…

MySQL的group by与count(), *字段使用问题

文章目录 问题group by到底做了什么举个例子简单来说为什么select字段&#xff0c;count()不能和*共同使用总结 问题 这是一段摘抄自MySQL官网的文字。其大致意思是MySQL拓展了group by的使用&#xff0c;MySQL允许选择没有出现在group by中的字段。换句话说&#xff0c;标准SQ…

【QT5.14.2】编译MQTT库example的时候报No such file or directory

【QT5.14.2】编译MQTT库example的时候报No such file or directory 前几天导师让跑一下MQTT库&#xff0c;用的5.14.2版本的QT&#xff0c;于是就上网搜了一个教程&#xff1a;https://www.bilibili.com/video/BV1dH4y1e7hG/?spm_id_from333.337.search-card.all.click&v…

Fedora的远程桌面

要在 Fedora 40 上开启远程桌面功能。 首先&#xff0c;要确保已安装 gnome-remote-desktop 和 vino 包。 这些软件包通常默认安装在 Fedora 的 GNOME 桌面环境中。 可以按照以下步骤操作&#xff1a; 1、判断电脑是否安装了 gnome-remote-desktop 和 vino 包: tomfedora:…

第十三周 5.28 三个修饰符知识点

一、abstract[抽象的] 1.abstract可以修饰类: (1&#xff09;被abstract修饰的类称为抽象类 (2) 语法:abstract class 类名{} (3) 特点:抽象类只能声明引用&#xff0c;不能创建对象 (4) 抽象类中可以定义属性和成员方法、构造方法 2.abstr…

【Linux】匿名管道的应用场景 --- 进程池

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

Qt qtpropertybrowser使用实例(1)

属性界面实例&#xff1a; 代码如下&#xff1a; #include <QDate> #include <QLocale> #include "qtpropertymanager.h" #include "qtvariantproperty.h" #include "qttreepropertybrowser.h" int main(int argc, char *argv[]) {…

nginx mirror流量镜像详细介绍以及实战示例

nginx mirror流量镜像详细介绍以及实战示例 1.nginx mirror作用2.nginx安装3.修改配置3.1.nginx.conf3.2.conf.d目录下添加default.conf配置文件3.3.nginx配置注意事项3.3.nginx重启 4.测试 1.nginx mirror作用 为了便于排查问题&#xff0c;可能希望线上的请求能够同步到测试…

TalkingData 是一家专注于提供数据统计和分析解决方案的独立第三方数据智能服务平台

TalkingData 是一家专注于提供数据统计和分析解决方案的独立第三方数据智能服务平台。通过搜索结果&#xff0c;我们可以了解到 TalkingData 的一些关键特性和市场情况&#xff0c;并将其与同类型产品进行比较。 TalkingData 产品特性 数据统计与分析&#xff1a;提供专业的数…

【每日算法】

算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归) 文章目录 算法第15天| (二叉树part02)层序遍历、226.翻转二叉树(优先掌握递归)、101. 对称二叉树(优先掌握递归)一、层序遍历二、226. 翻转二叉树(优先掌握递归)三、101. 对…

Elasticsearch index 设置 false,为什么还可以被检索到?

在 Elasticsearch 中&#xff0c;mapping 定义了索引中的字段类型及其处理方式。 近期有球友提问&#xff0c;为什么设置了 index: false 的字段仍能被检索。 本文将详细探讨这个问题&#xff0c;并引入列式存储的概念&#xff0c;帮助大家更好地理解 Elasticsearch 的存储和查…

基于STM32F030设计的多点温度采集系统(BC26+OneNet)

一、项目背景 随着物联网技术的迅猛发展&#xff0c;越来越多的智能设备应运而生&#xff0c;而温度采集系统是其中重要的一类。在现代工业和家庭生活中&#xff0c;温度对于生产、居住和储存等过程的控制有着非常重要的作用。因此&#xff0c;准确地采集环境温度数据并进行处…