首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

约瑟夫环解决思路

2012-03-24 
约瑟夫环#includestdio.h #defineN7typedefstructnode{intflagintsecretstructnode*next}linklistli

约瑟夫环
#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;
}

热点排行