c语言链表实现--约瑟夫环
之前我用数组实现过,具体的问题细节我就不细说了,有兴趣的朋友可以看一下,单链表的具体实现操作我也不讲了,之前博文有,这里只讲单链表的实现。
单链表链接:https://blog.****.net/Victor_psl/article/details/104125186
约瑟夫环链接:https://blog.****.net/Victor_psl/article/details/103160610
注意的事项:链表成环
改进的地方:
1.从第三个人开始游戏,这里也可以设置成自定义输入
2.自定义计数循环
3.打印最后一个位置
#include <stdio.h>
#include<malloc.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}Node, *LinkList; //循环单链表
Node* IntCLinkList()
{
int n, i;
LinkList head, tail, temp;
printf("输入n:");
scanf("%d", &n);
tail = head = NULL;
for (i = 1; i <= n; i++)
{
temp = (Node*)malloc(sizeof(Node));//开辟新节点
temp->data = i;//给节点的值域赋值成i的值
if (head == NULL)//空链表
{
head = temp;
}
else
{
tail->next = temp;
}
tail = temp; //尾指针指向新的节点;
}
tail->next = head; //指向头,形成环
return head;
}
int main()
{
LinkList q = NULL;
LinkList p = IntCLinkList();
int m;//循环变量
int i = 1;//起始位置
int j = 3;//开始遍历的位置printf("请输入开始循环的m值为:");
scanf("%d", &m);
printf("出队列的位置为: ");
while (p->next != p)
{
while (j > 1)//指针走到开始遍历位置
{
q = p;
p = p->next;
--j;
}
q = p;
p = p->next;
i++;
if (i == m)
{
printf(" %d ", p->data);
q->next = p->next;
free(p);
p = q->next;
i = 1; //重新计数
}
}
printf("\n");
printf("最后一个位置为:%d", p->data);
free(p);
return 0;
}
运行结果:我这里n=30, m=7 最后的位置为25