数据结构实验报告——约瑟夫问题(循环链表)

1.实验目的

(1)熟悉上机环境,掌握上机操作方法和步骤;

(2)掌握线性表的特点、逻辑结构和物理实现;

(3)掌握单向链表的建立、插入、删除等基本操作的实现;

(4)掌握循环链表的建立、插入、删除等基本操作的实现。

  1. 实验内容

用循环链表求解约瑟夫问题。

约瑟夫问题:n 个人围成一个圆圈,首先第1个人开始,一个人一个人顺时针报数, 报到第m个人,令其出列;然后再从下一个人开始,从1顺时针报数,报到第m个人,再令其出列,,如此下去, 直到圆圈中只剩一个人时,此人即为优胜者。

例如:n=8,m=3

#include<stdio.h>  
#include<stdlib.h> 

typedef struct node
{
    int data;
    struct node *next;
}Lnode,*LinkList;

void circle(int n, int m)
{
    LinkList p = NULL, x = NULL, list = NULL;
    int i;
    for( i = 1;i <= n;i++)
    {
        p = (Lnode*)malloc(sizeof(Lnode));
        if(p == NULL)
            exit(1);
        p -> data = i;
        if(list == NULL)
            list = p;
        else
            x -> next = p;
            x = p;
    }
    p -> next = list;
    p = list;
    while(p -> next != p)
    {
        for(i = 1;i < m;i++)
        {
            x = p;
            p = p->next;
        }
        x -> next = p -> next;
        free(p);
        p = x -> next;
    }
    printf("%d",p -> data);
    free(p);
}
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    circle(n,m);
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值