typedef struct LinkNode {
LinkType data;
struct LinkNode* next;
} LinkNode;
/**
* @brief 初始化链表
*
* @param head
*/
void LinkListInit(LinkNode** head);
/**
* @brief 尾插一个元素到链表中
*
* @param head
* @param value
*/
LinkNode* LinkListPushBack(LinkNode** head, LinkType value);
/**
* @brief 尾删一个元素
*
* @param head
*/
void LinkListPopBack(LinkNode** head);
/**
* @brief 头插一个元素
*
* @param head
* @param value
*/
void LinkListPushFront(LinkNode** head, LinkType value);
/**
* @brief 头删一个元素
*
* @param head
*/
void LinkListPopFront(LinkNode** head);
/**
* @brief 查找元素在链表中的位置
*
* @param head
* @param to_find 要查找的值
*
* @return 这个值对应的节点的地址
*/
LinkNode* LinkListFind(LinkNode* head, LinkType to_find);
/**
* @brief 在pos之前插入元素
*
* @param head
* @param pos
* @param value
*/
void LinkListInsert(LinkNode** head, LinkNode* pos, LinkType value);
/**
* @brief 在pos之后插入元素
*
* @param head
* @param pos
* @param value
*/
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkType value);
/**
* @brief 删除指定位置的元素
*/
void LinkListErase(LinkNode** head, LinkNode* pos);
void LinkListErase2(LinkNode** head, LinkNode** pos);
/**
* @brief 删除指定值的元素
*
* @param head
* @param to_delete
*/
void LinkListRemove(LinkNode** head, LinkType to_delete);
/**
* @brief 指定值的所有元素都删掉.
*
* @param head
* @param value
*/
void LinkListRemoveAll(LinkNode** head, LinkType value);
/**
* @brief 判定链表为空
*
* @return 链表为空, 返回1, 否则返回0
*/
int LinkListEmpty(LinkNode* head);
/**
* @brief 求链表的元素个数
*
* @param head
*
* @return
*/
size_t LinkListSize(LinkNode* head);
/**
* @brief 逆序打印单链表.
*
* @param head
*/
void LinkListReversePrint(LinkNode* head);
/**
* @brief 不允许遍历链表, 在 pos之前插入
*
* @param head
* @param pos
* @param value
*/
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value);
LinkNode* JosephCycle(LinkNode* head, size_t food);
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
#include"Linklist.h"
#include<stdio.h>
/**
* @brief 初始化链表
*
* @param head
*/
void LinkListInit(LinkNode* head)
{
if (head == NULL)
return;
LinkNode* tmp = head;
for (; tmp->next != NULL; tmp = tmp->next)
{
tmp->data ^= tmp->data;
}
return;
}
/**
* @brief 尾插一个元素到链表中
*
* @param head
* @param value
*/
LinkNode* LinkListPushBack(LinkNode* head, LinkType value)
{
if (head == NULL)
return;
LinkNode *L = (LinkNode*)malloc(sizeof(LinkNode));//给元素申请一块内存(堆上)
LinkNode* tmp = head;
for (; tmp->next != NULL; tmp = tmp->next)
{
;
}
tmp->next = L;//tmp指向L
L->data = value;//将value存入L
L->next = NULL;//将L上的指针置为NULL
return L;
}
/**
* @brief 尾删一个元素
*
* @param head
*/
void LinkListPopBack(LinkNode** head)
{
if (*head == NULL)
return;
if ((*head)->next == NULL)
{
*head = NULL;
return;
}
LinkNode* tmp = *head;
for (tmp; (tmp->next)->next != NULL; tmp = tmp->next)
{
;
}
tmp->next = NULL;
free(tmp->next);
return;
}
/**
* @brief 头插一个元素
*
* @param head
* @param value
*/
void LinkListPushFront(LinkNode* head, LinkType value)
{
if (head == NULL)
return;
LinkNode *L = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* tmp = head;
tmp->next = L;
L->data = value;
return;
}
/**
* @brief 头删一个元素
*
* @param head
*/
void LinkListPopFront(LinkNode** head)
{
if (*head == NULL)
return;
if ((*head)->next == NULL)
{
*head = NULL;
return;
}
LinkNode* cmp = head;
LinkNode* tmp = cmp->next;
cmp->next = (cmp->next)->next;
free(tmp);
return;
}
/**
* @brief 查找元素在链表中的位置
*
* @param head
* @param to_find 要查找的值
*
* @return 这个值对应的节点的地址
*/
LinkNode* LinkListFind(LinkNode* head, LinkType to_find)
{
if (head == NULL)
return;
LinkNode* tmp = head;
for (; tmp->next != NULL; tmp = tmp->next)
{
if (tmp->data == to_find)
return tmp;
}
return NULL;
}
/**
* @brief 在pos之前插入元素
*
* @param head
* @param pos
* @param value
*/
void LinkListInsert(LinkNode** head, LinkNode* pos, LinkType value)
{
if (head == NULL)
return;
if (pos == NULL)
return;
if (pos == *head)//当pos是头结点时
return;
LinkNode* L = (LinkNode*)malloc(sizeof(LinkNode));
L->data = pos->data;
L->next = pos->next;
pos->next = L;
pos->data = value;
return;
}
/**
* @brief 在pos之后插入元素
*
* @param head
* @param pos
* @param value
*/
void LinkListInsertAfter(LinkNode* head, LinkNode* pos, LinkType value)
{
if (head == NULL)
return;
if (pos == NULL)
return;
LinkNode* L = (LinkNode*)malloc(sizeof(LinkNode));
L->data = value;
L->next = pos->next;
pos->next = L;
return;
}
/**
* @brief 删除指定位置的元素
*/
void LinkListErase(LinkNode** head, LinkNode* pos)
{
if (*head == NULL)
return;
if (pos == NULL)
return;
if (pos == *head)
{
*head = NULL;
return;
}
LinkNode* tmp = head;
for (; tmp->next != NULL; tmp=tmp->next)//用for循环让tmp指向pos
{
if (tmp->next == pos)
break;
else
return;
}
tmp->next = pos->next;
free(pos);
return;
}
/**
* @brief 删除指定值的元素
*
* @param head
* @param to_delete
*/
void LinkListRemove(LinkNode** head, LinkType to_delete)
{
if (head == NULL)
return;
LinkNode* tmp = head;
for (; tmp->next != NULL; tmp = tmp->next)
{
if (tmp->data == to_delete)
{
tmp->next = LinkListFind(head, tmp)->next;
free(LinkListFind(head, tmp));
return;
}
}
return;
}
/**
* @brief 指定值的所有元素都删掉.
*
* @param head
* @param value
*/
void LinkListRemoveAll(LinkNode** head, LinkType value)
{
if (head == NULL)
return;
LinkNode* tmp = head;
for (; tmp->next != NULL; tmp = tmp->next)
{
if (tmp->data == value)
{
tmp->next = LinkListFind(head, tmp)->next;
free(LinkListFind(head, tmp));
return;
}
}
return;
}
/**
* @brief 判定链表为空
*
* @return 链表为空, 返回1, 否则返回0
*/
int LinkListEmpty(LinkNode* head)
{
return head->next == NULL ? 1 : 0;
}
/**
* @brief 求链表的元素个数
*
* @param head
*
* @return
*/
size_t LinkListSize(LinkNode* head)
{
if (head == NULL)
return;
LinkNode* tmp = head;
size_t i = 0;
for (; tmp->next != NULL; tmp = tmp->next)
{
++i;
}
return i;
}
/**
* @brief 逆序打印单链表.
*
* @param head
*/
void LinkListReversePrint(LinkNode* head)
{
if (head == NULL)
return;
LinkNode* tmp = head;
LinkListReversePrint(tmp->next);
printf("%c", head->data);
return;
}
/**
* @brief 不允许遍历链表, 在 pos之前插入
*
* @param head
* @param pos
* @param value
*/
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value)
{
if (*head == NULL)
return;
if (pos == NULL)
return;
if (pos == *head)
return;
LinkNode* L = (LinkNode*)malloc(sizeof(LinkNode));
L->data = pos->data;
L->next = pos->next;
pos->next = L;
pos->data = value;
return;
}