c语言实现 顺序存储和链式存储(几种链表)

news2024/9/26 3:25:51

目录

一、简介

二、一些问题

1、递归free        

2、free单向循环链表:

3、free单向链表

4、free双向循环链表

5、free使用数组实现链式存储结构

6、sizeof()求字符串大小的问题

三、总结


一、简介

        花了几天的时间从头开始使用c语言实现一些数据结构,这篇文章主要是记录顺序储存和链式存储。每一种数据结构我都实现了增、删、查、改等一些辅助的函数。为了验证程序的正确性我对这些函数都进行了测试,但是我不能保证我的测试样例足够丰富。这几天我一共实现了五种结构:动态顺序存储, 单向链表,使用数组实现静态链式储存, 单向循环链表(有头节点)和双向循环链表(无头节点)。代码在这里:jiawen/c_datastructure - 码云 - 开源中国 (gitee.com)我目前没有为这些代码写注释,因为程序没有那么长。

二、一些问题

1、递归free        

我之前也学过数据结构并且使用了c语言实现了一些,但是前段时间在写完那个json库后,我觉得这些数据结构还是挺有趣的,同时我同学也跟我说找工作的时候,还是主要是看这些基础知识怎么样,所以我打算花一些时间在实现一遍这些数据结构。

在这里我最想讨论的是free时候的递归处理问题。因为我每次都要在这里写写画画来确定如何递归的调用free来释放空间。

我先把这几段代码贴在这里:

//singlecircularlist

static void list_free_(sclist src, sclist head)
{
    //sclist tmp = src->next;
    sclist tmp = src;
    if (tmp != head) {
        free(tmp->s);
        sclist tmpe = tmp;
        tmp = tmp->next;
        free(tmpe);
        tmpe = NULL;
        list_free_(tmp, head);
    }
    //free(tmp);
    return;
    
}

void list_free(sclist src)
{
    //assert(src != NULL);
    sclist tmp = src->next;
    if (tmp != src) {
        list_free_(tmp, src);
    }

    free(src);
    src = NULL;
    
}



//single list
void list_free(sglist mylist)
{
    assert(mylist != NULL);
    
    if(mylist->next != NULL) 
        list_free(mylist->next);

    if (mylist->s != NULL) 
        free(mylist->s);
    
    free(mylist);
}


//static list that use array implement

void list_free(stlist *list, size_t pos)
{
    assert(list != NULL);

    size_t p = pos;

    if (list[pos].next != 0) {
        
        list_free(list, list[pos].next);
    }
    //PTR("the pos is %d", pos);
    free((list[pos].s));
}

//doublecircularlist
void list_free(dclist src)
{
    //assert(src != NULL);
    dclist tmp = src;
    dclist tmpe;

    while (tmp != NULL) {
        tmpe = tmp;
        tmp = tmp->next;
        free(tmpe->s);
        free(tmpe);
        if(tmp == src)
            break;
        tmpe = NULL;        
    }
}

        我选取了单链表,单向循环链表, 双向循环链表和用数组实现的链式存储结构。我想解释的是用数组实现的链式储存结构,其实这是个结构体数组, 然后结构体中有个数据用来记录下一个元素所在数据的位置,没有指针,但是这就像指针一样来记录下一个元素的位置,具体的可以看我实现的数据结构。我好想在纸上来说明这个过程,手握鼠标,敲键盘有点累了。

2、free单向循环链表:

        我实现了两个函数,list_free(), list_free_(),其中list_free_()是真正的free函数,而list_free()主要free头节点。在函数list_free()中,有先判断该链表是否只有头节点,如果是,那么就不用调用list_free_()函数了,如果不是的话, 再调用list_free_(), 再这个函数中,先free掉第0个元素,再free掉第1个元素,以此类推直到碰到head节点。

3、free单向链表

        对于单向链表,只需要判断它next指针是否为空来进行递归free,相对而言更简单。

4、free双向循环链表

