#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct Node
{
union
{
int data;
int len;
};
struct Node *next;
}Node,*LinkedList;
LinkedList create_list()
{
LinkedList header=(LinkedList)malloc(sizeof(Node));
if(header!=NULL)
{
header->len=0;
header->next=header;
}
return header;
}
void printf_list(LinkedList L)
{
LinkedList p=L;
if(L==NULL)
{
return;
}
//如果链表有效,循环p指向下一个结点,直到p指向头结点为止
while((p=p->next)!=L) //循环遍历
{
printf("%d\t",p->data);
}
printf("\n");
}
int insert_back(LinkedList L,int e)
{
if(L==NULL)
{
return 0;
}
//循环n次(n表示链表长度)找到最后一个结点
LinkedList pt=L;
for(int i=0;i<L->len;i++)
{
pt=pt->next;
}
//创建新结点并插入到最后
LinkedList p=(LinkedList)malloc(sizeof(Node));
if(p==NULL)
{
printf("分配新结点内存失败\n");
return 0;
}
//给新结点赋值数据域
p->data=e;
p->next=L;
pt->next=p;
L->len++;
return 1;
}
void josepho(LinkedList L,int k)
{
LinkedList pt=L,q;
if(L==NULL)
{
//链表空
return;
}
//n个人循环n次,n等于链表长度
int n=L->len;
for(int i=0;i<n;i++)
{
//循环k-1次找到要删除的前一个结点
for(int j=0;j<k-1;j++)
{
pt=pt->next;
//如果找到的是头结点,绕过 (但循环次数加1)
if(pt==L)
{
j--;
}
}
// q是要删除的结点
q=pt->next;
// 如果删除的结点q是头结点,绕过
if(q==L)
{
q=L->next;
}
//删除
printf("%d\t",q->data);
pt->next=q->next;
free(q);
L->len--;
}
}
int main()
{
LinkedList L=create_list();
int i=1,e;
//输入0或负数结束输入
printf("请输入第%d个人员的编号:",i++);
scanf("%d",&e);
while(e>0)
{
insert_back(L,e);
printf("请输入第%d个人员的编号:",i++);
scanf("%d",&e);
}
printf("\n参与游戏的人员编号:\n");
printf_list(L);
//输入k值,并调用约瑟夫环函数计算出圈次序
int k;
printf("请输入数到几出列:") ;
scanf("%d",&k);
printf("\n依次出圈的人员编号是:\n");
josepho(L,k);
return 0;
}
作业9.16
于 2022-09-16 18:24:18 首次发布