头文件
#ifndef __SEQLINK__
#define __SEQLINK__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int newtype;
typedef struct loop_link_list
{
union
{
newtype data;
int len;
} Data;
struct loop_link_list* next;
}lll;
//创建头节点
lll* create_looplink_node();
//遍历链表
void show_link_list(lll*);
//头插法
void head_insert(lll* , newtype);
//尾插法
void tail_insert(lll* , newtype);
//任意位置插入
int link_insert(lll* , newtype , int);
//头删法
int head_del(lll* );
//尾删法
int tail_del(lll* );
//按位置删除
int index_del(lll* , int);
//清空链表
lll* clear_link(lll*);
//释放链表
void free_link(lll** head);
//joseph(约瑟夫)问题
void joseph(lll** ptr);
#endif
函数实现
#include "./seq_link.h"
//创建节点
lll* create_looplink_node()
{
lll* ptr = (lll*)malloc(sizeof(lll));
memset(ptr,0,sizeof(lll));
ptr->next = ptr;
return ptr;
}
//遍历链表
void show_link_list(lll* ptr)
{
lll* head = ptr;
for(int i=1;(ptr=ptr->next)!=head;i++)
{
if(i%5)
printf("%d ", ptr->Data.data);
else
printf("%d\n", ptr->Data.data);
}
putchar(10);
return;
}
//头插法
void head_insert(lll* ptr,newtype data)
{
//创建节点
lll* temp = create_looplink_node();
temp->Data.data = data;
//头插
temp->next = ptr->next;
ptr->next = temp;
ptr->Data.len++;
return;
}
//尾插法
void tail_insert(lll* ptr, newtype data)
{
//创建节点
lll* temp = create_looplink_node();
temp->Data.data = data;
//找到尾节点
lll* p = ptr;
while(p->next!=ptr) //判断是否到达尾节点
{
p = p->next;
}
//插入节点
temp->next = p->next;
p->next = temp;
ptr->Data.len++;
return;
}
//按位置插入
int link_insert(lll* ptr, newtype data, int index)
{
if(index<1)
{
printf("位置输入不合法!\n");
return -1;
}
else
{
//创建节点
lll* temp = create_looplink_node();
temp->Data.data = data;
//查找位置
lll* p = ptr;
for(int i=1; i<index && (p=p->next)!=ptr; i++);
//插入数据
temp->next = p->next;
p->next = temp;
ptr->Data.len++;
}
}
//头删法
int head_del(lll* ptr)
{
//判断链表是否为空
if(ptr->next!=ptr)
{
//不为空删除第一个节点
lll* p = ptr->next;
ptr->next = ptr->next->next;
free(p);
ptr->Data.len--;
return 0;
}
else
{
//为空输出语句并返回-1
printf("链表为空,无法删除\n");
return -1;
}
}
//尾删法
int tail_del(lll* ptr)
{
//判断链表是否为空
if(ptr->next!=ptr)
{
//不为空删除最后一个结点
ptr->Data.len--; //链表长度减一
//找到最后一个结点
lll* p = ptr;
while(p->next->next!=ptr)
p = p->next;
//删除为结点
free(p->next);
p->next = ptr;
return 0;
}
else
{
printf("链表为空,无法删除\n");
return -1;
}
}
//按位置删除
int index_del(lll* ptr, int index)
{
//判断链表是否为空
if(ptr->next==NULL)
{
printf("链表为空,删除失败\n");
return -1;
}
//查找位置结点
int i;
lll* p = ptr;
for(i=1; i<index && p->next->next!=ptr; i++)
{
p = p->next;
}
//判断删除位置是否大于链表长度
//大于则删除最后一个结点
if(i<index)
{
printf("删除位置超过链表长度,删除最后一个\n");
free(p->next);
p->next = ptr;
ptr->Data.data--;
return 1;
}
//否则就删除对应位置元素
else
{
lll* q = p->next;
p->next = p->next->next;
free(q);
ptr->Data.len--;
return 0;
}
}
//清空链表
lll* clear_link(lll* ptr)
{
while(ptr->next!=ptr)
{
head_del(ptr);
}
return ptr;
}
//释放链表
void free_link(lll** head)
{
clear_link(*head);
free(*head);
*head = NULL;
return;
}
//joseph(约瑟夫)问题
void joseph(lll** ptr)
{
int i=1;
while ((*ptr)->next!=*ptr)
{
for (int i=0; i<7; i++) {
(*ptr) = (*ptr)->next;
}
lll* p = (*ptr)->next;
(*ptr)->next = p->next;
printf("%d=%d ",i,p->Data.data);
free(p);
i++;
}
printf("%d=%d\n",i,(*ptr)->Data.data);
free((*ptr));
ptr = NULL;