单向链表之循环链表

循环链表

代码示例:

循环链表.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"CircleLinkList.h"
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;
        }
        return CIRCLELINKLIST_FALSE;
}
void test01()
{
        //创建循环链表
        CircleLinkList*clist = Init_CircleLinkList();
        //创建数据
        Person p1, p2, p3, p4, p5;
        strcpy(p1.name, "aaa");
        strcpy(p2.name, "bbb");
        strcpy(p3.name, "ccc");
        strcpy(p4.name, "ddd");
        strcpy(p5.name, "eee");
        p1.age = 10;
        p2.age = 20;
        p3.age = 30;
        p4.age = 40;
        p5.age = 50;
        p1.score = 50;
        p2.score = 50;
        p3.score = 60;
        p4.score = 65;
        p5.score = 70;
        //数据入链表
        Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p1);
        Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p2);
        Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p3);
        Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p4);
        Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p5);
        //打印
        Print_CircleLinkList(clist, MyPrint);
        Person pDel;
        strcpy(pDel.name, "ddd");
        pDel.age = 40;
        pDel.score = 65;
        //根据值删除
        RemoveByValue_CircleLinkList(clist, (CircleLinkNode*)&pDel, MyCompare);
        //打印
        printf("----------------------\n");
        Print_CircleLinkList(clist, MyPrint);
        //释放内存
        FreeSpace_CircleLinkList(clist);
}
int main()
{
        test01();
        return EXIT_SUCCESS;
}

CircleLinkList.c

#include"CircleLinkList.h"
#include<stdio.h>
#include<stdlib.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 (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 = pPrev->next;
        int i = 0;
        for (int 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_CircleList(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 -1;
        }
        if (data == NULL)
        {
               return -1;
        }
        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; 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);
}

CircleLinkList.h

#ifndef CIRCLELINKLIST
#define CIRCLELINKLIST
//链表的小结点
typedef struct CIRCLELINKNODE
{
        struct CIRCLELINKNODE*next;
}CircleLinkNode;
//链表结构体
typedef struct CIRCLELINKLIST
{
        CircleLinkNode head;
        int size;
}CircleLinkList;
//编写针对链表结构体操作的API函数
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0
//比较回调
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_CircleList(CircleLinkList*clist);
//查找
int Find_CircleLinkList(CircleLinkList*clist, CircleLinkNode*data, COMPARENODE compare);
//打印结点
void Print_CircleLinkList(CircleLinkList*clist, PRINTNODE print);
//释放内存
void FreeSpace_CircleLinkList(CircleLinkList*clist);
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值