循环单向链表(详解)

循环单向链表原理
在这里插入图片描述

循环单项链表项目结构
在这里插入图片描述头文件RecycleLinlList.h
在这里插入图片描述头文件具体代码

#ifndef RECYCLRLINKLIST
#define  RECYCLRLINKLIST

#include <stdio.h>
#include <stdlib.h>

// 宏定义
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0
// 链表的小节点
typedef struct CIRCLELINKNODE {
	struct CIRCLELINKNODE* next;


}CircleLinkNode;
// 链表的结构体
typedef struct CIRCLELINKLIST {
	CircleLinkNode head;
	int size;
}CircleLinkList;




// 针对链表结构体的操作API函数
typedef int (*COMPARENODE)(CircleLinkNode*,CircleLinkNode*);
// 打印的回调函数
typedef void(*PRINTNODE)(CircleLinkNode*);
// 初始化函数
CircleLinkList* Init_CircleLinkList();
// 插入函数
void Insert_CircleLinkList(CircleLinkList * clist,int pos, CIRCLELINKNODE* data);
// 获得第一个元素
CircleLinkNode* Front_CircleLinkList(CircleLinkList* clist);
// 根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList* clist, int pos);
// 根据值进行删除
void RemoveByValue_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data,COMPARENODE compare);
// 获得链表的长度
int Size_CircleLinkList(CircleLinkList* clist);
// 判断是否为空
int IsEmpty_CircleLinkList(CircleLinkList* clist);
//查找根据值查找
int Find_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare);
// 打印节点
void Print_CircleLinkList(CircleLinkList* clist, PRINTNODE print);
// 释放内存
void FreeSpace_CircleLinkList(CircleLinkList* clist);


#endif

cpp文件RecycleLinkList.cpp
在这里插入图片描述cpp文件具体代码

// RecycleLinkList.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>

#include "RecycleLinlList.h"


// 初始化函数
CircleLinkList* Init_CircleLinkList() {
    CircleLinkList* clist = (CircleLinkList*)malloc(sizeof(CircleLinkList));
    clist->head.next = &(clist->head);
    clist->size = 0;
    return clist;
};
// 插入函数
void Insert_CircleLinkList(CircleLinkList* clist, int pos, CIRCLELINKNODE* data) {
     
    if (clist == NULL) {
        return;
    }
    if (data == NULL) {
        return;
    }
    if (pos < 0 || pos >= clist->size) {
        pos = clist->size;
     
    }
    // 根据位置查找节点:借助辅助指针变量
    CircleLinkNode* pCurrent = &(clist->head);
    // 使用for循环
    for (int i = 0; i < pos; i++) {
        pCurrent = pCurrent->next;
    }
    // 将数据设置进入链表
    data->next = pCurrent->next;
    // 将数据放进去
    pCurrent->next = data;
    clist->size++;
};
// 获得第一个元素
CircleLinkNode* Front_CircleLinkList(CircleLinkList* clist) {
    return clist->head.next;

};
// 根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList* clist, int pos) {
    if (clist == NULL) {
        return;
    }
    if (pos < 0 || pos >= clist->size) {
        return;
    }
    // 更具pos找删除节点的前一个节点,使用辅助指针变量
    CircleLinkNode* pCurrent = &(clist->head);
    for (int i = 0; i < pos; i++) {
        // 指针不停的向后移动
        pCurrent = pCurrent->next;
    }
    // 缓存当前节点的下一个节点
    CircleLinkNode* pNext = pCurrent->next;
    pCurrent->next = pNext->next;

    clist->size--;




};
// 根据值进行删除
void RemoveByValue_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) {
    if (clist == NULL) {
        return;
    }if (data == NULL) {
        return;
    }
    // 根据值进行删除:循环链表
    CircleLinkNode* pPrev = &(clist->head);
    CircleLinkNode* pCurrent = clist->head.next;
    int i = 0;
    int flag = -1;
    for (i = 0; i < clist->size; i++) {
        if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) {
            pPrev->next = pCurrent->next;
            break;
        }
        pPrev = pCurrent;
        pCurrent = pPrev->next;
    }
   


};
// 获得链表的长度
int Size_CircleLinkList(CircleLinkList* clist) {
    return clist->size;
};
// 判断是否为空
int IsEmpty_CircleLinkList(CircleLinkList* clist) {
    if (clist->size == 0) {
        return CIRCLELINKLIST_TRUE;
    }
    return CIRCLELINKLIST_FALSE;
};
//查找根据值查找
int Find_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) {
    if (clist == NULL) {
        return 0;
    }if (data == NULL) {
        return 0;
    }
    CircleLinkNode* pCurrent = clist->head.next;
    int flag = -1;
    for (int i = 0; i < clist->size; i++) {
        if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) {
            flag = i;
            break;
        }
        pCurrent = pCurrent->next;
    }


    return flag;
};
// 打印节点
void Print_CircleLinkList(CircleLinkList* clist, PRINTNODE print) {
    if (clist == NULL) {
        return;
    }
    // 辅助指针变量
    CircleLinkNode* pCurrent = clist->head.next;
    for (int i = 0; i < clist->size * 1; i++) {
        // 指向头结点
        if (pCurrent == &(clist->head)) {
            pCurrent = pCurrent->next;
            printf("------------------------------\n");
        }
        print(pCurrent);
        pCurrent = pCurrent->next;
    }
    
};
// 释放内存
void FreeSpace_CircleLinkList(CircleLinkList* clist) {
    if (clist == NULL) {
        return;
    }
    free(clist);
};

