循环单向链表(详解)

循环单向链表原理

循环单项链表项目结构
头文件RecycleLinlList.h
头文件具体代码

cpp 复制代码
#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文件具体代码

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;
}

运行结果展示

相关推荐
XH华4 小时前
初识C语言之二维数组(下)
c语言·算法
菜鸡中的奋斗鸡→挣扎鸡4 小时前
滑动窗口 + 算法复习
数据结构·算法
axxy20006 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法
这是我587 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
Uu_05kkq7 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
1nullptr9 小时前
三次翻转实现数组元素的旋转
数据结构
TT哇9 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
嵌入式科普9 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A9 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
1 9 J10 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法