循环链表范例(约瑟夫问题)(来自:算法:C语言实现)

我们构造一个循环链表来表示排成圆圈的人.每人的链接指向圆圈内在他左边的人.整数i表示圆圈内的第i个人.在为1号构造一个节点的循环链表之后,再把2~N号插入到1号节点之后,得到一个1~N的环,并使x指向N.然后从1号开始,跳过M-1个节点把第M-1个节点的链接指向M+1号节点继续这个过程,直到剩下一个节点为止.

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <malloc.h>
using namespace std;
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int Status;

typedef struct node* link;
struct node{
    int item;
    link next;
};
int main(int argc, char *argv[])
{
    ///输入人数n,和数字m
    int i, n, m;
    scanf("%d %d", &n, &m);
    ///定义一个头指针h和一个指针p
    link h, p;
    ///将头节点h赋值
    h = (link)malloc(sizeof(struct node));
    p = h;
    h->item = 1;
    h->next = h;
    ///将2~n添加进链表
    for(i = 2; i <= n; i++)
    {
        p->next = (link)malloc(sizeof(struct node));
        p = p->next;
        p->item = i;
        p->next = h;
    }
    ///while循环结束条件p->next!=p
    while(p->next != p)
    {
        ///定义一个cnt
        int cnt = 1;
        ///循环m-1次,删除第m个节点
        while(cnt < m)
        {
            cnt++;
            p = p->next;
        }
        ///找到第m个节点,删除
        link q = p->next;
        p->next = q->next;
        ///释放节点q
        free(q);
    }
    ///链表中只剩一个元素,将该元素输出
    printf("%d\n", p->item);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42480264/article/details/81557279