c++ 循环链表–约瑟夫问题
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct people
{
int numb;
struct people *next;
}PER;
void circle_link_creat_head(PER **p_head,PER *p_new)
{
PER *p_mov = *p_head;
if(*p_head == NULL)
{
*p_head = p_new;
p_new->next = *p_head;
}
else
{
while(p_mov->next != *p_head)
{
p_mov = p_mov->next;
}
p_mov->next = p_new;
p_new->next = *p_head;
}
}
void circle_link_print(PER *head)
{
PER *pb;
pb = head;
do
{
cout << pb->numb <<endl;
pb = pb->next;
}while(pb != head);
}
void circle_link_delete(PER **head,int n)
{
PER *pm,*pf;
pm= *head;
do
{
for(int i=1;i<n;i++)
{
pf = pm;
pm = pm->next;
}
pf->next = pm->next;
pm = pm->next;
}while (pm->next != pm);
circle_link_print(pm);
}
int main()
{
PER *head = NULL;
PER *p_new = NULL;
cout<<"请输入人数"<<endl;
int m,n;
cin>>m;
for(int i=1;i<m+1;i++)
{
p_new = (PER*)malloc(sizeof (PER));
p_new->numb = i;
circle_link_creat_head(&head,p_new);
}
circle_link_print(head);
cout<<"请输入第几个人出去"<<endl;
cin>>n;
circle_link_delete(&head,n);
free(p_new)
}
在这里插入代码片