循环链表实现约瑟夫问题

来源:互联网 发布:mac股票软件 编辑:程序博客网 时间:2024/05/01 18:31
#include<stdio.h>#include<stdlib.h>typedef struct node{    int num;    struct node *next;} data;//自定义结构体另一个名字int main(){    int i,j,n;    int s=1;//从第几个开始数    int m=30;//总人数    data *p,*r,*head,*q ;    head=(data *)malloc(sizeof(data));//头结点    p=head;    printf("第几个人将会被扔向大海:\n");    scanf("%d",&n);//谁被扔向大海    for(i=1; i<=m; i++)    {        r=p;        p=(data *)malloc(sizeof(data));        r->next=p;        p->num=i;    }    p->next=head->next;//将最后一个与第一个连接起来,不是与头结点连接    p=p->next;//p指向第一个节点    j=1;    while(j<s)//控制p首先指向谁,即从第几个人开始数    {        p=p->next;        j++;    }    printf("被扔向大海的是:\n");    do    {        for(i=1; i<n-1; i++)//由for循环控制九次一循环,由循环链表移动        {            p=p->next;//for循环结束,p指向第八个节点        }        q=p->next;//q指向第九个节点        printf("%d   ",q->num);        p->next=q->next;//将第八个节点与第10个节点连接        free(q);//删除第八个节点        p=p->next;//p指向第10个节点        m--;//总数减一,控制循环15次,扔15人    }    while(m>15);    printf("\n\n\n我的心血!\n");    return 0;}

0 0