typedef struct PERSON {
    CircleLinkNode node;
    char name[64];
    int age;
    int score;
}Person;
void MyPrint(CircleLinkNode* data) {
    Person* p = (Person*)data;
    printf("Name = %s Age = %d Score  = %d\n", p->name, p->age, p->score);
}
int MyCompare(CircleLinkNode* data1, CircleLinkNode* data2) {
    Person* p1 = (Person*)data1;
    Person* p2 = (Person*)data2;
    if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age && p1->score== p2->score) {
        return CIRCLELINKLIST_TRUE;

    }
    CIRCLELINKLIST_FALSE;
}
int main(void)
{
    // 创建循环链表
    CircleLinkList* list = Init_CircleLinkList();
    // 创建数据
    PERSON z1, z2, z3;
    strcpy(z1.name, "qq");
    strcpy(z2.name, "zz");
    strcpy(z3.name, "azaz");
    z1.age = 22;
    z2.age = 22;
    z3.age = 22;

    z1.score = 100;
    z2.score = 100;
    z3.score = 100;
    // 数据入链表
    Insert_CircleLinkList(list, 100, (CircleLinkNode*)&z1);
    Insert_CircleLinkList(list, 100, (CircleLinkNode*)&z2);
    Insert_CircleLinkList(list, 100, (CircleLinkNode*)&z3);
    // 打印
    Print_CircleLinkList(list, MyPrint);
    
    Person pDel;
    strcpy(pDel.name, "qq");
    pDel.age = 22;
    pDel.score = 100;
    // 根据值删除
    RemoveByValue_CircleLinkList(list,(CircleLinkNode*)&pDel,MyCompare);

    // 打印
    printf("--------------------------\n");
    Print_CircleLinkList(list, MyPrint);

    // 释放内存
    FreeSpace_CircleLinkList(list);

    system("pause");
    return 0;
}

运行结果展示**运行结果展示**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/207398.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 问世一周年之际,开源大模型能否迎头赶上?

就在11月30日&#xff0c;ChatGPT 迎来了它的问世一周年&#xff0c;这个来自 OpenAI 的强大AI在过去一年里取得了巨大的发展&#xff0c;迅速吸引各个领域的用户群体。 我们首先回忆一下 OpenAI和ChatGPT这一年的大事记&#xff08;表格由ChatGPT辅助生成&#xff09;&#x…

java基础面试题(二)

java后端面试题大全 3.JVM3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置?3.2 java类的加载流程3.3 ThreadLocal 3.JVM 3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置? 堆 对象实例、String常量池、基本类型常量池、静态变量方法…

设计模式详解(二):抽象工厂——Abstract Factory

目录导航 抽象工厂及其作用工厂方法的好处工厂方法的实现关系图实现步骤 工厂方法的适用场景工厂方法举例 抽象工厂及其作用 工厂方法是一种创建型设计模式。所谓创建型设计模式是说针对创建对象方面的设计模式。在面向对象的编程语言里&#xff0c;我们通过对象间的相互协作&…

ios-class-guard - iOS代码混淆与加固实践

​ 目录 ios-class-guard - iOS代码混淆与加固实践 摘要 引言 一、class-dump 二、ios-class-guard 混淆原理 三、ios-class-guard 混淆结果 四、ios-class-guar 的使用 ios-class-guard 不支持 Swift ios-class-guard 不支持 iPhoneOS SDK ios-class-guard --sdk-ro…

【紫光同创PCIE教程】——DMA读写/PIO内存读写TLP解析

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;http://www.meyesemi.com) 一&#xff1a;PIO内存读写操作TLP解析 PCIE有三种空间——内存空间、IO空间、配置空间&#xff0c;其中内存空…

设计一款可扩展和基于windows系统的一键处理表格小工具思路

原创/朱季谦 设计一款可扩展和基于windows系统的一键处理表格小工具思路 日常开发当中&#xff0c;业务人员经常会遇到一些重复性整理表格的事情&#xff0c;这时候&#xff0c;就可以通过一些方式进行自动化程序处理&#xff0c;提高工作&#xff08;摸鱼&#xff09;效率。 …

