题目:
使用循环链表实现约瑟夫环,提前给定一组编号分别是:4,7,5,9,3,2,6,1,8。报数初始值由用户输入。
约瑟夫环:n个人围成一圈,每个人都有一个互不相同的密码,该密码是一个整数值,选择一个人作为起点,然后顺时针从1到K(K为起点人手中的密码值)数数。数到K的人退出圈子,从下一个人开始继续从1到J(J为刚退出圈子的人的密码)数数,疏导J的人退出圈子。一直重复上面的过程知道最后一个人。
源代码:
方法1:
#include <stdio.h>
#include <stdlib.h>
#define MAX 9
struct DATA
{
int num;
};
struct LNODE
{
struct DATA data;
struct LNODE * next;
};
struct PHEAD
{
struct LNODE * head;
struct LNODE * tail;
int node_max;
};
void initialization_head(struct PHEAD * head_pointer);
void node_create(struct PHEAD * head_pointer,int data);
int joseph_ring(struct PHEAD * head_pointer,int num);
void node_delete(struct LNODE * head_pointer);
void print(struct PHEAD * head_pointer);
int main()
{
struct PHEAD head_pointer;
int node_element[MAX] = {4,7,5,9,3,2,6,1,8};
initialization_head(&head_pointer);
for(int i = 0;i < MAX;i++)
{
node_create(&head_pointer,node_element[i]);
}
print(&head_pointer);
return 0;
}
void initialization_head(struct PHEAD * head_pointer)
{
if(head_pointer->head != NULL)
{
head_pointer->head = NULL;
head_pointer->node_max=0;
}
}
void node_create(struct PHEAD * head_pointer,int data)
{
struct LNODE * p = (struct LNODE *) malloc (sizeof(struct LNODE));
p->data.num = data;
if(head_pointer->head == NULL)
{
head_pointer->head = head_pointer->tail =p;
}
else
{
head_pointer->tail->next = p;
head_pointer->tail = p;
}
p->next = head_pointer->head;
head_pointer->node_max++;
}
void print(struct PHEAD * head_pointer)
{
struct PHEAD * tmp_head = head_pointer;
int joseph_return_number = 0;
printf("请输入第一个计数值: ");
scanf("%d",&joseph_return_number);
printf("输出的队列为: ");
while(tmp_head->node_max--)
{
joseph_return_number = joseph_ring(tmp_head,joseph_return_number);
printf("%d ",joseph_return_number);
}
}
int joseph_ring(struct PHEAD * head_pointer,int num)
{
int tmp;
struct LNODE * head_pointer_parent = head_pointer->head;
for(int i = 0;i < num-1;i++)
{
head_pointer_parent = head_pointer->head;
head_pointer->head = head_pointer->head->next;
}
tmp = head_pointer->head->data.num;
node_delete(head_pointer_parent);
head_pointer->head = head_pointer_parent->next;
(
head_pointer->head = head_pointer->head->next;
head_pointer->tail = head_pointer->head;
)
return tmp;
}
void node_delete(struct LNODE * head_pointer)
{
struct LNODE * tmp_pointer = head_pointer->next;
head_pointer->next = head_pointer->next->next;
free(tmp_pointer);
}
方法2:
#include <stdio.h>
#include <stdlib.h>
#define MAX 9
struct DATA
{
int num;
};
struct LNODE
{
struct DATA data;
struct LNODE * next;
};
struct PHEAD
{
struct LNODE * head;
struct LNODE * tail;
int node_max;
};
void initialization_head(struct PHEAD * head_pointer);
void node_create(struct PHEAD * head_pointer,int data);
int joseph_ring(struct PHEAD * head_pointer,int num);
void node_delete(struct LNODE * head_pointer);
void print(struct PHEAD * head_pointer);
int main()
{
struct PHEAD head_pointer;
int node_element[MAX] = {4,7,5,9,3,2,6,1,8};
initialization_head(&head_pointer);
for(int i = 0;i < MAX;i++)
{
node_create(&head_pointer,node_element[i]);
}
print(&head_pointer);
return 0;
}
void initialization_head(struct PHEAD * head_pointer)
{
if(head_pointer->head != NULL)
{
head_pointer->head = NULL;
head_pointer->node_max=0;
}
}
void node_create(struct PHEAD * head_pointer,int data)
{
struct LNODE * p = (struct LNODE *) malloc (sizeof(struct LNODE));
p->data.num = data;
if(head_pointer->head == NULL)
{
head_pointer->head = head_pointer->tail =p;
}
else
{
head_pointer->tail->next = p;
head_pointer->tail = p;
}
p->next = head_pointer->head;
head_pointer->node_max++;
}
void print(struct PHEAD * head_pointer)
{
struct PHEAD * tmp_head = head_pointer;
int joseph_return_number = 0;
printf("请输入第一个计数值: ");
scanf("%d",&joseph_return_number);
printf("输出的队列为: ");
while(tmp_head->node_max--)
{
joseph_return_number = joseph_ring(tmp_head,joseph_return_number);
printf("%d ",joseph_return_number);
}
}
int joseph_ring(struct PHEAD * head_pointer,int num)
{
int tmp;
struct LNODE * head_pointer_parent = head_pointer->head;
for(int i = 0;i < num-1;i++)
{
head_pointer_parent = head_pointer->head;
head_pointer->head = head_pointer->head->next;
}
tmp = head_pointer->head->data.num;
node_delete(head_pointer_parent);
head_pointer->head = head_pointer_parent->next;
(
head_pointer->head = head_pointer->head->next;
head_pointer->tail = head_pointer->head;
)
return tmp;
}
void node_delete(struct LNODE * head_pointer)
{
struct LNODE * tmp_pointer = head_pointer->next;
head_pointer->next = head_pointer->next->next;
free(tmp_pointer);
}
方法3:
#include <stdio.h>
#include <stdlib.h>
#define MAX 9
struct DATA
{
int num;
};
struct LNODE
{
struct DATA data;
struct LNODE * next;
};
struct PHEAD
{
struct LNODE * first;
struct LNODE * tail;
};
void initialization_head(struct PHEAD * head_pointer);
void node_create(struct PHEAD * head_pointer,int data);
int joseph_ring(struct LNODE * p_move,int num,int max);
int main()
{
struct PHEAD head_pointer;
int node_element[MAX] = {4,7,5,9,3,2,6,1,8};
int num;
initialization_head(&head_pointer);
for(int i = 0;i < MAX;i++)
{
node_create(&head_pointer,node_element[i]);
}
printf("请输入第一个计数值: ");
scanf("%d",&num);
joseph_ring(head_pointer.tail,num,MAX);
return 0;
}
void initialization_head(struct PHEAD * head_pointer)
{
head_pointer->first = (struct LNODE *) malloc (sizeof(struct LNODE));
head_pointer->first->next = NULL;
}
void node_create(struct PHEAD * head_pointer,int data)
{
struct LNODE * p = (struct LNODE *) malloc (sizeof(struct LNODE));
p->data.num = data;
if(head_pointer->first->next == NULL)
{
head_pointer->first->next = head_pointer->tail = p;
}
else
{
head_pointer->tail->next = p;
head_pointer->tail = p;
}
head_pointer->tail->next = head_pointer->first->next;
}
int joseph_ring(struct LNODE * p_move,int num,int max)
{
struct LNODE * p_delete = p_move;
int i=0;
if(max == 0) exit(1);
num %= max;
if(num == 0) num=max;
for(int i = 1;i <= num;i++)
{
p_move = p_delete;
p_delete = p_delete->next;
}
p_move->next = p_delete->next;
i = p_delete->data.num;
printf("%d ",i);
free(p_delete);
joseph_ring(p_move,i,max-1);
}
演示效果:
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