【数据结构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)
祝你:岁岁常欢愉,年年皆胜意
身体安康,万事顺遂。

除夕快乐!

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

相关推荐
wuyk5553 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
-dzk-3 小时前
【链表】LC 138.随机链表的复制
数据结构·链表
洋不写bug4 小时前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
白狐_7985 小时前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
heima20165 小时前
长期复盘:拼团活动链接开发公司的行业现状与困境洞察
链表
mmmmath_36 小时前
面试题 02.07. 链表相交
算法·链表
sylviiiiiia7 小时前
Leetcode hot100 多数元素/相交链表/反转链表
算法·leetcode·链表
我不会起名字3227 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
不会就选b8 小时前
算法日常・每日刷题--<贪心+大根堆>2
数据结构·算法
事圆则缓8 小时前
Java 常见数据结构与 Android 使用场景
android·java·数据结构