作者在 2009-05-09 00:15:46 发布以下内容
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef struct node
{
int number;
int code;
struct node *next;
}lnode,*joseph;
//建立循环列表的函数;
void Creatjoseph(int n,joseph & head)
{
int i;
joseph p,s;
head=(joseph)malloc(sizeof(node));
head->next=head;
p=head;
printf("请输入节点初始密码:");
for(i=1;i<=n;i++)
{
s=(joseph)malloc(sizeof(node));
scanf("%d",&s->code);
s->number=i;
s->next=head;
p->next=s;
p=s;
}
}
//出列过程模拟的函数Process
void Process(int m,joseph head)
{
int count;
joseph p,q;
q=head;
p=head->next;
count=1;
while(head->next!=head)
if(p==head)
{
q=p;
p=p->next;
}
else if(count==m)
{
printf("%d",p->number);
q->next=p->next;
m=p->code;
free(p);
p=q->next;
count=1;
}
else
{
count++;q=p;p=p->next;
}
printf("\n");
}
void main()
{
int m,n;
joseph head;
printf("请输入节点的数目:");
scanf("%d",&n);
Creatjoseph(n,head);
printf("请输入joseph环的初始密码M(m是大于零的整数:");
scanf("%d",&m);
printf("joseph出列过程为:\n");
Process(m,head);
getch();
}
//程序目的:用循环链表模拟Joseph环问题;
//函数void creatjoseph(int n,joseph &head);
//目的:建立循环链表;
//参数n传递joseph环的节点数目;参数head返回joseph环的头节点;
//函数void process(int m,joseph head)
//函数目的:处理出列过程;
//参数m传递初始密码;参数head传递joseph环的头节点;
//测试数据:n=6,m=4;出环过程:425136; */
//1:需要按两次回车。考虑到M>=0 1 当输入接点密码大于人数时候 程序退出。需要区分函数的大小写
//为了完善程序 加入了如下功能 :当输入结点个数等于总人数N时,程序自动换行并提示输入初始密码。
#include <malloc.h>
#include <conio.h>
typedef struct node
{
int number;
int code;
struct node *next;
}lnode,*joseph;
//建立循环列表的函数;
void Creatjoseph(int n,joseph & head)
{
int i;
joseph p,s;
head=(joseph)malloc(sizeof(node));
head->next=head;
p=head;
printf("请输入节点初始密码:");
for(i=1;i<=n;i++)
{
s=(joseph)malloc(sizeof(node));
scanf("%d",&s->code);
s->number=i;
s->next=head;
p->next=s;
p=s;
}
}
//出列过程模拟的函数Process
void Process(int m,joseph head)
{
int count;
joseph p,q;
q=head;
p=head->next;
count=1;
while(head->next!=head)
if(p==head)
{
q=p;
p=p->next;
}
else if(count==m)
{
printf("%d",p->number);
q->next=p->next;
m=p->code;
free(p);
p=q->next;
count=1;
}
else
{
count++;q=p;p=p->next;
}
printf("\n");
}
void main()
{
int m,n;
joseph head;
printf("请输入节点的数目:");
scanf("%d",&n);
Creatjoseph(n,head);
printf("请输入joseph环的初始密码M(m是大于零的整数:");
scanf("%d",&m);
printf("joseph出列过程为:\n");
Process(m,head);
getch();
}
//程序目的:用循环链表模拟Joseph环问题;
//函数void creatjoseph(int n,joseph &head);
//目的:建立循环链表;
//参数n传递joseph环的节点数目;参数head返回joseph环的头节点;
//函数void process(int m,joseph head)
//函数目的:处理出列过程;
//参数m传递初始密码;参数head传递joseph环的头节点;
//测试数据:n=6,m=4;出环过程:425136; */
//1:需要按两次回车。考虑到M>=0 1 当输入接点密码大于人数时候 程序退出。需要区分函数的大小写
//为了完善程序 加入了如下功能 :当输入结点个数等于总人数N时,程序自动换行并提示输入初始密码。