【机器视觉技术】:开创人工智能新时代

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1; 前言&#x1f324;️ 机器视觉技术的实现☁️ 图像采集☁️ 图像处理☁️ 数据建模☁️应用展示…

基于harbor管理helm charts的方法

前言 Helm是Kubernetes的包管理器。Helm使用一种称为charts的打包格式。自1.6.0版本以来&#xff0c;Harbor是一个复合的云原生注册表&#xff0c;支持容器镜像管理和Helm Chart管理。对Harbor中Helm charts的访问由基于角色的访问控制&#xff08;RBAC&#xff09;控制&#…

Servlet概念视频笔记

学习地址:121-尚硅谷-Servlet-什么是Servlet_哔哩哔哩_bilibili 目录 1.Servlet技术 a.什么是Servlet b.手动实现Servlet程序 c.url地址如何定位到Servlet程序去访问 d.Servlet的生命周期 e.GET 和 POST 请求的分发处理 f.通过继承 HttpServlet 实现 Servlet程序 g.使用…

分享82个清新唯美PPT,总有一款适合您

分享82个清新唯美PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1tnRpOR8Gexg9gjWz4z15Xw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

AI一键生成文案-免费AI一键生成文案的软件有哪些

AI一键生成文案的原理涉及自然语言处理&#xff08;NLP&#xff09;和机器学习技术。这种技术的核心是基于大量文本数据的模式识别和生成&#xff0c;通常使用深度学习模型&#xff0c;如循环神经网络&#xff08;RNN&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;…

今日公众号爆文排行

​写爆文公众号需要综合考虑多个因素&#xff0c;包括内容质量、受众需求、话题热度、推广策略等。在创作过程中&#xff0c;可以着重参考其他作品&#xff0c;学习其优点和技巧&#xff0c;但同时也要注意避免抄袭和侵权行为。以下是一些写爆文公众号的方法和建议&#xff1a;…

2023年第十二届数学建模国际赛小美赛D题望远镜的微光系数求解分析

2023年第十二届数学建模国际赛小美赛 D题 望远镜的微光系数 原题再现&#xff1a; 当我们使用普通光学望远镜在昏暗的光线下观察远处的目标时&#xff0c;入射孔径越大&#xff0c;进入双筒望远镜的光线就越多。望远镜的放大倍数越大&#xff0c;视野越窄&#xff0c;图像显示…

使用NVM管理多个版本的node.js

1、nvm介绍&#xff1a; nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js 2、下载nvm地址&#xff1a; https://d…

蓝桥杯day03——二进制间距

1.题目 给定一个正整数 n&#xff0c;找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1&#xff0c;返回 0 。 如果只有 0 将两个 1 分隔开&#xff08;可能不存在 0 &#xff09;&#xff0c;则认为这两个 1 彼此 相邻 。两个 1 之间的距离…

计算机新建盘符和重新分配盘符的大小

一、新建盘符 有些电脑刚买来时候&#xff0c;只有一个C盘分区&#xff0c;此时最好增加几个分区方便使用。 注意&#xff1a;分区操作要慎重&#xff0c;不要轻易去试。这里只针对购买的电脑厂家未做分区&#xff0c;只有一个C盘的情况。 如果自己电脑的分区本身已经满足你…

Android 断点调试

Android 调试 https://developer.android.google.cn/studio/debug?hlzh-cn 调试自己写的代码&#xff08;不在Android源码&#xff09; 点击 Attach debugger to Android process 图标 需要在添加断点界面手动输入函数名 但也可以不手动&#xff0c;有个技巧可以new 空proje…

Vue生命周期:组件的生命之旅

&#x1f343;引言 在Vue.js中&#xff0c;每个组件都有其独特的生命周期。这个生命周期指的是组件从创建到销毁的一系列过程。了解并正确使用Vue的生命周期钩子&#xff0c;对于优化组件性能、管理组件状态以及实现特定功能至关重要。本文将详细介绍Vue的生命周期及其各个阶段…

【Linux】I/O多路转接技术

I/O多路转接技术 一、I/O多路转接之select1、select函数2、fd_set的相关内容3、如何在代码中高效的使用select函数4、select服务器5、select的优缺点6、select的适用场景 二、I/O多路转接之poll1、poll函数2、struct pollfd结构2、poll服务器3、poll的优缺点 三、I/O多路转接之…

在文本框中添加单位

<el-col :span"12"><el-form-item label"进度" prop"schedule":rules"[{required: true, message:进度不能为空, trigger:blur},{validator: validator.isFloatGteZero, trigger:blur}]"><el-input v-model"input…