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 标注类别…

如何快速入门Element-UI:打造高效美观的前端界面

Element-UI 是一款基于 Vue.js 的开源组件库,提供了丰富的 UI 组件,可以帮助开发者快速构建美观、响应式的前端界面。本文将详细介绍如何快速入门 Element-UI,包括环境搭建、组件使用、样式定制及常见问题解决方法,帮助你高效地使用 Element-UI 进行前端开发。 一、环境搭…

Spring (48)Feign

Feign是一个声明式的Web服务客户端&#xff0c;它让编写Web服务客户端变得更加容易。它的目标是通过简化HTTP API客户端的编码工作来减少开发人员的负担。使用Feign可以创建一个接口&#xff0c;并在接口上声明方法与远程服务上的一个HTTP资源相绑定。Spring Cloud整合了Feign&…

ABC351

C 栈的应用 #include<bits/stdc.h>using namespace std;stack<int>stk;int main() {int n;cin>>n;for(int i1;i<n;i){int a;cin>>a;while(!stk.empty()&&astk.top()){stk.pop();a;}stk.push(a);}cout<<stk.size()<<endl;retur…

java面试题: HashMap、HashSet 和 HashTable 的区别

HashMap 常用方法 HashMap 是一个基于哈希表的 Map 接口的实现。它允许使用 null 值和 null 键。 java 复制 // 创建一个HashMap HashMap<KeyType, ValueType> map new HashMap<>(); // 添加元素 map.put(key, value); // 获取元素 ValueType value map.get…

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

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

集群与分片:深入理解及应用实践

目录 引言什么是集群&#xff1f; 集群的定义集群的类型 什么是分片&#xff1f; 分片的定义分片的类型 集群与分片的关系集群的应用场景 负载均衡高可用性 分片的应用场景 大数据处理数据库分片 集群与分片的架构设计 系统架构设计数据存储设计 案例分析 Hadoop 集群Elastics…

【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;用户就要重新登陆&…

前台怎么调用Oracle proc过程

前台调用Oracle PROC过程通常涉及几种不同的方法&#xff0c;具体取决于你的前台应用程序所使用的技术和框架。以下是一些常见的方法&#xff0c;以及如何在前台调用Oracle PROC过程的详细步骤&#xff1a; 1. 使用PL/SQL Developer或其他SQL工具 直接调用&#xff1a;在PL/S…

将操作与数据分离 - 面向数据编程 v1.1

面向数据编程 (DOP) 非常注重数据&#xff0c;此次讨论的原则涉及实现大多数域逻辑的方法&#xff0c;它建议将操作与数据分开。 1.示例场景 此次讨论面向数据编程 v1.1的将操作与数据分离原则的具体示例是以销售平台作为示例&#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之查询性能优化(十三)

查询性能优化 优化LIMIT分页 在系统中需要进行分页操作的时候&#xff0c;我们通常会使用LIMIT加上偏移量的办法实现&#xff0c;同时加上合适的ORDER BY子句。如果有对应的索引&#xff0c;通常效率会不错&#xff0c;否则&#xff0c;MySQL需要做大量的文件排序操作。一个非…

【Python】成功解决TypeError: ‘int’ object is not iterable

【Python】成功解决TypeError: ‘int’ object is not iterable &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#…

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

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

【Python】成功解决ZeroDivisionError: division by zero

【Python】成功解决ZeroDivisionError: division by zero &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393…

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