这里没有使用递归来解决这个问题。而是使用了一个while()循环。先free掉第0个元素,然后再free下一个元素,在这个过程中只需要判断我们要free掉的这个元素是否是第0个元素,如果是那就退出循环,free结束。

5、free使用数组实现链式存储结构

对于一个静态链表的递归free,只需要检查当前的元素所记录的下一个元素的位置是否是零来判断是否需要递归。

6、sizeof()求字符串大小的问题

        之前也遇到过这个问题,当时只是将sizeof换成strlen来解决这个问题,但是每次我都是默认使用的sizeof来得到大小,但是这对于使用指针定义的数组来说得到的是指针本身的大小,而不是字符串的大小,如果使用字符串定义的数组是可以用sizeof来得到它的大小的 。

三、总结

        我真的是每次玩递归都要在纸上来画一画,看看怎么写这个函数才是正确的,希望以后能够熟练一点。也许我的代码中有我没有发现的bug,欢迎你指出(909244296@qq.com)。欢迎点赞收藏。 

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

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

相关文章

UnityVR--UIManager--UI管理2

目录 前言 UIManger的实现 1. 需要用到的变量和数据 2. 在构造中的工作 3. 初始化面板 4. 显示面板 5. 隐藏面板和隐藏所有面板 6. 其他小工具 在场景中实现 1. 不同面板的类型设置 2. 场景中的设置 前言 接前篇,上一篇已经有了UITools.cs其中定义了UI面板需…

Web服务器群集:部署LAMP平台

目录 一、理论 1.LAMP平台 2.Apache网址服务基础 2.httpd服务器的基本配置 3.构建虚拟Web主机 4.MySQL服务 5.构建PHP运行环境 二、实验 1.LAMP架构DISCUZ论坛应用 三、问题 1.虚拟机内存分配上限问题,内存上限只能加到3G。 2.虚拟机CPU如何设置才更加合…

RISC-V 函数调用约定和Stack使用

RISC-V 函数调用约定和Stack使用 引言RISC-V vs x86RISC-V寄存器StackStruct补充函数调用约定寄存器约定函数跳转和返回指令的编程约定被调用函数的编程约定 RISC-V 汇编与 C 混合编程RISC-V 汇编调用 C 函数C 函数中嵌入 RISC-V 汇编 引言 MIT 6.S081 2020 操作系统 本文为M…

1744_Perl获取文件属性参数

全部学习汇总: GreyZhang/perl_basic: some perl basic learning notes. (github.com) 前阵子写通过Perl执行判断调用ImageMagick实现图像的批量压缩功能脚本时用到过这个功能,只是当时仅仅看了一个获取文件大小的功能。 今天看第六版的小骆驼书又看到了…

一篇十分硬核的QT开发经验文章!送给正在做QT开发或想从事QT开发的你

当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。 定时器是个好东西,学会好使用它,有时…

别再为缓慢启动而失去用户! 让你的Android应用体验绝佳性能

为什么要启动优化? 启动优化是为了提升应用程序的启动性能,即减少应用程序从启动到可交互状态所需要的时间。以下是一些关键原因,解释了为什么启动优化是重要的: 用户体验: 启动时间是用户与应用程序互动的第一个体验…

常用API

文章目录 1、String类String概述创建对象的两种方式字符串的内容比较String常用APIString类开发验证码功能手机号码屏蔽功能 2、Object类Object类的作用Object类的常用方法**Object的toString方法**Object的equals方法 3、Objects类4、StringBuilder类5、Math类6、System类7、B…

2023-06-17:说一说redis中渐进式rehash?

2023-06-17:说一说redis中渐进式rehash? 答案2023-06-17: 在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率。为了解决这个问题,Redis会对数组进行扩容&am…

基于Spark的气象数据分析

研究背景与方案 1.1.研究背景 在大数据时代背景下,各行业数据的规模大幅度增加,数据类别日益复杂,给数据分析工作带来极大挑战。气象行业和人们的生活息息相关,随着信息时代的发展,大数据技术的出现为气象数据的发展…

第九章 形态学图像处理

