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

除夕快乐!

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

相关推荐
程序员zgh15 分钟前
C++ 环形队列 从原理到实例演示
c语言·开发语言·数据结构·c++·学习
Trouvaille ~20 分钟前
【优选算法篇】拓扑排序——逻辑先后与任务依赖的终极拆解
数据结构·c++·算法·leetcode·青少年编程·蓝桥杯·拓扑学
CylMK41 分钟前
题解:UVA1218 完美的服务 Perfect Service
数据结构·c++·算法·深度优先·图论
丶小鱼丶1 小时前
数据结构和算法之【阻塞队列】上篇
java·数据结构
zs宝来了1 小时前
Redis 数据结构底层实现:intset、ziplist、skiplist 深度剖析
数据结构·redis·源码解析·skiplist·ziplist·intset
liuyao_xianhui1 小时前
优选算法_topk问题_快速排序算法_堆_C++
java·开发语言·数据结构·c++·算法·链表·排序算法
liuyao_xianhui1 小时前
优选算法_堆_最后一块石头的重量_C++
java·开发语言·c++·算法·链表
菜菜小狗的学习笔记2 小时前
剑指Offer算法题(十)排序
数据结构
handsomethefirst2 小时前
【算法与数据结构】【面试经典150题】【题36-题40】
数据结构·算法·面试
不知名的老吴2 小时前
深刻理解“程序 = 算法 + 数据结构”
数据结构