鱼C论坛

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

循环链表

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

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

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

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

  7. //链表小结点
  8. typedef struct CIRCLELINKNODE{
  9.         struct CIRCLELINKNODE * next;

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

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

  17. //比较回调
  18. typedef int(*COMPARENODE)(CircleLinkNode *, CircleLinkNode *);
  19. typedef void(*PRINTLINKLIST)(CircleLinkNode *);
  20. //初始化函数
  21. CircleLinkList * Init_CircleLinkList();
  22. //插入函数
  23. void Insert_CircleLinkList(CircleLinkList * clist, int pos, CircleLinkNode* data);
  24. //根据位置删除
  25. void RemoveByPos_CircleLinkList(CircleLinkList * clist, int pos);
  26. //根据值删除函数
  27. void RemoveByValue_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data,COMPARENODE compare);
  28. //获取链表的长度
  29. int Size_CircleLinkList(CircleLinkList * clist);
  30. //判断是否为空
  31. int IsEmpty_CircleLinkList(CircleLinkList * clist);
  32. //返回第一个元素
  33. CircleLinkNode *  Front_CircleLinkList(CircleLinkList * clist);
  34. int Find_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare);
  35. //打印
  36. void Print_CircleLinkList(CircleLinkList * clist, PRINTLINKLIST print);
  37. //释放
  38. void FreeSpace_CircleLinkList(CircleLinkList * clist);
  39. #endif
复制代码
  1. #include "CircleLinkList.h"

  2. //初始化函数
  3. CircleLinkList * Init_CircleLinkList(){
  4.        
  5.         CircleLinkList *clist = (CircleLinkList *)malloc(sizeof(CircleLinkList));
  6.         clist->head.next = &(clist->head);//指向自己
  7.         clist->size = 0;
  8.         return clist;
  9. }
  10. //插入函数
  11. void Insert_CircleLinkList(CircleLinkList * clist, int pos, CircleLinkNode* data){
  12.         if (clist == NULL)
  13.         {
  14.                 return;
  15.         }
  16.         if (data == NULL)
  17.         {
  18.                 return;
  19.         }
  20.         if (pos < 0 || pos >=clist->size)
  21.         {
  22.                 pos = clist->size;
  23.         }
  24.         //根据位置查找结点
  25.         //辅助指针变量
  26.         CircleLinkNode * pCurrent = &(clist->head);
  27.         for (int i = 0; i < pos; i++)
  28.         {
  29.                 pCurrent = pCurrent->next;
  30.         }
  31.         data->next = pCurrent->next;
  32.         pCurrent->next = data;

  33.         clist->size++;

  34. }
  35. //根据位置删除
  36. void RemoveByPos_CircleLinkList(CircleLinkList * clist, int pos){
  37.         if (clist == NULL)
  38.         {
  39.                 return;
  40.         }
  41.         if (pos < 0 || pos >= clist->size){
  42.                 return;
  43.         }
  44.         CircleLinkNode  * pCurrent = &(clist->head);
  45.         for (int i = 0; i < pos; i++){
  46.                 pCurrent = pCurrent->next;
  47.         }
  48.         //缓存当前结点的下一个结点
  49.         CircleLinkNode * pNext = pCurrent->next;
  50.         pCurrent->next = pNext->next;
  51.         clist->size--;

  52. }
  53. //根据值删除函数
  54. void RemoveByValue_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare){
  55.         if (clist == NULL){
  56.                 return;
  57.         }
  58.         if (data == NULL){
  59.                 return;
  60.         }
  61.         CircleLinkNode * pPrev = &(clist->head);
  62.         CircleLinkNode * pCurrent = pPrev->next;
  63.         int i = 0;
  64.         for ( i = 0; i < clist->size; i++){
  65.                 if (compare(pCurrent,data) == CIRCLELINKLIST_TRUE)
  66.                 {
  67.                         pPrev->next = pCurrent->next;
  68.                         break;
  69.                
  70.                 }
  71.                 pPrev = pCurrent;
  72.                 pCurrent = pPrev->next;
  73.         }
  74.        
  75.         clist->size--;

  76. }
  77. //获取链表的长度
  78. int Size_CircleLinkList(CircleLinkList * clist){
  79.         return clist->size;
  80. }
  81. //判断是否为空
  82. int IsEmpty_CircleLinkList(CircleLinkList * clist){
  83.         if (clist->size == 0)
  84.         {
  85.                 return CIRCLELINKLIST_TRUE;
  86.         }
  87.         return CIRCLELINKLIST_FALSE;
  88. }
  89. //返回第一个元素
  90. CircleLinkNode *  Front_CircleLinkList(CircleLinkList * clist){
  91.        
  92.         return clist->head.next;
  93. }
  94. //查找
  95. int Find_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare){
  96.         if (clist == NULL)
  97.         {
  98.                 return - 1;
  99.         }
  100.         if (data == NULL)
  101.         {
  102.                 return -1;
  103.         }

  104.         CircleLinkNode * pCurrent = clist->head.next;

  105.         int flag = -1;
  106.         for (int i = 0; i < clist->size; i++)
  107.         {
  108.                 if (compare(pCurrent , data) == CIRCLELINKLIST_TRUE){
  109.                         flag = i;
  110.                         break;
  111.                 }
  112.                 pCurrent = pCurrent->next;
  113.         }

  114.         return flag;
  115. }
  116. //打印
  117. void Print_CircleLinkList(CircleLinkList * clist, PRINTLINKLIST print){
  118.         if (clist == NULL){

  119.                 return;
  120.         }
  121.         CircleLinkNode * pCurrent = clist->head.next;
  122.         for (int i = 0; i < clist->size * 3; i++){
  123.                 if (pCurrent == &(clist->head))
  124.                 {
  125.                         pCurrent = pCurrent->next;
  126.                         printf("-------------------------- \n");
  127.                 }
  128.                 print(pCurrent);
  129.                 pCurrent = pCurrent->next;
  130.         }

  131. }
  132. //释放
  133. void Free_CircleLinkList(CircleLinkList  * clist)
  134. {
  135.         if (clist == NULL)
  136.         {
  137.                 return;
  138.         }
  139.         free(clist);
  140. }
复制代码
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "CircleLinkList.h"
  6. typedef struct PERSON{

  7.         CircleLinkNode node;
  8.         char name[64];
  9.         int age;
  10.         int score;
  11. }Person;
  12. void MyPrint(CircleLinkNode *data){
  13.         Person *p = (Person *)data;
  14.         printf("Name:%s Age:%d Score:%d\n", p->name, p->age, p->score);

  15. }
  16. int main(void){

  17.         //创建循环链表
  18.         CircleLinkList * clist = Init_CircleLinkList();
  19.         //创建数据
  20.         Person p1, p2, p3, p4, p5;
  21.         strcpy(p1.name, "aaa");
  22.         strcpy(p2.name, "bbb");
  23.         strcpy(p3.name, "ccc");
  24.         strcpy(p4.name, "ddd");
  25.         strcpy(p5.name, "eee");
  26.         p1.age = 10;
  27.         p2.age = 20;
  28.         p3.age = 30;
  29.         p4.age = 40;
  30.         p5.age = 50;
  31.         p1.score = 10;
  32.         p2.score = 20;
  33.         p3.score = 30;
  34.         p4.score = 40;
  35.         p5.score = 50;
  36.         Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p1);
  37.         Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p2);
  38.         Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p3);
  39.         Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p4);
  40.         Insert_CircleLinkList(clist, 100, (CircleLinkNode*)&p5);
  41.         //打印
  42.         Print_CircleLinkList(clist ,MyPrint);
  43.         //释放内存
  44.       FreeSpace_CircleLinkList(clist);

  45.         system("pause");
  46.         return 0;
  47. }
复制代码

在运行Freespace_CircleLinK(clist);时出错。
58313c5bc423df9dbf5dacbbf165294.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思,是上传时,传错了,没有最后一个括号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +3 鱼币

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

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

逻辑错误我就不说你什么了
连最基本的语法问题都保证不了?
你一定没有认真检查你的代码吧?
这种语法问题,你说你检查不出来?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 11:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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