您的位置:首页 > 编程语言 > C语言/C++

xcode-C语言出接触_约瑟夫环_循环链表

2014-10-20 18:56 323 查看
要求..

约瑟夫环问题的具体描述是:设有编号为1,2,......,n的
n(n>0)个人围成一个圈,从第一个人开始报数,报到m
时停止报数,报m
的人出圈,再从他的下一个人起重新报数,报到m
时停止报数,报m
的出圈,......,如此下去,知道只剩下一人为止。当任意给定n
和m
后,设计算法求n
个人出圈的次序。 


#import <Foundation/Foundation.h>
struct node{
    int data;
    struct node * next;
};
struct node  *head = NULL,*new,*end,*p;// new 为新建节点, end为尾节点,head 为头结点
int main(int argc, const char * argv[]) {
    
    int n = 0;
    int m = 0;
    printf("请输入n的值:\n");
    scanf("%d",&n);
    printf("请输入m的值:\n");
    scanf("%d",&m);
    for(int i = 1; i < n+1; i++){
        new = (struct node *)malloc(sizeof(struct node));
        new->data=i;
        new -> next = NULL;
        if (i == 1) {
            head = new;
            end = new;
        }else{
            end->next = new;
            end = new;
        }
    }
    end->next=head;
    
    //定义 p 为一直寻找m个数据后的指针,开始的时候,为头指针
    p = head;
    int num=1;//表示是否为第一次剔除人, 如果num为1 则第一次剔出人,如果等于2 则不是第一次剔出人
    int x =1;    //记录第几次 被剔除, 没有什么实际意义
    while (n > 1) {
        if(num == 1){
            for (int i = 1; i< m-1; i++) {
                p = p->next;
                
            }
            num= 2;
        }else{
            for (int i = 0; i< m-1; i++) {
                p = p->next;
                
            }
        }
        printf("%d  %d\n",p->next->data,x);
        p->next = p->next->next;
        x++;
        
        n--;
        
    }
    printf("最后输出的是:%d\n",p->next->data);
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 xcode 约瑟夫环