约瑟夫环的相关问题以及void修饰的函数如何用指针返回链表地址 问题
我自己写的程序有好多问题 虽然编译没事 可是我调试发现 我Creat完链表后 他没有将链表的地址返回 请大家帮忙看一下 谢谢了#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct
{
int num;
int passwd;
}data;
typedef struct LNode
{
data Data;
struct LNode *next;
}LNode,*LinkList; //LNode == *LinkList == struct LNode
void CreatList_L(LinkList *L,int n)
{
int i = 1;
LNode *p,*q,*head;
head = p = (LinkList)malloc(sizeof(LNode) ); //Head Node
for(i = 1 ; i <= n ; i++)
{
p->Data.num = i;
printf("Put int the passwd :");
scanf("%d",&p->Data.passwd);
q = (LinkList)malloc(sizeof(LNode) );
p->next = q;
p = p->next;
}
p->next = head; //Circle Link
}
void Print_L(LinkList L) //Print the circle link Use to debug
{
LNode *p;
p = L;
while(p->next != L)
{
printf("%d : %d\n",p->Data.num,p->Data.passwd);
p = p->next;
}
}
int Delete_L(LinkList *L,int m) //@param is m , return is next m.
{
LNode *p,*q;
int i = 1,m_new;
p = L;
while(i != m - 1)
{
p = p->next;
i++;
}
q = p->next;
p->next = q->next;
printf("%d ",q->Data.num);
m_new = q->Data.passwd;
free(q);
return m_new;
}
int GetLen_L(LinkList L)
{
LNode *p;
int len = 1;
p = L;
while(p->next != L)
{
len++;
}
return len;
}
void main()
{
int n,m,temp;
LinkList *L;
printf("Put in the n : ");
scanf("%d",&n);
CreatList_L(L,n); //此处L的地址为啥没被带回?
Print_L(L); //因为没有L的地址 所以根本无法打印出链表
printf("Put in the m : ");
scanf("%d",&m);
while(GetLen_L(L) > 0)
{
temp = Delete_L(L,m);
m = temp;
}
}
还有就是 请问我在定义函数时候 那个*L什么时候加*什么时候不加*
问题描述:
约瑟夫(Joseph)问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码〈正整数〉,一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
基本要求:
利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。
实现提示:
程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码(小于30)。
选作内容:
在顺序存储结构上实现上述问题的操作。
Input
输入包括两行,第一行包括报数上限值m和人数n,第二行为n个人的密码,所有数据之间由空格分隔。
Output
输出一行,共n个整数,表示各编号人的出列顺序。各数之间由空格分隔。
Sample Input
20 7
3 1 7 2 4 8 4
Sample Output
6 1 4 7 2 3 5