目录
looplink.h
#ifndef __LOOP_link_H__
#define __LOOP_link_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);
//带头结点遍历
void list_show(Looplink*L);
//尾删除
int list_del_tail(Looplink *L);
//删头
Looplink *kill_head(Looplink *L);
//删除头结点后的遍历
void list_show2(Looplink *S);
//实现约瑟夫环
void list_huan(Looplink *L,int n,int m);
#endif
looplink.c
#include<stdlib.h>
#include<stdio.h>
#include"looplink.h"
//创建
Looplink *list_create()
{
Looplink *L =(Looplink*)malloc(sizeof(Looplink));
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; //1表示空 0表示非空
}
//尾插
int list_insert_tail(Looplink *L,datatype e)
{
//判断逻辑
if (NULL==L)
{
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 (NULL==L || list_empty(L))
{
printf("表空 遍历失败\n");
return;
}
//遍历逻辑
printf("链表元素分别是:");
Looplink *q=L->next;
while (q!=L)
{
printf("%d\t",q->data);
q=q->next;
}printf("\n");
}
//尾删除
int list_del_tail(Looplink *L)
{
//判断逻辑
if (NULL==L||list_empty(L))
{
printf("删除失败\n");
return -1;
}
//判断逻辑定义遍历指针到倒数第二个
Looplink *q=L;
while(q->next->next!=L)
{
q=q->next;
}
//删除逻辑
free(q->next); //将最后一个节点释放
q->next=L; //将新的最后一个节点指向头结点
L->len--;
printf("删除成功\n");
return 0;
}
//删头
Looplink *kill_head(Looplink *L)
{
//判断逻辑
if (NULL==L||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->next;
}
//删除头结点后的遍历
void list_show2(Looplink *S)
{
//判断逻辑
if (NULL==S)
{
printf("遍历失败\n");
return;
}
//遍历
printf("链表元素分别是:");
Looplink *q=S;
do
{
printf("%d\t",q->data);
q=q->next;
} while (q!=S);
printf("\n");
}
void list_huan(Looplink *L,int n,int m)
{
for (int i=1; i<=n; i++)
{
list_insert_tail(L,i);
}int j=1;
list_show(L);
kill_head(L);
Looplink *q=L;
while (j<=n)
{
for (int i=1; i<=m-1; i++)
{
q=q->next;
}//printf("%d\t",q->data);
Looplink *p=q->next;
printf("%d\t",p->data);
q->next=p->next;
free(p);
p=NULL;
j++;
}printf("\n");
}
main.c
#include<stdlib.h>
#include"looplink.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
Looplink *L=list_create();
if (NULL==L)
{
return -1;
}
/* //调用尾插函数
list_insert_tail(L,1);
list_insert_tail(L,2);
list_insert_tail(L,3);
list_insert_tail(L,8);
list_insert_tail(L,9);
list_insert_tail(L,5);
list_show(L);
//调用尾删函数
list_del_tail(L);
list_show(L);
//调用删除头结点函数
Looplink *S=kill_head(L);
L=NULL;
//调用删除头结点后的遍历
list_show2(S);*/
/* 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);
kill_head(L);
Looplink *q=L;
int j=1;
while (j<=8)
{
for (int i=1; i<=3; i++)
{
q=q->next;
}//printf("%d\t",q->data);
Looplink *p=q->next;
printf("%d\t",p->data);
q->next=p->next;
free(p);
p=NULL;
j++;
}printf("\n");
*/
list_huan(L,8,4);
return 0;
}