数据结构课设-约瑟夫换C语言实现

我在大二上学期期末时候写的,大概2014年1月2号左右。我写在博客里一是为我以后复习所用,二是希望对需要的人有所帮助。

问题描述:

约瑟夫换是一个数学的应用问题:已知n个人(以编号1,2,3···n分别表示)围坐在一张桌子周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依次规律重复下去,直到圆桌周围的人全部出列。按照出列的顺序输出各个人的编号。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node{
    int num;
    struct Node *next;
}Node,*LinkList;
/*构造人链表*/
void InitRing(int n,LinkList &R)
{
    LinkList p,q;
    p=R;
    for(int i=1;i<n;i++)
    {
        q=(LinkList)malloc(sizeof(Node));
        q->num=i;
        p->next=q;
        p=q;
    }
    R->num=n;
    p->next=R;
    R=R->next;
    printf("构造成功!\n\n");
}
/*遍历*/
void Display(int n,int k,LinkList &R)
{
    LinkList p;
    p=R;
    int j=0;
    for(int i=0;i<k-1;i++)
        p=p->next;
    while(j<n-1)
    {
        printf("%d-->",p->num);
        p=p->next;
        j++;
    }
    printf("%d\n",p->num);
    printf("遍历完毕!\n\n");
}
/*把数到的人出队列*/
void DeleteDeath(int n,int m,int k,LinkList &R)
{
    LinkList p,q;
    p=R;
    for(int i=0;i<k-2;i++)
        p=p->next;
    for(int j=0;j<n;j++)
    {
        for(int k=0;k<m-1;k++)
            p=p->next;
        printf("%d  ",p->next->num);
        q=p->next;
        p->next=q->next;
        free(q);
    }
    printf("\n所有人按序号出队列顺序一输出完毕!\n\n");
}
//退出模块
void Tuichu()
{
    printf("谢谢使用!\n");
}
int main()
{
    LinkList R;
    R=(LinkList)malloc(sizeof(Node));
    R->next=NULL;
    int n,m,k;
    printf("请输入总人数:");
    scanf("%d",&n);
    if(n<=0)
    {
        printf("输入有误,请输入正确人数数字!\n");
        exit(0);
    }
    printf("请输入开始报数人的编号:");
    scanf("%d",&k);
    if(k<=0)
    {
        printf("输入有误,请输入正确数字!\n");
        exit(0);
    }
    printf("请输入分隔的数:");
    scanf("%d",&m);
    if(m<=0)
    {
        printf("输入有误,请输入正确数字!\n");
        exit(0);
    }
    while(1)
    {
        printf("-------------------         主菜单         -------------\n");
        printf("---构造所有人的循环链表     请输入:   1       ----------\n");
        printf("---输出开始遍历的链顺序     请输入:   2       ----------\n");
        printf("---输出所有人出队列顺序     请输入:   3       ----------\n");
        printf("---退出                     请输入:   0       ----------\n");
        int choice;
        printf("请输入您的选择:");
        scanf("%d",&choice);
        if(choice>3||choice<0)
        {
            printf("请输入0~3之间的数,请重新输入!\n");
            continue;
        }
        switch(choice)
        {
        case 1:        InitRing(n,R);
            break;
        case 2:        Display(n,k,R);
            break;
        case 3:        DeleteDeath(n,m,k,R);
            break;
        case 0:        Tuichu();
            exit(0);
        }
    }
    return 0;
}



6.测试结果

6.1输入部分用户界面


图6.1输入部分用户界面

 

6.2生成部分用户界面


图6.2 生成部分用户界面

 

6.3遍历部分用户界面



图6.3 遍历部分用户界面

 

6.4输出部分用户界面


图6.4 输出部分用户界面

 

6.5退出部分用户界面


图6.5 退出部分用户界面



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值