joseph环

作者在 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时,程序自动换行并提示输入初始密码。




实例 | 阅读 4436 次
文章评论,共0条
游客请输入验证码
浏览1967086次