# include# include# include"CircleLinkList.h"
/*创建循环链表*/CircleLinkList*createList()
{/*在堆上分配内存*/CircleLinkList* list = (CircleLinkList *)malloc(sizeof(CircleLinkList));/*初始化*/list->ptr = &list->header;
list->header.next =NULL;
list->slider.next =NULL;
list->length = 0;returnlist;
}/*获取链表长度*/
int length(CircleLinkList *list)
{return list->length;
}/*销毁链表*/
void destory(CircleLinkList *list)
{if (list !=NULL)
{free(list);
}
}/*清空链表*/
void clear(CircleLinkList *list)
{if (list !=NULL)
{
list->header.next =NULL;
list->slider.next =NULL;
}
}/*判断链表是否为空*/
int empty(CircleLinkList *list)
{if (list->length == 0)
{return 1;
}else{return 0;
}
}/*插入结点*/
void insert(CircleLinkList * list, int pos, Node *node)
{if (list ==NULL)
{
printf("链表为NULL\n");return;
}/*判断插入位置是否超过链表长度或小于0*/pos= pos < 0 ? 0: pos;
pos= pos > length(list) ?length(list) : pos;/*注意:如果在第一个位置插入,则需要遍历到最后一个元素,然后再把最后一个元素的指针域指向第一个*/
/*将业务节点转换为链表节点*/CircleNode* _node = (CircleNode *)node;/*判断是否第一次插入*/
if (length(list) == 0)
{
list->header.next =_node;
_node->next =_node;
list->length++;return;
}/*定义posNode结点*/CircleNode* posNode = list->header.next;/*判断是否在头部插入*/
if (pos == 0)
{/*将posNode移动到尾部*/
for (int i = 0; i < length(list)-1; i++)
{
posNode= posNode->next;
}/*将尾部指针指向新节点*/posNode->next =_node;/*将新节点指针指向头节点指向的节点*/_node->next = list->header.next;/*将头节点指向新节点*/list->header.next =_node;
}else{/*将posNode移动到pos位置上*/
for (int i = 0; i < pos-1; i++)
{
posNode= posNode->next;
}/*插入*/_node->next = posNode->next;
posNode->next =_node;
}
list->length++;
}/*删除结点*/Node* del(CircleLinkList * list, intpos)
{if (list ==NULL)
{
printf("链表为NULL\n");returnNULL;
}if (length(list) <= 0)
{
printf("链表已空\n");returnNULL;
}/*判断插入位置是否超过链表长度或小于0*/pos= pos < 0 ? 0: pos;
pos= pos > length(list) ?length(list) : pos;/*定义要删除的节点*/CircleNode* result =NULL;/*定义posNode结点*/CircleNode* posNode = list->header.next;/*判断是否删除头结点*/
if (pos == 0)
{/*移动posNode到pos位置*/
for (int i = 0; i < length(list) - 1; i++)
{
posNode= posNode->next;
}/*保存要删除的节点*/result= posNode->next;/*删除*/posNode->next = list->header.next->next;
list->header.next = list->header.next->next;
}else{/*定义缓存上一个结点*/CircleNode* previous =posNode;/*移动posNode到pos位置*/
for (int i = 0; i < pos; i++)
{
previous=posNode;
posNode= posNode->next;
}/*保存要删除的节点*/result=posNode;/*删除*/previous->next = posNode->next;
}
list->length--;returnresult;
}/*获取结点*/Node* get(CircleLinkList * list, intpos)
{if (list ==NULL)
{
printf("链表为NULL\n");returnNULL;
}/*判断插入位置是否超过链表长度或小于0*/pos= pos < 0 ? 0: pos;
pos= pos > length(list) ? pos%length(list) : pos;/*定义头结点*/CircleNode* header = list->header.next;/*定义pos结点*/CircleNode* posNode =header;/*移动posNode到指定位置*/
for (int i = 0; i < pos; i++)
{
posNode= posNode->next;
}returnposNode;
}/*将游标重置指向链表的第一个元素*/
void resetSlider(CircleLinkList *list)
{
list->slider.next = list->header.next;
}/*获取当前游标指向的数据元素*/Node* current(CircleLinkList *list)
{return list->slider.next;
}/*将游标指向到链表的下一个数据元素并返回当前游标的数据元素*/Node* next(CircleLinkList *list)
{
CircleNode* result = list->slider.next;
list->slider.next = list->slider.next->next;returnresult;
}/*删除游标,并将游标指向下一个数据元素*/Node* deleteNode(CircleLinkList *list)
{if (list ==NULL)
{
printf("链表为NULL\n");returnNULL;
}if (length(list) <= 0)
{
printf("链表已空\n");returnNULL;
}/*获取当前游标的数据结点*/Node* node =current(list);/*将当前游标下移*/next(list);/*定义要删除的节点*/CircleNode* result =NULL;/*定义posNode结点*/CircleNode* posNode = list->header.next;/*将业务节点转换为链表节点*/CircleNode* _node = (CircleNode *)node;/*判断是否删除头结点*/
if (_node == list->header.next)
{/*移动posNode到pos位置*/
for (int i = 0; i < length(list) - 1; i++)
{
posNode= posNode->next;
}/*保存要删除的节点*/result= posNode->next;/*删除*/posNode->next = list->header.next->next;
list->header.next = list->header.next->next;
}else{/*定义缓存上一个结点*/CircleNode* previous =posNode;/*移动posNode到pos位置*/
while (posNode !=_node)
{
previous=posNode;
posNode= posNode->next;
}/*保存要删除的节点*/result=posNode;/*删除*/previous->next = posNode->next;
}
list->length--;returnresult;
}