鱼C论坛

 找回密码
 立即注册
查看: 1403|回复: 4

循环链表

[复制链接]
回帖奖励 3 鱼币 回复本帖可获得 3 鱼币奖励! 每人限 1 次(中奖概率 10%)
发表于 2020-4-18 16:47:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 乔宽 于 2020-4-18 17:30 编辑
#ifndef CIRCLELINKLIST
#define CIRCLELINKLIST
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0
#include <stdio.h>
#include <stdlib.h>

//链表小结点
typedef struct CIRCLELINKNODE{
        struct CIRCLELINKNODE * next;

}CircleLinkNode;
//链表结构体
typedef struct CIRCLELINKLIST{
        CircleLinkNode head;
        int size;//判断循环是否停止的标志
}CircleLinkList;

//编写针对链表结构体操作的API函数

//比较回调
typedef int(*COMPARENODE)(CircleLinkNode *, CircleLinkNode *);
typedef void(*PRINTLINKLIST)(CircleLinkNode *);
//初始化函数
CircleLinkList * Init_CircleLinkList();
//插入函数
void Insert_CircleLinkList(CircleLinkList * clist, int pos, CircleLinkNode* data);
//根据位置删除
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);
//返回第一个元素
CircleLinkNode *  Front_CircleLinkList(CircleLinkList * clist);
int Find_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare);
//打印
void Print_CircleLinkList(CircleLinkList * clist, PRINTLINKLIST print);
//释放
void FreeSpace_CircleLinkList(CircleLinkList * clist);
#endif
#include "CircleLinkList.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++;

}
//根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList * clist, int pos){
        if (clist == NULL)
        {
                return;
        }
        if (pos < 0 || pos >= clist->size){
                return;
        }
        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 ( i = 0; i < clist->size; i++){
                if (compare(pCurrent,data) == CIRCLELINKLIST_TRUE)
                {
                        pPrev->next = pCurrent->next;
                        break;
                
                }
                pPrev = pCurrent;
                pCurrent = pPrev->next;
        }
        
        clist->size--;

}
//获取链表的长度
int Size_CircleLinkList(CircleLinkList * clist){
        return clist->size;
}
//判断是否为空
int IsEmpty_CircleLinkList(CircleLinkList * clist){
        if (clist->size == 0)
        {
                return CIRCLELINKLIST_TRUE;
        }
        return CIRCLELINKLIST_FALSE;
}
//返回第一个元素
CircleLinkNode *  Front_CircleLinkList(CircleLinkList * clist){
        
        return clist->head.next;
}
//查找
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, PRINTLINKLIST print){
        if (clist == NULL){

                return;
        }
        CircleLinkNode * pCurrent = clist->head.next;
        for (int i = 0; i < clist->size * 3; i++){
                if (pCurrent == &(clist->head))
                {
                        pCurrent = pCurrent->next;
                        printf("-------------------------- \n");
                }
                print(pCurrent);
                pCurrent = pCurrent->next;
        }

}
//释放
void Free_CircleLinkList(CircleLinkList  * clist)
{
        if (clist == NULL)
        {
                return;
        }
        free(clist);
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.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 main(void){

        //创建循环链表
        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 = 10;
        p2.score = 20;
        p3.score = 30;
        p4.score = 40;
        p5.score = 50;
        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);
        //释放内存
      FreeSpace_CircleLinkList(clist);

        system("pause");
        return 0;
}
在运行Freespace_CircleLinK(clist);时出错。
58313c5bc423df9dbf5dacbbf165294.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-18 17:14:17 | 显示全部楼层
就是不认真导致的问题,而且还不愿意检查自己写的代码

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 17:21:25 | 显示全部楼层
人造人 发表于 2020-4-18 17:14
就是不认真导致的问题,而且还不愿意检查自己写的代码

不好意思,是上传时,传错了,没有最后一个括号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 17:24:15 | 显示全部楼层

回帖奖励 +3 鱼币

乔宽 发表于 2020-4-18 17:21
不好意思,是上传时,传错了,没有最后一个括号

那你看清楚第 148 行
是 free(list);
还是 free(clist);

逻辑错误我就不说你什么了
连最基本的语法问题都保证不了?
你一定没有认真检查你的代码吧?
这种语法问题,你说你检查不出来?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 17:49:24 | 显示全部楼层
人造人 发表于 2020-4-18 17:24
那你看清楚第 148 行
是 free(list);
还是 free(clist);

跪求原谅,我自己运行时,没有这些错误,自己查了查,改了改,上传了第一次,第二次又改了改,编辑了编辑,保存了,这些错误是第二次产生的,是我的错,我会认真检查代码的,不过这错误是运行释放FreeSpace_LinkList(clist)时产生,删了这条代码,运行成功了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 06:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表