约瑟夫问题
//约瑟夫问题,结果为什么异常?
//输入4 2 2
//4 2 2
//   1The last dot   2   4The last dot   2   2The last dot   3Press any key to con
//tinue
#include<stdio.h>
#include<malloc.h>
typedef struct node{
    int data;
    struct node *link;
}LNode,*LinkList;//连接点类型
main()
{
    int n,m,k;
    LinkList p,r,list=NULL;
    int i;
    scanf("%d %d %d",&n,&m,&k);
    for(i=1;i<=n;i++){
        p=(LinkList)malloc(sizeof(LNode));
        p->data=i;
        if(list==NULL){
            list=p;
        }
        else{
            r->link=p;//r是p的直接前驱。
        }
        r=p;
    }
    p->link=list;//list是第一个结点的指针,建立循环链表!
    p=list;//p指向第一个结点!
    for(i=1;i<k;i++){
        r=p;
        p=p->link;
    }//p指向第k个结点,从第k个开始报数
    while(p->link!=p){
        for(i=1;i<m;i++){
            r=p;
            p=p->link;
        }//此时p是要删除的节点指针,因为这个报到了m
        r->link=p->link;//删除地址为p的节点
        printf("%d",p->data);//输出这个节点的内容
        free(p);
        p=r->link;//重新将r的直接后驱建为p
    }
    printf("The last dot is %d",p->data);
    
}
[此贴子已经被作者于2007-10-1 11:25:10编辑过]



											
	    

	
