鱼C论坛

 找回密码
 立即注册
查看: 2857|回复: 1

小甲鱼约瑟夫环最后留的问题

[复制链接]
发表于 2020-8-18 17:43:44 | 显示全部楼层 |阅读模式

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

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

x
问题如下:
我写的这个创建循环链表的函数,在最后main函数中生成 *P的时候 *p的地址就飘了
我很想知道这是为什么,我感觉在逻辑上我这样写循环列表创建函数应该没有问题,
本人指针,地址这一块还比较差,希望有大佬可以指点一下迷津
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

//约瑟夫环进阶版
//每个结点的结构
typedef struct Node
{
        int data;//每个参与者的序号
        int code;//每个参与者的密码
        struct Node* NEXT;
}Node;

//创建一个循环链表
Node *Man_Create(int p_number,int r_number)
{
        //产生随机种子
        srand(time(NULL));
        Node *p = NULL, *head=NULL;
        head = (Node*)malloc(sizeof(Node));
        head->data = 1;
        head->code = r_number;
        if (!head)
        {
                exit(0);
        }

        p = head;
        printf("\n生成的循环列表如下:\n");
        printf("第%d个结点的密码是:\t%d\n",head->data,head->code);
        for (int i = 1; i < p_number; i++)
        {
                p = p->NEXT;
                p = (Node*)malloc(sizeof(Node));
                if (!p)
                {
                        exit(0);
                }
                p->data = i + 1;
                p->code = rand() % r_number + 1;
                printf("第%d个结点的密码是:\t%d\n",p->data,p->code);
        }
        p->NEXT = head;
        printf("循环链表创建成功!\n");

        return head;
}

int main()
{
        //确定循环列表中结点的个数
        int man_number=0;
        printf("请输入人的个数:");
        scanf("%d",&man_number);
        //创建一个报数的上限值
        int report_number = 0;
        printf("请输入报数的上限值:");
        scanf("%d",&report_number);
        //创建一个循环列表
        Node *p = Man_Create(man_number, report_number);
        //解决约瑟夫环问题
        Node *temp = NULL;
        int m = man_number;
        while (p != p->NEXT)
        {
                for (int i = 1; i < p->code%m; i++)//调试的时候问题出现在这个地方,p的地址完全飘了找不到对应的p->code和p->data
                {
                        p = p->NEXT;
                }
                temp = p->NEXT;
                printf("%d->", temp->data);
                p->NEXT = temp->NEXT;
                free(temp);
        }
        printf("%d\n", p->data);
        printf("输出完成,约瑟夫环测试版成功!!!");

        system("pause");
        return EXIT_SUCCESS;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-23 11:37:51 | 显示全部楼层
一般head指针不动,要实现数据的传递还需要两个指针,你只用了一个

你只声明了两个指针

你只声明了两个指针

做出来的表是这样的

做出来的表是这样的

这里的p->next没有指向下一个节点,所以是乱指的

这里的p->next没有指向下一个节点,所以是乱指的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-12 09:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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