博客
关于我
第五天(其实是第六天)对前一天内容的补充与练习--线性表--链表
阅读量:94 次
发布时间:2019-02-26

本文共 3209 字,大约阅读时间需要 10 分钟。

420行代码解析:链表操作程序实现

作为一名开发人员,我最近面对了一段420行的C语言代码。这些代码实现了链表的各种操作,包括创建、销毁、插入、删除以及表的信息查询等功能。作为一个刚开始学习数据结构的新手,我对这段代码进行了深入分析,希望能够理解其逻辑和实现细节。

1. 链表的定义与操作

链表是数据结构中的一个基础类型,主要用于存储一系列数据节点,而每个节点仅需要记录数据和指向下一个节点的指针。这种结构具有灵活性,能够高效地进行插入、删除操作。在这段代码中,链表的节点定义为:

typedef struct LinkNode {    int date;    struct LinkNode* next;} LNode;

链表的操作主要包括以下几个方面:

  • 创建链表:代码中定义了两种创建链表的方式。一种是头插法,另一种是尾插法。具体实现如下:

    void CreatListF(LNode*& L, int a[], int n) {    LNode* s;    L = (LNode*)malloc(sizeof(LNode));    L->next = NULL;    for (int i = 0; i < n; ++i) {        s = (LNode*)malloc(sizeof(LNode));        printf("第%d个元素: ", i + 1);        scanf("%d", &s->date);        s->next = L->next;        L->next = s;    }}

    这段代码用于从数组中读取数据,逐个插入到链表的头部。

  • 销毁链表:为了避免内存泄漏,代码中提供了销毁链表的功能:

    void DestoryList(LNode*& L) {    LNode* p, * q;    p = L;    q = L->next;    while (q != NULL) {        free(p);        p = q;        q = q->next;    }    free(p);    printf("销毁完成");}

    这样可以避免直接使用free函数可能导致的悬停内存。

  • 检测链表是否为空:通过检查链表的首节点的下一个指针是否为空:

    bool ListEmpty(LNode*& L) {    return (L->next == NULL);}

    这个函数非常简单,但对于链表操作来说,能够快速判断链表是否为空。

  • 求链表长度:通过遍历链表,计算节点的总数:

    int ListLength(LNode*& L) {    int i = -1;    LNode* p = L;    while (p != NULL) {        i++;        p = p->next;    }    return i;}

    这个函数也很直观,但需要注意的是,链表长度的计算在循环中会占用额外的时间。

  • 插入与删除元素:代码中还实现了插入和删除操作。插入操作支持在指定位置插入元素,删除操作则支持按值删除特定节点:

    bool DeleteList(LNode*& L, int e) {    LNode* q = L;    while (q != NULL && q->date != e) {        q = q->next;    }    if (q == NULL) {        printf("表中没有该元素");        return false;    } else {        q->next = q->next->next;        printf("删除完成");        return true;    }}

    这些操作的实现相对简单,但需要仔细处理指针的赋值和释放。

2. 功能模块的实现

代码中还包含了多个功能模块,包括:

  • 链表倒序与顺序:通过sList函数可以将一个链表拆分成两个部分,一部分按原序存储,另一部分倒序存储:

    int sList(LNode*& L, LNode*& K, LNode*& J) {    LNode* p, * q, * r;    K = (LNode*)malloc(sizeof(LNode));    r = K;    int i = ListLength(L);    for (int k = 0; k < i / 2; ++k) {        LNode* s = (LNode*)malloc(sizeof(LNode));        s->date = L->next->date;        r->next = s;        r = s;        L = L->next;    }    J = (LNode*)malloc(sizeof(LNode));    r->next = NULL;    while (L != NULL) {        LNode* h = (LNode*)malloc(sizeof(LNode));        h->date = L->date;        h->next = r->next;        r->next = h;        L = L->next;    }}

    这个函数的实现思路是先将链表分为两部分,然后将前半部分保持顺序,后半部分倒序存储。

  • 链表的输入与输出:代码中提供了两种链表创建方式,分别对应于顺序插入和逆序插入。用户可以选择不同的方式创建链表:

    void CreatListR(LNode*& L) {    LNode* s, * r;    printf("开始录入\n");    L = (LNode*)malloc(sizeof(LNode));    r = L;    for (int i = 0; i < num1; ++i) {        s = (LNode*)malloc(sizeof(LNode));        printf("第%d个元素: ", i + 1);        scanf("%d", &s->date);        r->next = s;        r = s;    }    r->next = NULL;}

    这段代码用于逆序插入数据,用户可以根据需要选择不同的链表创建方式。

3. 主程序的功能

主程序是一个菜单驱动的程序,用户可以通过选择不同的选项来操作链表。菜单内容如下:

  • 创 建 表(顺序/逆序)
  • 销 毁 表
  • 检测表是否为空
  • 求 表 的 长 度
  • 输 出 线 性 表
  • 求表中的‘e’元素
  • 插 入‘e’元素
  • 删 除 ‘e’ 元 素
  • 练习(链表拆分)
  • 退出
  • 用户可以根据需要选择不同的操作,程序会根据选择执行相应的功能。例如,选择插入元素时,程序会提示用户输入要插入的值和位置。

    4. 实现中的注意事项

    在实现过程中,需要注意以下几点:

    • 内存管理:链表操作中涉及到多个动态内存分配和释放,需要确保每个节点的内存都被正确释放,否则会导致内存泄漏。

    • 链表的遍历与操作:链表的操作需要谨慎处理指针,避免指针失效或悬停内存。

    • 程序的用户体验:程序的菜单设计需要友好,用户能够快速理解和操作。

    • 代码的可维护性:代码的结构要清晰,函数要有明确的功能,方便后续的维护和修改。

    5. 总结

    通过对这段420行代码的分析,我对链表的实现有了更深入的理解,也掌握了链表操作的基本方法。同时,我也意识到在实际开发中,链表的应用场景非常广泛,但也需要注意其优缺点。对于这个项目,我将继续练习,掌握更多链表操作的技巧。

    转载地址:http://ypbu.baihongyu.com/

    你可能感兴趣的文章
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
    查看>>