约瑟夫环
#include "stdio.h "
#define N 7
typedef struct node
{
int flag;
int secret;
struct node *next;
} linklist;
linklist *creat(linklist *head);
main()
{
linklist *head,*p,*q;
int a[N],inital,i=1,m=0;
head=(linklist*)malloc(sizeof(linklist));
head=creat(head);
printf( "\n Please input the inital number : ");
scanf( "%d ",&inital);
p=head-> next;
while(m <N)
{
q=p;
p=p-> next;
i++;
if(i==inital)
{
i=1;
inital=p-> secret;
a[m++]=p-> flag;
q-> next=p-> next;
q=p;
p=p-> next;
free(q);
}
}
}
linklist *creat(linklist *head)
{
int secret1,i;
linklist *s,*r;
i=1;
head=(linklist*)malloc(sizeof(linklist));
r=head;
printf( "\n Please input the secret and end with pressing enter key\n ");
while(i <=N)
{
printf( "\nNumber %d: ",i);
scanf( "%d ",&secret1);
s=(linklist*)malloc(sizeof(linklist));
s-> flag=i;
s-> secret=secret1;
r-> next=s;
r=s;
i++;
}
r-> next=head-> next;
return head;
}
程序大致是这么运行的,用链表模拟出一个环,linklist-> flag 存的是顺序,linklist-> secret存的密码,最后打印出出列顺序。但运行后发现打印出的好像是地址,不知是哪里出了问题,希望高手出手相助。
[解决办法]
没看到打印出列顺序的语句
[解决办法]
既然是环,为什么还要一个头结点啊
另外这里:
if(i==inital)
{
i=1;
inital=p-> secret;
a[m++]=p-> flag;
q-> next=p-> next; //摘链
q=p; //q已经指向了被摘掉的链后的那个结点
p=p-> next; //p也指向了q的后继
free(q); //这里还free(q)???那摘掉的那个结点没被free,反而把好的结点free了
}
改一下:
q-> next=p-> next; //摘链
free(p); //释放被摘掉的结点
p=q-> next; //p再次就位.
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#define N 7
typedef struct node
{
int flag;
int secret;
struct node *next;
} linklist;
linklist *creat(int num);//linklist *head
int main()
{
linklist *head,*p,*q;
int a[N],inital,i=1,m=1;//
// head=(linklist*)malloc(sizeof(linklist));
head=creat(N);//head
printf( "\n Please input the inital number : ");
scanf( "%d ",&inital);
p=head;//-> next;
while(m <N)
{
q=p;
p=p-> next;
i++;
if(i==inital)
{
i=1;
inital=p-> secret;
a[m++]=p-> flag;
q-> next=p-> next;
// q=p;
printf( "%d\n ",p-> flag);
free(p);
p=q-> next;
}
}
printf( "%d\n ",p-> flag);
getchar();
return 0;
}
linklist *creat(int num)//linklist *head
{
int secret1,i;
linklist *s,*r,*head;
i=1;
//head=(linklist*)malloc(sizeof(linklist));
//r=head;
printf( "\n Please input the secret and end with pressing enter key\n ");
while(i <=num)
{
printf( "\nNumber %d: ",i);
scanf( "%d ",&secret1);
s=(linklist*)malloc(sizeof(linklist));
s-> flag=i;
s-> secret=secret1;
if (i == 1) {
head = s;
r = s;
} else {
r-> next = s;
r = s;
}
i++;
}
r-> next=head;
return head;
}