小甲鱼约瑟夫环最后留的问题
问题如下:我写的这个创建循环链表的函数,在最后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;
} 一般head指针不动,要实现数据的传递还需要两个指针,你只用了一个
页:
[1]