焦糖橙子 发表于 2021-8-13 16:12:33

循环链表问题

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

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

#define CardNumber 13

typedef struct node
{
    int data;
    struct node *next;
} sqlist, *linklist;

linklist CreateLinkList();
void Magician(linklist);
void DestoryList(linklist p);

int main(void)
{
    linklist p;
    int i;

    p = CreateLinkList();
    Magician(p);

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

    DestoryList(p);

    return 0;
}

linklist CreateLinkList()
{
    linklist head = NULL;
    linklist p = NULL;

    head->next = p;

    int i, n;
    n = CardNumber;

    for (i = 0; i < n; i++)
    {
      p = (linklist)malloc(sizeof(sqlist));
      p->data = 0;
      p = p->next;
    }
    p->next = head;

    return head;
}

void Magician(linklist p)
{
    int n, count, i;
    p->data = 1;
    count = 2;

    while (1)
    {
      for (i = 0; i < count; i++)
      {
            p = p->next;
            if (p->data != 0)
            {
                p = p->next;
                i--;
            }
      }

      if (p->data == 0)
      {
            p->data = count;
            count++;
      }
      if (count == 14)
      {
            break;
      }
    }

    p = p->next;
}

void DestoryList(linklist p)
{
    linklist temp = p;

    for (int j = 0; j < CardNumber; j++)
    {
      temp = p;
      p = p->next;
      free(temp);
    }
}

人造人 发表于 2021-8-13 16:33:57

    linklist head = NULL;
    linklist p = NULL;

    head->next = p;

head 没有指向对象
head->next    访问 next 是错误的

人造人 发表于 2021-8-13 16:45:06

linklist CreateLinkList()
{
    // linklist head = NULL;
    linklist head = malloc(sizeof(*head));
    linklist p = NULL;

    head->next = p;

    int i, n;
    n = CardNumber;

    for (i = 0; i < n; i++)
    {
      p = (linklist)malloc(sizeof(sqlist));
      p->data = 0;
      p = p->next;
    }
    p->next = head;

    return head;
}

焦糖橙子 发表于 2021-8-13 17:04:20

人造人 发表于 2021-8-13 16:45


按照你的改啦,还是跑不出来啊
linklist head = malloc(sizeof(*head));是不是应该写成
linklist head = (linklist)malloc(sizeof(sqlist));

人造人 发表于 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));

人造人 发表于 2021-8-13 17:25:41

错误太多了

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

#define CardNumber 13

typedef struct node
{
    int data;
    struct node *next;
} sqlist, *linklist;

linklist CreateLinkList();
void Magician(linklist);
void DestoryList(linklist p);

int main(void)
{
    //linklist p;
    linklist p, q;
    int i;

    //p = CreateLinkList();
    q = p = CreateLinkList();
    Magician(p);

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

    //DestoryList(p);
    DestoryList(q);

    return 0;
}

linklist CreateLinkList()
{
    linklist head = NULL;
    //linklist p = NULL;

    //head->next = p;

    //int i, n;
    int i;
    //n = CardNumber;

    //for (i = 0; i < n; i++)
    for (i = 0; i < CardNumber; i++)
    {
      linklist p = malloc(sizeof(*p));
      p->data = 0;
      p->next = head;
      head = p;
      //p = p->next;
    }
    //p->next = head;

    return head;
}

void Magician(linklist p)
{
    //int n, count, i;
    int count, i;
    p->data = 1;
    count = 2;

    // 下面这个循环看不懂
    // 不知道你要做什么
    /*
    while (1)
    {
      for (i = 0; i < count; i++)
      {
            p = p->next;
            if (p->data != 0)
            {
                p = p->next;
                i--;
            }
      }

      if (p->data == 0)
      {
            p->data = count;
            count++;
      }
      if (count == 14)
      {
            break;
      }
    }

    p = p->next;
    */
}

void DestoryList(linklist p)
{
    //linklist temp = p;
    linklist temp;

    for (int j = 0; j < CardNumber; j++)
    {
      temp = p;
      p = p->next;
      free(temp);
    }
}

人造人 发表于 2021-8-13 17:26:42

没有掌握 C 的指针
指针的使用上基本全错

焦糖橙子 发表于 2021-8-13 17:55:59

本帖最后由 焦糖橙子 于 2021-8-13 19:51 编辑

人造人 发表于 2021-8-13 17:25
错误太多了

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

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

#define CardNumber 13

typedef struct node
{
    int data;
    struct node *next;
} sqlist, *linklist;

linklist CreateLinkList();
void Magician(linklist);
void DestoryList(linklist p);

int main(void)
{
    linklist p;
    int i;

    p = CreateLinkList();
    Magician(p);

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

    DestoryList(p);

    return 0;
}

linklist CreateLinkList()
{
    linklist head = (linklist)malloc(sizeof(sqlist));
    linklist p = head;

    int i, n;
    n = CardNumber;

    for (i = 0; i < n; i++)
    {
      p->next = (linklist)malloc(sizeof(sqlist));
      p->data = 0;
      p = p->next;
    }
    p->next = head;

    return head;
}

void Magician(linklist p)
{
    int count, i;
    p->data = 1;
    count = 2;

    while (1)
    {
      for (i = 0; i < count; i++)
      {
            p = p->next;
            if (p->data != 0)
            {
                p = p->next;
                i--;
            }
      }

      if (p->data == 0)
      {
            p->data = count;
            count++;
      }
      if (count == 14)
      {
            break;
      }
    }

    p = p->next;
}

void DestoryList(linklist p)
{
    linklist temp = p;

    for (int j = 0; j < CardNumber; j++)
    {
      temp = p;
      p = p->next;
      free(temp);
    }
}

人造人 发表于 2021-8-13 18:16:10

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

这个程序死循环

焦糖橙子 发表于 2021-8-13 19:17:43

人造人 发表于 2021-8-13 18:16
这个程序死循环

我在里面加了一个break,满足条件就出来了{:10_297:}

人造人 发表于 2021-8-13 19:37:49

焦糖橙子 发表于 2021-8-13 19:17
我在里面加了一个break,满足条件就出来了

我当然看到你写了 break
我说你的程序死循环了,是我真的运行你的程序,然后发现程序死循环了

焦糖橙子 发表于 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
页: [1]
查看完整版本: 循环链表问题