循环单向链表(详解)

news2024/11/19 11:20:39

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

循环单项链表项目结构
在这里插入图片描述头文件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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7.2 Windows驱动开发:内核注册并监控对象回调

在笔者上一篇文章《内核枚举进程与线程ObCall回调》简单介绍了如何枚举系统中已经存在的进程与线程回调&#xff0c;本章LyShark将通过对象回调实现对进程线程的句柄监控&#xff0c;在内核中提供了ObRegisterCallbacks回调&#xff0c;使用这个内核回调函数&#xff0c;可注册…

vscode如何在没有网络的情况下安装插件

vscode如何在没有网络的情况下安装插件 start 遇到没有网络的电脑&#xff0c;无法直接从插件市场安装vscode的插件。写一下 vscode 插件离线安装的方法. 解决方案 目标电脑没有可以安装插件的网络&#xff0c;那我们只能在有网络的环境下载好我们的插件。然后拷贝软件到无…

localStorage 和sessionStorage

localStorage 和 sessionStorage 是浏览器提供的两种客户端存储数据的方式&#xff1a; 生命周期&#xff1a; localStorage&#xff1a; 存储在 localStorage 中的数据在浏览器关闭后仍然保留&#xff0c;直到被显式删除或浏览器清除缓存。sessionStorage&#xff1a; 存储在 …

【零基础入门Docker】Dockerfile中的USER指令以及dockerfile命令详解

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;Docker零基础入门专栏 目录 第 1 步&#xff1a;创建 Dockerfile 第 2 步&#xff1a;构建 Docker 镜像 第 3 步&#xff1a;运行 Docker 容器 第 4 步&#xff1a;验证输出 dockerfile命令详解 最佳实践 默认情况下…

对el-select封装成组件使用

效果与直接使用el-select一样&#xff0c;多处用el-select显得代码冗余就进行了封装 效果图&#xff1a; el-select封装&#xff1a; <template><div class"my-select"><el-selectv-model"person.modelValue":placeholder"placehold…

【广州华锐视点】机械零件拆装VR仿真教学系统

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进我们的生活。在教育领域&#xff0c;VR技术的应用也日益广泛&#xff0c;为学生提供了更加生动、直观的学习体验。广州华锐视点开发的机械零件拆装VR仿真教学系统作为一种新兴的教学方式&…

oops-framework框架 之 初始了解(一)

引擎&#xff1a;CocosCreator 环境&#xff1a; Mac Gitee: oops-framework 简介 oops-framework是由作者dgflash编写&#xff0c;基于CocosCreator 3.x而实现的开源框架。 该框架以插件形式存在&#xff0c;主要目的是为了降低与项目的耦合&#xff0c;并且通过插件内部的…

【代码】基于麻雀搜索优化Kmeans图像分割算法

程序名称&#xff1a;基于麻雀搜索优化Kmeans图像分割算法 实现平台&#xff1a;matlab 代码简介&#xff1a;首先使用麻雀搜索优化算法来确定 K-means 算法的初始质心位置&#xff0c;然后进行传统的 K-means 聚类。这样做的目的是为了避免 K-means 算法陷入局部最优解&…

Mybatis 的操作(续集)

Mybatis 是一款优秀的 持久性 框架,用于简化 JDBC 的开发 持久层 : 指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的 简单来说 Mybatis 是更简单完成程序和数据库交互的框架 Mybatis 的写法有两种 : 1.xml 2.注解 这两者各有利弊,后面进行总结 Mybati…

HTML5 的全局属性 hidden 和 display:none 的关系

目录 1&#xff0c;hidden 和 display:none 的关系2&#xff0c;其他隐藏元素的方式2.1&#xff0c;语意上的隐藏2.2&#xff0c;视觉上的隐藏 1&#xff0c;hidden 和 display:none 的关系 hidden - MDN 参考 一句话总结&#xff1a;hidden 是HTML5 新增的全局布尔属性&…

播放器开发(七):音视频同步实现

目录 学习课题&#xff1a;逐步构建开发播放器【QT5 FFmpeg6 SDL2】 原理 简单分析&#xff1a; 下图简单描述了在一个播放过程中&#xff0c;假设我们先播放音频&#xff0c;对比一个公共时间轴&#xff0c;视频就会始终比音频慢0.003s。 我们在日常中用一些播放器播放视频…

Oracle:左连接、右连接、全外连接、(+)号详解

目录 Oracle 左连接、右连接、全外连接、&#xff08;&#xff09;号详解 1、左外连接&#xff08;LEFT OUTER JOIN/ LEFT JOIN&#xff09; 2、右外连接&#xff08;RIGHT OUTER JOIN/RIGHT JOIN&#xff09; 3、全外连接&#xff08;FULL OUTER JOIN/FULL JOIN&#xff0…

013 OpenCV copyMakeBorder(padding)

目录 一、环境 二、原理 三、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、原理 cv.copyMakeBorder是OpenCV库中的一个函数&#xff0c;用于在图像周围添加边框&#xff08;padding&#xff09;。这个函数可以用于图…

​iOS Class Guard github用法、工作原理和安装详解及使用经验总结

iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table&#xff0c;这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。iOS-Class-Guard不…

Eclipse导入JavaWeb项目

Eclipse 导入JavaWeb项目教程 运行教程 亲爱的粉丝们&#xff0c;我深知你们对Eclipse导入Web项目教程的迫切需求。在这个充满竞争的时代&#xff0c;每一个项目都离不开高效的沟通。过程中需要对应的环境适配和软件安…

淘宝/天猫商品详情API接口丨京东商品详情丨1688商品详情丨接口key密钥获取方式

要获取淘宝/天猫商品详情API接口、京东商品详情API接口、1688商品详情API接口以及接口密钥&#xff08;Key&#xff09;&#xff0c;可以按照以下步骤进行操作&#xff1a; 注册并登录淘宝/天猫开发者中心或京东开放平台或1688开放平台&#xff0c;并创建应用。在创建应用的过…

cmake和vscode 下的cmake的使用详解(二)

第四讲&#xff1a; GDB 调试器 前言&#xff1a; GDB(GNU Debugger) 是一个用来 调试 C/C 程序 的功能强大的 调试器 &#xff0c;是 Linux 系统开发 C/C 最常用的调试器 程序员可以 使用 GDB 来跟踪程序中的错误 &#xff0c;从而减少程序员的工作量。 Linux 开发 C/C …

postgresql从入门到精通教程 - 第36讲:postgresql逻辑备份

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第36讲&#…

分布式系统中最基础的 CAP 理论及其应用

对于开发或设计分布式系统的架构师、工程师来说&#xff0c;CAP 是必须要掌握的基础理论&#xff0c;CAP 理论可以帮助架构师对系统设计中目标进行取舍&#xff0c;合理地规划系统拆分的维度。下面我们先讲讲分布式系统的特点。 分布式系统的特点 随着移动互联网的快速发展&a…

vue使用皮肤框架element-plus,element-ui是vue2.0的皮肤

vue使用皮肤框架element-plus&#xff0c;element-ui是vue2.0的皮肤&#xff0c;所以现在最新的vue3要使用element-plus皮肤。使用命令行安装element-plus: npm install element-plus安装后&#xff1a; {"name": "vue01","private": true,&quo…