head.h
#ifndef __HEAD_H_
#define __HEAD_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datatype;
typedef struct Node
{
//数据域
union{
int len;//头结点的数据域:链表长度
datatype data;//普通结点的数据域
};
//指针域
struct Node *next;
}*looplink;
looplink create_head();
looplink create_node();
int insert_head(looplink l,datatype e);
void output(looplink l);
int insert_rear(looplink l,datatype e);
int delete_head(looplink l);
int delete_rear(looplink l);
void josepho(looplink l,int a,int b);
#endif
main.c
#include"head.h"
int main (int argc, const char *argv[])
{
/*
looplink l= create_head();
//头插在头结点后面插入
int n;
datatype e;
printf("请输入插入的个数");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入插入的值");
scanf(" %c",&e);//注意吸收垃圾字符
insert_head(l,e);
}
output(l);
//尾插
printf("请输入插入的个数");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入插入的值");
scanf(" %c",&e);//注意吸收垃圾字符
insert_rear(l,e);
}
output(l);
//头删
printf("头删后\n");
delete_head(l);
output(l);
//尾删后
printf("尾删后\n");
delete_rear(l);
output(l);
*/
//先把链表里面写8个值
looplink l=create_head();
int a;
int b;
char e='1';
printf("请输入n个值");
scanf("%d",&a);
printf("请输入要出圈的m值");
scanf("%d",&b);
for(int i=1;i<=a;i++)
{
insert_rear(l,e);
e++;
}
output(l);
printf("出圈顺序\n");
josepho(l,a,b);
return 0;
}
text.c
#include"head.h"
/*
* function: 创建头结点
* @param [ in]
* @param [out] 无
* @return 成功返回地址失败返回null
*/
looplink create_head()
{
looplink l=(looplink)malloc(sizeof(struct Node));
if(l==NULL)
return NULL;
l->len=0;
l->next=l;
return l;
}
/*
* function: 创建普通结点
* @param [ in]
* @param [out] 无
* @return 成功返回地址失败返回null
*/
looplink create_node()
{
looplink p=(looplink)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
p->data=0;
p->next=NULL;
return p;
}
/*
* function: 单向循环链表头插
* @param [ in] 链表 插入的值
* @param [out]
* @return 成功返回0失败返回-1
*/
int insert_head(looplink l,datatype e)
{
//判断头结点是否存在
if(l==NULL)
{
printf("插入失败\n");
return -1;
}
//头插
looplink p=create_node();
if(p==NULL)
return -1;
//p的数据域
p->data=e;
//p的指针域
p->next=l->next;
l->next=p;
l->len++;
}
/*
* function: 单项循环链表遍历
* @param [ in] 链表
* @param [out]
* @return 无返回
*/
void output(looplink l)
{
//判断头结点是否存在
//判断链表是否为空
if(l==NULL ||l->len==0)
{
printf("遍历失败\n");
return;
}
//遍历
looplink p=l;
while(p->next!=l)//循环到最后一个结点,最后一个结点指向头结点
{
p=p->next;
printf("%c\t",p->data);
}
puts("");
}
/*
* function: 尾插
* @param [ in] 链表 插入的值
* @param [out]
* @return 成功返回0失败返回-1
*/
int insert_rear(looplink l,datatype e)
{
//判断头结点是否存在
if(l==NULL)
{
printf("插入失败\n");
return -1;
}
looplink p=l;
while(p->next!=l)
{
p=p->next;
}
//在p结点后面插入s
looplink s=create_node();
if(s==NULL)
return -1;
s->data=e;
s->next=p->next;
p->next=s;
l->len++;
}
/*
* function: 头删
* @param [ in] 链表
* @param [out]
* @return 成功返回0失败返回-1
*/
int delete_head(looplink l)
{
//判断头结点是否存在
//判断链表是否为空
if(l==NULL ||l->len==0)
{
printf("插入失败\n");
return -1;
}
//删除头结点的后继结点
looplink q=l->next;
l->next=q->next;
free(q);
q=NULL;
l->len--;
}
/*
* function: 尾删
* @param [ in] 链表
* @param [out]
* @return 成功返回0失败返回-1
*/
int delete_rear(looplink l)
{
//判断头结点是否存在
//判断链表是否为空
if(l==NULL ||l->len==0)
{
printf("插入失败\n");
return -1;
}
looplink p=l;
while(p->next->next!=l)
{
p=p->next;
}
free(p->next);
p->next=l;
l->len--;
}
/*
* function: 约瑟夫环
* @param [ in]
* @param [out]
* @return
*/
void josepho(looplink l,int a,int b)
{
looplink p=l;
for(int i=0;i<a;i++)
{
for(int j=0;j<b-1;j++)
{
p=p->next;
if(p==l)
j--;
}
looplink q=p->next;
if(q==l)
q=l->next;
printf("%c\t",q->data);
p->next=q->next;
free(q);
q=NULL;
l->len--;
}
}