码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 2. 循环单链表 + 循环双链表的定义和代码实现 + 静态链表(不重要)


    文章目录

    • 1. 循环单链表的实现
      • 1.1 循环单链表的初始化:InitList(LinkList &L)
      • 1.2 判断循环单链表是否为空:Empty(LinkList L)
      • 1.3 判断结点p是否为循环单链表的表尾结点:isTail(LinkList L, LNode *p)
    • 2. 循环双链表的实现
      • 2.1 循环双链表的初始化:InitList(LinkList &L)
      • 2.2 判断循环双链表是否为空:Empty(LinkList L)
      • 2.3 判断结点p是否为循环双链表的表尾结点:isTail(LinkList L, LNode *p)
      • 2.4 循环双链表的后插:InsertNextDNode(DNode *p, DNode *s)
      • 2.5 循环双链表的后删除:DeletNextDNode(DNode *p)
    • 3. 静态链表
      • 3.1 静态链表的使用
      • 3.2 静态链表的初始化
      • 3.3 其他操作

    在这里插入图片描述


    1. 循环单链表的实现

    在这里插入图片描述

    结构体:

    typedef struct LNode{           
        ElemType data;                  
        struct LNode *next; 
    }LNode, *Linklist;
    
    • 1
    • 2
    • 3
    • 4

    1.1 循环单链表的初始化:InitList(LinkList &L)

    bool InitList(LinkList &L){    
        L = (LNode *)malloc(sizeof(LNode));  
        if(L==NULL)             
            return false;    
        // 最后一个结点的next指针指向头结点    
        L->next = L;       
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.2 判断循环单链表是否为空:Empty(LinkList L)

    bool Empty(LinkList L){    
        if(L->next == L)       
            return true;    
        else             
            return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.3 判断结点p是否为循环单链表的表尾结点:isTail(LinkList L, LNode *p)

    bool isTail(LinkList L, LNode *p){ 
        if(p->next == L)          
            return true;      
        else            
            return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6



    2. 循环双链表的实现

    结构体:

    typedef struct DNode{           
        ElemType data;                  
        struct LNode *next; 
    }DNode, *Linklist;
    
    • 1
    • 2
    • 3
    • 4

    2.1 循环双链表的初始化:InitList(LinkList &L)

    在这里插入图片描述

    bool InitDLinkList(DLinklist &L){  
        L = (DNode *) malloc(sizeof(DNode));  
        if(L==NULL)            
            return false;    
        // 头结点的prior指针指向最后一个结点,最后一个结点的next指针指向头结点 
        L->prior = L;      
        L->next = L;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.2 判断循环双链表是否为空:Empty(LinkList L)

    和单链表一样

    bool Empty(DLinklist L){   
        if(L->next == L)       
            return true;      
        else           
            return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3 判断结点p是否为循环双链表的表尾结点:isTail(LinkList L, LNode *p)

    和单链表一样

    // 判断结点p是否为循环双链表的表尾结点
    bool isTail(DLinklist L, DNode *p){   
        if(p->next == L)        
            return true;     
        else            
            return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.4 循环双链表的后插:InsertNextDNode(DNode *p, DNode *s)

    在这里插入图片描述

    2.5 循环双链表的后删除:DeletNextDNode(DNode *p)

    注意,循环双链表不需要if判断

    bool DeletNextDNode(DNode *p){  
        // 找到p的后继结点q       
        DNode *q =p->next;        
        //循环双链表不用担心q结点的下一个结点为空  
        p->next = q->next;    
        q->next->prior=p;    
        free(q);      
        return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9



    3. 静态链表

    静态链表的定义:用数组的方式实现的链表。
    分配一整片连续的内存空间,各个结点集中安置,每个结点包括:数据元素和下一个结点的数组下标。

    在这里插入图片描述

    特点:
    优点:增、删操作不需要大量移动元素。
    缺点:不能随机存取,只能从头结点开始依次往后查找,容量固定不变!

     
    适用场景:
    ①不支持指针的低级语言;
    ②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)

    3.1 静态链表的使用

    #define MaxSize 10        //静态链表的最大长度
    struct Node{              //静态链表结构类型的定义  
        ElemType data;        //存储数据元素    
        int next;             //下一个元素的数组下标
    };
    
    // 用数组定义多个连续存放的结点
    void testSLinkList(){    
        struct Node a[MaxSize];  //数组a作为静态链表, 每一个数组元素的类型都是struct Node    
        ...
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    也可以这么定义:

    #define MaxSize 10        //静态链表的最大长度
    typedef struct{           //静态链表结构类型的定义       
        ELemType data;        //存储数据元素     
        int next;             //下一个元素的数组下标
    }SLinkList[MaxSize];
    
    void testSLinkList(){      
        SLinkList a;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第一种是我们更加熟悉的写法,第二种写法则更加侧重于强调 a 是一个静态链表而非数组。



    3.2 静态链表的初始化

    在这里插入图片描述



    3.3 其他操作

    在这里插入图片描述

  • 相关阅读:
    React-Redux
    Idea设置
    Spire.PDF for .NET【文档操作】演示:设置 PDF 文档的 XMP 元数据
    i=i+1和i+=1以及i++和++i详解
    Python并行计算库Joblib的技术原理解析
    Spring Boot 篇
    Vue3 —— 常用 Composition API(零)(setup函数、ref函数、reactive函数、响应式、reactive对比ref)
    工业测径仪的应用场景和可靠性判断
    基于SSM+Vue的舞蹈网站
    产业科技创新杂志产业科技创新杂志社产业科技创新编辑部2022年第3期目录
  • 原文地址:https://blog.csdn.net/weixin_42214698/article/details/126175665
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号