文章目录 9形态学图像处理9.2腐蚀与膨胀9.2.1腐蚀9.2.2膨胀 9.3开操作和闭操作9.5一些基本形态学方法9.3.1边界提取 9.6灰度级形态学9.6.3一些基本的形态学算法 9形态学图像处理 9.2腐蚀与膨胀 9.2.1腐蚀 imgcv2.imread(dige.png,0) kernel np.ones((3,3),np.uint8) num[[…

第七章 原理篇:HOG特征提取

之前面试被问到了然后没有讲出来,所以今天复习一下! 气死我了! 参考教程: What Is a Feature Descriptor in Image Processing? https://medium.com/analytics-vidhya/a-gentle-introduction-into-the-histogram-of-oriented-…

scratch lenet(3): 直方图均衡化的C语言实现

文章目录 1. 目的2. 原理3. 实现3.1 获得直方图 int hist[256]3.2 获得累积分布 int cdf[256]3.3 均衡化公式3.4 遍历原图,逐点均衡化,得到结果 4. 完整代码和结果4.1 例子14.2 例子24.3 例子34.4 完整代码 5. References 1. 目的 用 C 语言实现直方图均…

低价618背后,看见品牌营销的「产业新洪流」

如今消费者对于低价与品质的兼得需求,正倒逼一个全新的产业经济模式出现,而企业恰是最直接承载者。只有具备真正“低价”的能力模型,企业才能参与到下一轮的产业经济,甚至是社会经济的发展浪潮中。 作者|皮爷 出品|产业家 成本不…

Elasticsearch设置密码

Elasticsearch设置密码 概述ES开启认证配置密码访问开启安全认证的EScurl浏览器直接访问Kibana 配置 es认证直接配置用户名密码到 kibana.yml以kibana密钥的形式使用命令行启动参数形式指定用户名密码 使用kibana 查看es用户 概述 ES默认没有开启安全组件,如果我们…

简单的Dubbo实验环境搭建

Dubbo-api中定义的UserQueryFacade接口可以发布在私服上,这样子dubbo-consumer和dubbo-provider就可以以maven依赖的形式导入使用。dubbo-provider需要提供接口的实现类,dubbo-consumer需要订阅该实现类,他们的元数据都通过zk进行记录。 许多…

Three.js学习项目--3D抗美援朝数据可视化

文章目录 部分场景体验地址操作说明 视频我做了哪些(功能)局限源代码地址部分逻辑按需渲染模型加载动画控制器模型纹理条件切换模型加载同时请求部分纹理 生成进度条模型缩放小动画 部分场景 体验地址 https://kmyc.hongbin.xyz/ 操作说明 视频 操作说…

LeetCode——查询后矩阵的和

目录 1、题目 2、题目解读 3、代码 1、题目 2718. 查询后矩阵的和 - 力扣(Leetcode) 给你一个整数 n 和一个下标从 0 开始的 二维数组 queries ,其中 queries[i] [typei, indexi, vali] 。 一开始,给你一个下标从 0 开始的…

数学建模常用模型(一):灰色预测法

数学建模常用模型(一):灰色预测法 灰色预测法是一种用于处理少量数据、数据质量较差或者缺乏历史数据的预测方法。它适用于一些非线性、非平稳的系统,尤其在短期预测和趋势分析方面有着广泛的应用。灰色预测法作为一种强大的数学…

基于STM32+OneNet设计的物联网智慧路灯

一、前言 近年来,构筑智慧城市、推动城镇发展被国家列入重要工作范畴。发布的《超级智慧城市报告》显示,全球已启动或在建的智慧城市有1000多个,中国在建500个,远超排名第二的欧洲(90个)。从在建智慧城市的分布来看,我国已初步形成环渤海、长三角、珠三角、中西部四大智…

FreeRTOS 任务优先级 【杂记】

FreeRTOS任务优先级 FreeRTOS任务优先级:任务优先级数值越小,任务优先级越低。 1、 FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的configMAX_PRIORITIES 进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORIT…