C语言之链表以及单链表的实现

一:链表的引入

        1:从数组的缺陷说起

                (1)数组有两个缺陷。一个是数组中所有元素类型必须一致,第二是数组的元素个数必须事先指定并且一旦指定后不能更改

                (2)如何解决数组的两个缺陷:数组的第一个缺陷结构体可以解决,结构体运行结构体内部元素不相同,因此解决了第一个缺陷

                (3)解决数组的第二个缺陷:使用链表来实现数组大小的实时扩展

        总结:几乎可以这样理解:链表就是一个大小可以实时变化的一个数组   

        2:链表是什么样的 

         (1)顾名思义,链表就是用锁链连接起来的表。这里的表指的是一个一个的节点(一个节点就是
一个校区),节点中有一些内存可以用来存储数据(所以叫表,表就是数据表);这里的锁链指
的是链接各个表的方法,C语言中用来连接2个表(其实就是2块内存)的方法就是指针。

        (2)链表是由若干个节点组成的(链表的各个节点结构是完全类似的),节点是由有效数据和指
针组成的。有效数据区域用来存储信息完成任务的,指针区域用于指向链表的下一个节点从而构
成链表。    

 

        3:要时刻记住链表是用来干嘛的

         (1)时刻谨记:链表就是用来解决数组的大小不能动态扩展的问题,所以链表其实就是当数组用
的。直白点:链表能完成的任务用数组也能完成,数组能完成的任务用链表也能完成。但是灵活
性不一样。
         (2)简单说:链表就是用来存储数据的。链表用来存数据相对于数组来说优点就是灵活性,需要
多少个动态分配多少个,不占用额外的内存。

二:单链表的实现ji

        1:单链表的节点的构成

                (1)链表是由节点构成的,节点中包含:有效数据和指针

                        

#include <stdio.h>//构建一个链表的节点
struct node
{int datas;                      //有效数据struct node *pNEXT;             //指向下一个节点的指针};

        (2)定义的struct node只是一个结构体,,本身并没有变量生成,也不占用内存。结构体定义相当于为链表节点构建了一个模版,但是还没有一个节点,将来在实际创建链表时需要一个节点时用这个模版来复制一个即可

        

        2:堆内存的申请和使用

                (1)链表的内存要求比较灵活,不能用栈(当需要插入或删除中间节点时会出现问题),也不能用data数据段(因为数据段是在程序加载时就已经确定好的,占用多少的内存已经定好了,这样就丧失了灵活性),只能用堆内存。

                (2)使用堆内存来创建一个链表节点的步骤:1:申请堆内存,大小为一个节点大小(检查申请结果是否正确) -> 2:清理申请到的堆内存 -> 3:把申请到的堆内存当做一个新节点 -> 4:填充新节点的有效数据和指针区域

#include <stdio.h>        
#include <string.h>        
#include <stdlib.h>        //构建一个链表的节点
struct node
{int datas;                      //有效数据struct node *pNEXT;             //指向下一个节点的指针};int main(void)
{//创建一个链表节点struct node *p = (struct node *)malloc(sizeof(struct node));        if(NULL == p)                //检查申请结果是否正确{printf("malloc error!\n");        return -1;}//memset(p,0,sizeof(struct node));          bzero(p,sizeof(struct node));            //清理申请到的堆内存//填充节点p->datas = 1;                            //填充数据区p->pNEXT = NULL;                         //将来要执行下一个节点的首地址return 0;}

        3:链表的头指针

                (1)头指针并不是一个节点,而是一个普通指针,只占4个字节。头指针的类型是struct node * 类型的,所以它才能指向指向链表的节点

                (2)一个典型的莲表示实现就是:头指针指向链表的第一个节点,然后第一个节点中的指针指向下一个节点,然后依次类推到最后一个节点,这样就构成了一个链

        

        4:构建一个简单的单链表

        

        

#include <stdio.h>        
#include <string.h>        
#include <stdlib.h>        //构建一个链表的节点
struct node
{int datas;                      //有效数据struct node *pNEXT;             //指向下一个节点的指针};int main(void)
{//定义头指针struct node *phead = NULL;//创建一个链表节点struct node *p = (struct node *)malloc(sizeof(struct node));        if(NULL == p)                //检查申请结果是否正确{printf("malloc error!\n");        return -1;}//memset(p,0,sizeof(struct node));          bzero(p,sizeof(struct node));            //清理申请到的堆内存//填充节点p->datas = 1;                            //填充数据区p->pNEXT = NULL;                         //将来要执行下一个节点的首地址phead = p;                              //将本节点和前面的头指针关联起来//创建一个链表节点并和上一个节点关联起来struct node *p1 = (struct node *)malloc(sizeof(struct node));        if(NULL == p1)                //检查申请结果是否正确{printf("malloc error!\n");        return -1;}//memset(p,0,sizeof(struct node));          bzero(p1,sizeof(struct node));            //清理申请到的堆内存//填充节点p1->datas = 1;                            //填充数据区p1->pNEXT = NULL;                         //将来要执行下一个节点的首地址p-pNEXT>= p1;                            //将本节点和前面的节点关联起来//再创建一个链表节点并和上一个节点关联起来struct node *p2 = (struct node *)malloc(sizeof(struct node));        if(NULL == p2)                //检查申请结果是否正确{printf("malloc error!\n");        return -1;}//memset(p2,0,sizeof(struct node));          bzero(p2,sizeof(struct node));            //清理申请到的堆内存//填充节点p2->datas = 1;                            //填充数据区p2->pNEXT = NULL;                         //将来要执行下一个节点的首地址p1-pNEXT>= p2;                           //将本节点和前面的节点关联起来return 0;}

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

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

相关文章

c++ 正则匹配得使用

标头&#xff1a;#include <regex> 相关函数&#xff1a; regex_match regex_replace regex_search 名称描述regex_match测试正则表达式是否与整个目标字符串相完全匹配。regex_replace替换匹配正则表达式。regex_search搜索正则表达式匹配项。 1. regex_search 成功搜…

『FPGA通信接口』LVDS接口(2)硬件设计

文章目录 1.LVDS原理2.xilinx器件对于LVDS的支持3.LVDS信号PCB布线要求4.传送门 1.LVDS原理 如上图所LVDS的工作原理示意图&#xff0c;其Driver驱动器由一个恒流源是LVDS发送端&#xff08;通常为 3.5mA&#xff09;驱动一对差分信号线组成。驱动状态会翻转就产生正负电压的变…

【前端】Git 常用

文章目录 一、git 配置1.1 查看系统配置1.2 查看当前用户配置1.3 查看当前git用户名1.4 查看当前git邮箱1.5 查看当前仓库配置信息1.6 修改git用户名1.7 修改git邮箱 二、git 常用命令2.1 git init2.2 git clone2.3 git status2.4 git add2.5 git commit2.5 git log2.6 git pul…

“Docker入门指南:概念与安装详解“

目录 # 概念 1. Docker常见问题 2. docker概念和安装 2.1 Docker的组成 2.2 Docker 组件及关系表 2.3 docker核心思想 2.4 docker镜像与容器两个核心概念 2.5 容器概念图 2.6 docker核心技术 2.6.1 镜像 (Image) 概述 关系 示例 2.6.2 容器 (Container) 概述 关…

C# 控件-ComboBox

ComboBox 是一个下拉列表控件&#xff0c;它允许用户从预定义的选项中进行选择&#xff0c;或者输入自定义的文本。以下是如何理解和快速掌握 ComboBox 控件的几个关键点&#xff1a; 创建和初始化 ComboBox: ComboBox comboBox new ComboBox();添加项: 直接添加字符串项&a…

android在线阅读代码网站

android在线阅读代码社区&#xff1a; Android 1.6 到 Android 10 的源码&#xff1a; Android OS 在线源代码 - https://www.androidos.net.cn10.0.0_r6 - Android社区 - https://www.androidos.net.cn/ AndroidXRef https://cs.android.com/ https://cs.android.com/android…

抖音小程序中如何预览一组图片

1.使用tt.previewImage api 语法 tt.previewImage(options)具体使用 **需要注意imgUrl必须是http/https的线上路径&#xff0c;不支持本地路径和base64格式的图片**var imgUrl this.data.imgUrltt.previewImage({urls: [imgUrl], //需要预览的图片http链接列表&#xff0c;…

Mongodb UPDATE使用$sort将数组重新排序

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第74篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

使用构造函数注入实现 Spring 依赖注入

Spring 框架提供了多种方式来实现依赖注入&#xff0c;其中构造函数注入是最推荐的一种方式。通过构造函数注入&#xff0c;可以确保所有必需的依赖在对象创建时就被提供&#xff0c;避免了未初始化的依赖导致的潜在问题。本文将详细介绍如何使用构造函数注入实现 Spring 依赖注…

Linux 软链接

# 语法 ln -s <文件夹or文件的真实路径> <自定义路径别名> # 例子 ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ens33

如何选择合适的半桥栅极驱动芯片?KP8530X,KP85402,KP85211A满足你对半桥栅极驱动一切需求

半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A在功率电子领域展现出卓越的性能和可靠的品质。具备诸多显著优势。首先&#xff0c;半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A拥有出色的耐压性能&#xff0c;可承受高达数百伏的电压&a…

告别繁琐录入,一键解锁OCR魅力:高效文字识别工具推荐

在日常工作中&#xff0c;我们常常会需要找一些模版&#xff0c;如果直接下载编辑某某文档&#xff0c;都是要花钱的。 比如领导让我找个法律文书&#xff0c;改成我们的内容&#xff0c;网上有很多的参考文档&#xff0c;但是不论哪个&#xff0c;下载都要钱&#xff0c;也不…

如何开展小组讨论以强化员工对TPM的关注度?

TPM是一种旨在提高设备综合效率&#xff0c;通过全员参与的方式&#xff0c;实现设备保养和维护的现代化管理体系。因此&#xff0c;如何开展小组讨论以强化员工对TPM的关注度成为了一个值得探讨的话题。本文&#xff0c;深圳天行健精益管理咨询公司为大家分享具体步骤如下&…

YOLOv10改进 | Conv篇 |YOLOv10引入SPD-Conv卷积

1. SPD-Conv介绍 1.1 摘要:卷积神经网络(CNN)在图像分类和目标检测等许多计算机视觉任务中取得了巨大的成功。 然而,在图像分辨率较低或物体较小的更艰巨的任务中,它们的性能会迅速下降。 在本文中,我们指出,这源于现有 CNN 架构中一个有缺陷但常见的设计,即使用跨步卷…

adb 截屏和录屏命令

adb 录屏命令 screenrecord 简介 screenrecord 是一个 shell 命令 支持 Android 4.4(API level 19)以上 支持视频格式: mp4 一些限制 某些设备可能无法直接录制,原因是分辨率太高,如果遇到此类问题&#xff0c;请试着指定较低的分辨率 不支持录制过程中屏幕旋转,如果录制…

Linux机器通过Docker-Compose安装Jenkins发送Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 八、项目结果通知 1.通过企业微信通知 2.通过邮件通知 九、配置域名DNS解析 最近小编接到一…

Excel中插入的图片在不同电脑上消失的问题及解决方法

在使用Excel时插入图片&#xff0c;然后在不同电脑上打开却发现图片消失并被替换为链接地址&#xff0c;这个问题通常出现于文件中的图片路径没有正确保存或者电脑上缺少相关的图片文件。下面让我们来详细解释这个问题以及可能的解决方法。 ### 问题原因分析1. **相对路径问题…

接到一家公司做团购活动类型的策划海报项目,使用AI给他们设计了相关的海报

在这个充满挑战和机遇的时代&#xff0c;我有幸接到一家公司的委托&#xff0c;为他们策划一场团购活动。这不仅是对我的专业能力的认可&#xff0c;也是对我创新思维的考验。 这家公司是一家知名的电子产品销售商&#xff0c;他们希望通过团购活动来提升产品的销售量和品牌的…

使用 CTranslate2 实现 Faster Whisper 的加速转录

使用 CTranslate2 实现 Faster Whisper 的加速转录 近年来&#xff0c;语音识别技术得到了快速发展。OpenAI 的 Whisper 模型作为其中的佼佼者&#xff0c;以其高精度和强大的性能广受欢迎。然而&#xff0c;其较长的推理时间和高内存消耗也成为了限制其应用的一大因素。为了解…

个人职业规划(含前端职业线路、前端技术线路、前端核心竞争力、大龄程序员的出路)

1. 了解自己的兴趣与长处 喜欢擅长的事 职业方向 2. 设定长期目标&#xff08;5年&#xff09; 目标内容 建立自己的品牌建立自己的社交网络 适量参加社交活动&#xff0c;认识更多志同道合的小伙伴寻求导师指导 建立自己的作品集 注意事项 每年元旦进行审视和调整永葆积极…