函数:looplink.h
#ifndef __LOOPLINK_H__
#define __LOOPLINK_H__
typedef int datatype;
typedef struct Node
{
union
{
datatype data;
int len;
};
struct Node *next;
}*LoopLink,Node;
//创建
LoopLink list_create();
//判空
int list_empty(LoopLink L);
//申请结点封装数据
LoopLink apply_node(datatype e);
//头插
int list_insert_head(LoopLink L,datatype e);
//遍历
void list_show(LoopLink L);
//约瑟夫环
void joseph(LoopLink L,int k);
#endif
函数:looplink.c
#include <stdio.h>
#include <stdlib.h>
#include "looplink.h"
//创建
LoopLink list_create()
{
LoopLink L = (LoopLink)malloc(sizeof(Node));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
//初始化
L->len = 0;
L->next = L;
printf("创建成功\n");
return L;
}
//判空
int list_empty(LoopLink L)
{
return L->next==L; //1表示空 0表示非空
}
//申请结点封装数据
LoopLink apply_node(datatype e)
{
LoopLink p = (LoopLink)malloc(sizeof(Node));
if(NULL==p)
{
printf("结点申请失败\n");
return NULL;
}
//将数据封装到节点
p->data = e;
p->next = NULL;
return p;
}
//头插
int list_insert_head(LoopLink L,datatype e)
{
//判断逻辑
if(NULL==L)
{
printf("链表不合法\n");
return -1;
}
//申请结点封装数据
LoopLink p = apply_node(e);
if(NULL==p)
{
return -2;
}
//头插逻辑
p->next = L->next;
L->next = p;
//表长变化
L->len++;
printf("插入成功\n");
return 0;
}
//遍历
void list_show(LoopLink L)
{
//判断逻辑
if(NULL==L)
{
printf("便利失败\n");
return ;
}
//遍历
LoopLink q = L->next;
while(q != L)
{
printf("%d\t", q->data);
q = q->next;
}
printf("\n");
}
//约瑟夫环
void joseph(LoopLink L,int k)
{
//判断逻辑
if(NULL==L)
{
printf("链表不合法\n");
return ;
}
LoopLink p = L;
LoopLink q;
for(int i=0; i<8; i++)
{
//k代表每数到k,删除一个
for(int j=0; j<k-1; j++)
{
p = p->next;
if(p==L)
j--;
}
//q为要删除的结点
q = p->next;
if(q==L)
q = L->next;
//输出并删除q
printf("%d\t", q->data);
p->next = q->next;
free(q);
L->len--;
}
printf("\n");
return ;
}
函数:main.c
#include <stdlib.h>
#include "looplink.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
LoopLink L = list_create(L);
if(NULL==L)
{
return -1;
}
//输入数据
for(int i=8; i>0; i--)
{
list_insert_head(L, i);
}
list_show(L);
//调用约瑟夫环函数
joseph(L, 4);
return 0;
}
结果: