VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 158|回复: 1

[已解决]c语言循环链表

[复制链接]
01_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-18 20:50:15 | 显示全部楼层 |阅读模式
  1. #ifndef CIRCLELINKLIST
  2. #define CIRCLELINKLIST

  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #define CIRCLELINKLIST_TRUE 1
  6. #define CIRCLELINKLIST_FALSE 0
  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 void(*PRINTLINKLIST)(CircleLinkNode *);
  19. typedef int(*COMPARENODE)(CircleLinkNode *, 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 FreeSpace_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_LinkList(clist)时出错了,删了这条语句,运行成功了,不知道为什么?
最佳答案
57_avatar_small
2020-4-19 12:31:14
1.全部代码中未出现FreeSpace_LinkList代码,包含声明、定义和调用。
2.图片中报错原因:FreeSpace_CircleLinkList函数声明了,但未找到其定义。检查一下该函数的声明定义。
3.调整了代码之后,该程序正常运行。
58313c5bc423df9dbf5dacbbf165294.png




上一篇:实现栈的正序输出的问题
下一篇:这是一段不知道报错原因的问题的代码。。
57_avatar_middle
最佳答案
21 
在线会员 发表于 2020-4-19 12:31:14 | 显示全部楼层    本楼为最佳答案   
bestAnswer
1.全部代码中未出现FreeSpace_LinkList代码,包含声明、定义和调用。
2.图片中报错原因:FreeSpace_CircleLinkList函数声明了,但未找到其定义。检查一下该函数的声明定义。
3.调整了代码之后,该程序正常运行。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-8-11 23:41

Powered by CcTry.CoM

© 2009-2020 cctry.com

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