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

除夕快乐!

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

相关推荐
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠3 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦10 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠11 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾11 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82111 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q11 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒11 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
疯狂成瘾者11 天前
Java 集合 LinkedList 详解:链表结构、常用方法和队列使用
java·开发语言·链表
WL学习笔记11 天前
单项不带头不循环链表
数据结构·链表