general888888 发表于 2020-8-18 17:43:44

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

问题如下:
我写的这个创建循环链表的函数,在最后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;
}

长大1/2 发表于 2020-8-23 11:37:51

一般head指针不动,要实现数据的传递还需要两个指针,你只用了一个
页: [1]
查看完整版本: 小甲鱼约瑟夫环最后留的问题