鱼C论坛

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

[已解决]循环链表问题

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

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

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

x
魔术师发牌,第n张牌空n个位置,假定一共13张牌
编译器没报错,可能是循环写错了?
看看有什么地方错了?
#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 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);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

    head->next = p;

head 没有指向对象
head->next    访问 next 是错误的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

按照你的改啦,还是跑不出来啊
linklist head = malloc(sizeof(*head));是不是应该写成
linklist head = (linklist)malloc(sizeof(sqlist));
想知道小甲鱼最近在做啥?请访问 -> 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));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-13 17:26:42 | 显示全部楼层
没有掌握 C 的指针
指针的使用上基本全错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


我重新修改了一下CreateLinkList函数,已经输出成功了,
那个while循环是为了判断  当前位置是否有牌
又去补了一遍结构体指针
#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);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个程序死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我在里面加了一个break,满足条件就出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我当然看到你写了 break
我说你的程序死循环了,是我真的运行你的程序,然后发现程序死循环了
GIF.gif
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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