【数据结构4】单向循环链表实现

目录

一、节点结构

二、单向循环链表的头结构

三、接口设计

[3.1 初始化接口(表在栈上)实现](#3.1 初始化接口(表在栈上)实现)

[3.2 头插/尾插实现](#3.2 头插/尾插实现)

[3.3 遍历链表](#3.3 遍历链表)

[3.4 删除链表元素](#3.4 删除链表元素)

[3.5 释放数据域](#3.5 释放数据域)


一、节点结构

复制代码
C

typedef int Element;
// 节点结构
typedef struct _loop_node
{
    Element val;
    struct _loop_node *next;
}LoopNode;

二、单向循环链表的头结构

复制代码
C

typedef struct
{
    LoopNode header;
    LoopNode *rear;
    int num;
}LinkLoopList;

三、接口设计

复制代码
C

//初始化接口
void initLinkLoopList(LinkLoopList *link_loop);
//插入(头插 尾插)
int insertLinkLoopListHeader(LinkLoopList *link_loop,Element value);
int insertLinkLoopListRear(LinkLoopList *link_loop,Element value);
//遍历显示
void showLinkLoopList(const LinkLoopList *link_loop);
//删除
int deleteLinkLoopList(LinkLoopList *lin_loop,Element value);
//释放整个数据域,不释放头(栈上无需手动释放)
void destroyLinkLoopList(LinkLoopList *link_loop);
3.1 初始化接口(表在栈上)实现
复制代码
C

void initLinkLoopList(LinkLoopList* link_loop)
{
    link_loop->header.next = link_loop->rear = &link_loop->header;
    link_loop->num = 0;
}
3.2 头插/尾插实现
复制代码
C

int insertLinkLoopListHeader(LinkLoopList* link_loop, Element value)
{
    // 先有新节点
    LoopNode *node = malloc(sizeof(LoopNode));
    if (node == NULL)
    {
        return -1;
    }
    node->val = value;
    node->next = link_loop->header.next;
    link_loop->header.next = node;
    // 判断尾指针是否需要更新
    // 现在已经插入一个节点,如果尾指针还是初始化的状态 那么需要更新尾指针的状态
    if (link_loop->rear == &link_loop->header)
    {
        link_loop->rear = node;
    }
    ++link_loop->num;
    return 0;
}

int insertLinkLoopListRear(LinkLoopList* link_loop, Element value)
{
    // 先有新节点
    LoopNode *node = malloc(sizeof(LoopNode));
    if (node == NULL)
    {
        return -1;
    }
    node->val = value;

    node->next = link_loop->rear->next;
    link_loop->rear->next = node;
    link_loop->rear = node;

    link_loop->rear = node;
    ++link_loop->num;
    return 0;
}
3.3 遍历链表
复制代码
C

void showLinkLoopList(const LinkLoopList* link_loop)
{
    LoopNode *node = link_loop->header.next;
    while (node != &link_loop->header)
    {
        printf("%d\t",node->val);
        node = node->next;
    }
    printf("\n");
}
3.4 删除链表元素
复制代码
C

int deleteLinkLoopList(LinkLoopList* link_loop, Element value)
{
    LoopNode *node = &link_loop->header;

    while (node->next != &link_loop->header && node->next->val != value)
    {
        node = node->next;
    }
    if (node->next->val == value)
    {
        LoopNode *tmp = node->next;
        node->next = tmp->next;
        free(tmp);
        --link_loop->num;
    }else
    {
        printf("no %d element",value);
    }
    return 0;

}
3.5 释放数据域
复制代码
C

void destroyLinkLoopList(LinkLoopList* link_loop)
{
    LoopNode *node = link_loop->header.next;
    while (node != &link_loop->header)
    {
        LoopNode *tmp = node;
        node = node->next;
        free(tmp);
        --link_loop->num;
    }
    printf("%d element",link_loop->num);
}

愿你遍历链表,归来仍是少年;
遍历二叉树,不丢一个节点;
排序人生,复杂度永远是 O(1)
祝你:岁岁常欢愉,年年皆胜意
身体安康,万事顺遂。

除夕快乐!

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关推荐
烟花落o2 小时前
【数据结构系列03】链表的回文解构、相交链表
数据结构·算法·链表·刷题
努力学算法的蒟蒻2 小时前
day87(2.16)——leetcode面试经典150
数据结构·leetcode·面试
AC赳赳老秦2 小时前
2026 智能制造趋势:DeepSeek 助力“黑灯”工厂运营,实现生产流程自动化
网络·数据结构·算法·安全·web安全·prometheus·deepseek
程序员酥皮蛋2 小时前
hot 100 第三十题 30. 两两交换链表中的节点
数据结构·算法·leetcode·链表
ShineWinsu2 小时前
对于C++中list的详细介绍
开发语言·数据结构·c++·算法·面试·stl·list
冬夜戏雪3 小时前
Leetcode 颠倒二进制位/二进制求和
java·数据结构·算法
俩娃妈教编程3 小时前
2023 年 09 月 二级真题(1)--小杨的 X 字矩阵
数据结构·c++·算法·双层循环
烟花落o3 小时前
【数据结构系列02】轮转数组、返回倒数第k个节点
数据结构·算法·leetcode·刷题
Bear on Toilet5 小时前
递归_二叉树_48 . 二叉树最近公共祖先查找
数据结构·算法·二叉树·dfs