C语言算法实现约瑟夫环2

//约瑟夫环
#include<stdio.h>
#include<malloc.h>

typedef struct node
{
int ID;//编号
int password;//密码
struct node *next;//指向下一个节点
}ysfh;

ysfh *write(ysfh *head,int n)//创建循环链表
{
int mima;
ysfh *p,*last;
int i=1;
last=head;
printf("请依次,输入%d密码(正整数):",n);

while(i<=n)
{
   scanf("%d",&mima);
   p=(ysfh *)malloc(sizeof(ysfh));
   p->ID=i;
   p->password=mima;
         if(head==NULL)
   {
    head=p;
      last = p;
   }
   else
   { last->next = p; last = p;}
   i++;
}
last->next=head;//所有结点创建完毕,把尾指针与头指针相连
return (head);
}

void read(ysfh *head,int n,int m)
{
ysfh *p,*q;
int k,i,h=m;//h的增加是为了处理起始数为1(即m=1)的情况
p=head;
for(i=1;i<=n;i++)
{
   for(k=1;k<m;k++)
   {
    if(k==m-1)
    q=p;// 让q指向p的上一个节点
      p=p->next;
   }
   while(h==1)
   {
    q=head;
    p=p->next;
    h=0;//改变h的值是使不为1
   }
printf("%4d",p->ID);
m=p->password;//使m等于要删除节点的密码
p=p->next;
q->next=p;
}
}

void main()
{
ysfh *head=0;
int start,number;
char ch[5];
printf("请输入人数:");
scanf("%d",&number);
head=write(head,number);
   
gets(ch);//清除多输入的密码
    printf("请输入起始数:");
scanf("%d",&start);
    printf("出列顺序:");
read(head,number,start);
printf(" n");

}

posted @ 2009-03-28 00:11  glc400  阅读(175)  评论(0编辑  收藏  举报