链表解决约瑟夫环问题

时间:2022-11-15 11:27:52

现在用链表解决约瑟夫环问题,链表与数组的区别在于,链表的出列是删除结点,而数组并没有真正删除元素,只是标记为不存在。

上代码:

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

#define MAX 10
typedef struct node V_NODE;
struct node{
int id;
struct node *next;
};

V_NODE *create_link(int n)
{
V_NODE *head = NULL;
V_NODE *p = NULL;
head = p =malloc(sizeof(V_NODE));
if(p == NULL)
{
perror("malloc");
exit(1);
}
p->id = 1;
p->next = NULL;
int i =0;
for(i = 1;i<n;i++)
{
p->next= malloc(sizeof(V_NODE));
if(p->next== NULL)
{
perror("malloc");
exit(1);
}
p->next->id = i+1;
p->next->next= NULL;
p = p->next;
}
p->next= head;

return p;
}
void print_link(V_NODE *head,int n)
{
int i =0;
for(i=0;i<n;i++)
{
printf("%5d",head->id);
head = head->next;
}
printf("\n");
}
void circle_game(V_NODE *rear)
{
V_NODE *head = rear->next;
V_NODE *p = head;
int counter = 0;
int interval = 4;

while(p->next!=p)
{
counter++;
if(counter==interval)
{
counter = 0;
printf("%8d(out)\n",p->id);
rear->next = p->next;
free(p);
p = rear->next;
}
else
{
printf("%8d",p->id);
p=p->next;
rear=rear->next;
}
}
printf("%8d left!\n",p->id);
}
int main(void)
{
V_NODE *rear = NULL;
int n = 10;

rear = create_link(n);
print_link(rear->next,n);
circle_game(rear);

return 0;
}



链表解决约瑟夫环问题