约瑟夫环问题(C语言)

单链表实现约瑟夫环问题

约瑟夫环

这里建议使用循环单链表

代码实现(c语言)

#include<stdio.h>
#include<stdlib.h>
typedef struct node{ 
	int data; 
	struct node *next; 
}Node;
void ysflb(int n,int k){//总共n,k出去
 //创建链表
 Node *head = NULL,*p = NULL,*r = NULL,*next = NULL;
 head = (Node *)malloc(sizeof(Node)); //开空间
 if(head == NULL){ //判断head是否创建成功,一般都成功
 	printf("Failed");
 	return;
 }
 
 head->data = 1;
 head->next = NULL; //这是第一个节点
 p = head;//p和head是同一个节点(指向)
 
 //循环,尾插
 for(int i = 2;i <= n; i++){
 	r = (Node *)malloc(sizeof(Node));
 	r->data = i;
 	r->next = NULL;
 	p->next = r;//p的next指向r,即将r连接再p的后面,一二节点连接完成。
	p = r;//将p向后移动一位,从第一个节点到了第二个节点 
 } 
 
 p->next = head; //让p的next指回去第一个节点
 p = head; //p再指向第一个节点
 //循环链表创建完成 
 
 while(p->next != p){//判断是否只剩一个元素
 	for(int i = 1;i < k;i++){
 	r = p; //r就是p的前一个节点,一会p会向后移动 
 	p = p->next;//p向后移动一位,p就是要出去的节点 
	 }
 	printf("%d\t",p->data); 
 	//删除p 
 //越过当前节点,将前一个节点于当前节点的后一个相连
 r->next = p->next;//前一个节点的next指向后一个节点的next
 p = p->next;//p向移一个节点(p成为当前节点的后一个节点)
 }
 printf("最后剩余:"); 
 printf("%d",p->data); 
}
int main(){
	ysflb(10,3);
	return 0;
} 

作者:T,a,o原文地址:https://www.cnblogs.com/wht-de-bk/p/16684336.html

%s 个评论

要回复文章请先登录注册