目录
1、looplink.h
#ifndef __LOOPLINK_H__
#define __LOOPLINK_H__
typedef int datatype;
typedef struct Node
{
union{
datatype data;
int len;
};
struct Node *next;
}Looplink;
//创建
Looplink *list_create();
//判空
int list_empty(Looplink *L);
//尾插
int list_insert_tail(Looplink *L,datatype e);
//删头
Looplink *kill_head(Looplink *L);
//约瑟夫函数
void Joseph(Looplink *L, int m);
#endif
2、looplink.c
#include<stdio.h>
#include<stdlib.h>
#include"looplink.h"
//创建
Looplink *list_create()
{
Looplink *L = (Looplink *)malloc(sizeof(Looplink));
if(L == NULL)
{
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; //1表示空,0表示非空
}
//尾插
int list_insert_tail(Looplink *L,datatype e)
{
//判断逻辑
if(L ==NULL)
{
printf("所给链表不合法\n");
return -1;
}
//申请节点存放数据
Looplink *p = (Looplink *)malloc(sizeof(Looplink));
if(NULL == p)
{
printf("节点申请失败\n");
return -2;
}
p->data=e;
p->next=NULL;
Looplink *q = L;
while(q->next != L)
{
q=q->next;
}
p->next = L;
q->next = p;
L->len++;
printf("插入成功\n");
return 0;
}
//带头结点遍历
void list_show(Looplink *L)
{
if(L == NULL || list_empty(L))
{
printf("遍历失败\n");
return;
}
//遍历
printf("链表元素分别是:");
Looplink *q = L->next;
while(q != L)
{
printf("%d\t",q->data);
q=q->next;
}
putchar(10);
}
//删头
Looplink *kill_head(Looplink *L)
{
if(L ==NULL || list_empty(L))
{
printf("删头失败\n");
return NULL;
}
//遍历指针到最后一个
Looplink *q = L->next;
while(q->next != L)
{
q=q->next;
}
//孤立头结点
q->next = L->next;
//删除头结点
free(L);
L=NULL;
//printf("头结点删除成功\n");
//返回第一个节点地址
return q;
}
//约瑟夫函数
void Joseph(Looplink *L, int m)
{
Looplink *pre = L;
Looplink *p = L->next;
int count = 1;
printf("出环的顺序是:\n");
while (p->next != p)
{
if (count < m)
{
pre = pre->next; //工作指针pre 和 p后移
p = p->next;
count++;
}
else
{
printf("%d ", p->data); //输出
pre->next = p->next; //删除结点p
free(p); //释放结点p
p = pre->next; //保持p位于pre的next
count = 1; //将计数归1
}
}
printf("%d", p->data);
free(p); //不要忘记释放最后一个结点
putchar(10);
}
3、main.c
#include<stdio.h>
#include<stdlib.h>
#include"looplink.h"
int main(int argc, const char *argv[])
{
Looplink *L = list_create();
if(L == NULL)
{
return -1;
}
//尾插
list_insert_tail(L,1);
list_insert_tail(L,2);
list_insert_tail(L,3);
list_insert_tail(L,4);
list_insert_tail(L,5);
list_insert_tail(L,6);
list_insert_tail(L,7);
list_insert_tail(L,8);
list_show(L);
Looplink *S = kill_head(L);
L=NULL;
Joseph(S,4);
return 0;
}
执行结果: