鱼C论坛

 找回密码
 立即注册
查看: 3533|回复: 11

[已解决]循环链表问题

[复制链接]
发表于 2021-8-13 16:12:33 | 显示全部楼层 |阅读模式

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

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

x
魔术师发牌,第n张牌空n个位置,假定一共13张牌
编译器没报错,可能是循环写错了?
看看有什么地方错了?

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define CardNumber 13

  4. typedef struct node
  5. {
  6.     int data;
  7.     struct node *next;
  8. } sqlist, *linklist;

  9. linklist CreateLinkList();
  10. void Magician(linklist);
  11. void DestoryList(linklist p);

  12. int main(void)
  13. {
  14.     linklist p;
  15.     int i;

  16.     p = CreateLinkList();
  17.     Magician(p);

  18.     printf("按如下顺序排列:\n");
  19.     for (i = 0; i < CardNumber; i++)
  20.     {
  21.         printf("黑桃%d", p->data);
  22.         p = p->next;
  23.     }

  24.     DestoryList(p);

  25.     return 0;
  26. }

  27. linklist CreateLinkList()
  28. {
  29.     linklist head = NULL;
  30.     linklist p = NULL;

  31.     head->next = p;

  32.     int i, n;
  33.     n = CardNumber;

  34.     for (i = 0; i < n; i++)
  35.     {
  36.         p = (linklist)malloc(sizeof(sqlist));
  37.         p->data = 0;
  38.         p = p->next;
  39.     }
  40.     p->next = head;

  41.     return head;
  42. }

  43. void Magician(linklist p)
  44. {
  45.     int n, count, i;
  46.     p->data = 1;
  47.     count = 2;

  48.     while (1)
  49.     {
  50.         for (i = 0; i < count; i++)
  51.         {
  52.             p = p->next;
  53.             if (p->data != 0)
  54.             {
  55.                 p = p->next;
  56.                 i--;
  57.             }
  58.         }

  59.         if (p->data == 0)
  60.         {
  61.             p->data = count;
  62.             count++;
  63.         }
  64.         if (count == 14)
  65.         {
  66.             break;
  67.         }
  68.     }

  69.     p = p->next;
  70. }

  71. void DestoryList(linklist p)
  72. {
  73.     linklist temp = p;

  74.     for (int j = 0; j < CardNumber; j++)
  75.     {
  76.         temp = p;
  77.         p = p->next;
  78.         free(temp);
  79.     }
  80. }
复制代码
最佳答案
2021-8-13 17:25:41
错误太多了

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define CardNumber 13

  4. typedef struct node
  5. {
  6.     int data;
  7.     struct node *next;
  8. } sqlist, *linklist;

  9. linklist CreateLinkList();
  10. void Magician(linklist);
  11. void DestoryList(linklist p);

  12. int main(void)
  13. {
  14.     //linklist p;
  15.     linklist p, q;
  16.     int i;

  17.     //p = CreateLinkList();
  18.     q = p = CreateLinkList();
  19.     Magician(p);

  20.     printf("按如下顺序排列:\n");
  21.     for (i = 0; i < CardNumber; i++)
  22.     {
  23.         //printf("黑桃%d", p->data);
  24.         printf("黑桃: %d, ", p->data);
  25.         p = p->next;
  26.     }

  27.     //DestoryList(p);
  28.     DestoryList(q);

  29.     return 0;
  30. }

  31. linklist CreateLinkList()
  32. {
  33.     linklist head = NULL;
  34.     //linklist p = NULL;

  35.     //head->next = p;

  36.     //int i, n;
  37.     int i;
  38.     //n = CardNumber;

  39.     //for (i = 0; i < n; i++)
  40.     for (i = 0; i < CardNumber; i++)
  41.     {
  42.         linklist p = malloc(sizeof(*p));
  43.         p->data = 0;
  44.         p->next = head;
  45.         head = p;
  46.         //p = p->next;
  47.     }
  48.     //p->next = head;

  49.     return head;
  50. }

  51. void Magician(linklist p)
  52. {
  53.     //int n, count, i;
  54.     int count, i;
  55.     p->data = 1;
  56.     count = 2;

  57.     // 下面这个循环看不懂
  58.     // 不知道你要做什么
  59.     /*
  60.     while (1)
  61.     {
  62.         for (i = 0; i < count; i++)
  63.         {
  64.             p = p->next;
  65.             if (p->data != 0)
  66.             {
  67.                 p = p->next;
  68.                 i--;
  69.             }
  70.         }

  71.         if (p->data == 0)
  72.         {
  73.             p->data = count;
  74.             count++;
  75.         }
  76.         if (count == 14)
  77.         {
  78.             break;
  79.         }
  80.     }

  81.     p = p->next;
  82.     */
  83. }

  84. void DestoryList(linklist p)
  85. {
  86.     //linklist temp = p;
  87.     linklist temp;

  88.     for (int j = 0; j < CardNumber; j++)
  89.     {
  90.         temp = p;
  91.         p = p->next;
  92.         free(temp);
  93.     }
  94. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-13 16:33:57 | 显示全部楼层
    linklist head = NULL;
    linklist p = NULL;

    head->next = p;

head 没有指向对象
head->next    访问 next 是错误的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-13 16:45:06 | 显示全部楼层
  1. linklist CreateLinkList()
  2. {
  3.     // linklist head = NULL;
  4.     linklist head = malloc(sizeof(*head));
  5.     linklist p = NULL;

  6.     head->next = p;

  7.     int i, n;
  8.     n = CardNumber;

  9.     for (i = 0; i < n; i++)
  10.     {
  11.         p = (linklist)malloc(sizeof(sqlist));
  12.         p->data = 0;
  13.         p = p->next;
  14.     }
  15.     p->next = head;

  16.     return head;
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-13 17:04:20 | 显示全部楼层

按照你的改啦,还是跑不出来啊
linklist head = malloc(sizeof(*head));是不是应该写成
linklist head = (linklist)malloc(sizeof(sqlist));
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-13 17:05:50 | 显示全部楼层
焦糖橙子 发表于 2021-8-13 17:04
按照你的改啦,还是跑不出来啊
linklist head = malloc(sizeof(*head));是不是应该写成
linklist head  ...

不是这样 linklist head = (linklist)malloc(sizeof(sqlist));
是这样 linklist head = malloc(sizeof(*head));
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-13 17:25:41 | 显示全部楼层    本楼为最佳答案   
错误太多了

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define CardNumber 13

  4. typedef struct node
  5. {
  6.     int data;
  7.     struct node *next;
  8. } sqlist, *linklist;

  9. linklist CreateLinkList();
  10. void Magician(linklist);
  11. void DestoryList(linklist p);

  12. int main(void)
  13. {
  14.     //linklist p;
  15.     linklist p, q;
  16.     int i;

  17.     //p = CreateLinkList();
  18.     q = p = CreateLinkList();
  19.     Magician(p);

  20.     printf("按如下顺序排列:\n");
  21.     for (i = 0; i < CardNumber; i++)
  22.     {
  23.         //printf("黑桃%d", p->data);
  24.         printf("黑桃: %d, ", p->data);
  25.         p = p->next;
  26.     }

  27.     //DestoryList(p);
  28.     DestoryList(q);

  29.     return 0;
  30. }

  31. linklist CreateLinkList()
  32. {
  33.     linklist head = NULL;
  34.     //linklist p = NULL;

  35.     //head->next = p;

  36.     //int i, n;
  37.     int i;
  38.     //n = CardNumber;

  39.     //for (i = 0; i < n; i++)
  40.     for (i = 0; i < CardNumber; i++)
  41.     {
  42.         linklist p = malloc(sizeof(*p));
  43.         p->data = 0;
  44.         p->next = head;
  45.         head = p;
  46.         //p = p->next;
  47.     }
  48.     //p->next = head;

  49.     return head;
  50. }

  51. void Magician(linklist p)
  52. {
  53.     //int n, count, i;
  54.     int count, i;
  55.     p->data = 1;
  56.     count = 2;

  57.     // 下面这个循环看不懂
  58.     // 不知道你要做什么
  59.     /*
  60.     while (1)
  61.     {
  62.         for (i = 0; i < count; i++)
  63.         {
  64.             p = p->next;
  65.             if (p->data != 0)
  66.             {
  67.                 p = p->next;
  68.                 i--;
  69.             }
  70.         }

  71.         if (p->data == 0)
  72.         {
  73.             p->data = count;
  74.             count++;
  75.         }
  76.         if (count == 14)
  77.         {
  78.             break;
  79.         }
  80.     }

  81.     p = p->next;
  82.     */
  83. }

  84. void DestoryList(linklist p)
  85. {
  86.     //linklist temp = p;
  87.     linklist temp;

  88.     for (int j = 0; j < CardNumber; j++)
  89.     {
  90.         temp = p;
  91.         p = p->next;
  92.         free(temp);
  93.     }
  94. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-13 17:26:42 | 显示全部楼层
没有掌握 C 的指针
指针的使用上基本全错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-13 17:55:59 | 显示全部楼层
本帖最后由 焦糖橙子 于 2021-8-13 19:51 编辑


我重新修改了一下CreateLinkList函数,已经输出成功了,
那个while循环是为了判断  当前位置是否有牌
又去补了一遍结构体指针

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define CardNumber 13

  4. typedef struct node
  5. {
  6.     int data;
  7.     struct node *next;
  8. } sqlist, *linklist;

  9. linklist CreateLinkList();
  10. void Magician(linklist);
  11. void DestoryList(linklist p);

  12. int main(void)
  13. {
  14.     linklist p;
  15.     int i;

  16.     p = CreateLinkList();
  17.     Magician(p);

  18.     printf("按如下顺序排列:\n");
  19.     for (i = 0; i < CardNumber; i++)
  20.     {
  21.         printf("黑桃%d ", p->data);
  22.         p = p->next;
  23.     }

  24.     DestoryList(p);

  25.     return 0;
  26. }

  27. linklist CreateLinkList()
  28. {
  29.     linklist head = (linklist)malloc(sizeof(sqlist));
  30.     linklist p = head;

  31.     int i, n;
  32.     n = CardNumber;

  33.     for (i = 0; i < n; i++)
  34.     {
  35.         p->next = (linklist)malloc(sizeof(sqlist));
  36.         p->data = 0;
  37.         p = p->next;
  38.     }
  39.     p->next = head;

  40.     return head;
  41. }

  42. void Magician(linklist p)
  43. {
  44.     int count, i;
  45.     p->data = 1;
  46.     count = 2;

  47.     while (1)
  48.     {
  49.         for (i = 0; i < count; i++)
  50.         {
  51.             p = p->next;
  52.             if (p->data != 0)
  53.             {
  54.                 p = p->next;
  55.                 i--;
  56.             }
  57.         }

  58.         if (p->data == 0)
  59.         {
  60.             p->data = count;
  61.             count++;
  62.         }
  63.         if (count == 14)
  64.         {
  65.             break;
  66.         }
  67.     }

  68.     p = p->next;
  69. }

  70. void DestoryList(linklist p)
  71. {
  72.     linklist temp = p;

  73.     for (int j = 0; j < CardNumber; j++)
  74.     {
  75.         temp = p;
  76.         p = p->next;
  77.         free(temp);
  78.     }
  79. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-13 18:16:10 | 显示全部楼层
焦糖橙子 发表于 2021-8-13 17:55
我重新修改了一下CreateLinkList函数,已经输出成功了,
那个while循环是为了判断  当前位置是否有牌
{ ...

这个程序死循环
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-13 19:17:43 | 显示全部楼层

我在里面加了一个break,满足条件就出来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-13 19:37:49 | 显示全部楼层
焦糖橙子 发表于 2021-8-13 19:17
我在里面加了一个break,满足条件就出来了

我当然看到你写了 break
我说你的程序死循环了,是我真的运行你的程序,然后发现程序死循环了
GIF.gif
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-13 19:56:33 | 显示全部楼层
PS D:\Code\S2E20> cd "d:\Code\S2E20\" ; if ($?) { g++ S2E20.cpp -o S2E20 } ; if ($?) { .\S2E20 }
按如下顺序排列:
黑桃1 黑桃11 黑桃2 黑桃12 黑桃5 黑桃3 黑桃6 黑桃0 黑桃9 黑桃4 黑桃10 黑桃7 黑桃13
PS D:\Code\S2E20>


我这边可以跑啊,我用的vscode
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 15:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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