循环链表 和之前的链表原理一样
头文件:
#ifndef __CIRCLELIST_H__
#define __CIRCLELIST_H__
#include "stdio.h"
#include "stdlib.h"
typedef void CircleList;
typedef struct _tag_CircleListNode
{
struct _tag_CircleListNode * next;
}CircleListNode;
CircleList* CircleList_Create();//创建链表
void CircleList_Destroy(CircleList* list);//析构链表
void CircleList_Clear(CircleList* list);//清空链表
int CircleList_Length(CircleList* list);//求链表长度
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);//插入
CircleListNode* CircleList_Get(CircleList* list, int pos);//获取链表中元素
CircleListNode* CircleList_Delete(CircleList* list, int pos);//删除节点
//add
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);
CircleListNode* CircleList_Reset(CircleList* list);
CircleListNode* CircleList_Current(CircleList* list);
CircleListNode* CircleList_Next(CircleList* list);
#endif
函数实现:
#include "circlelist.h"
typedef struct TCircleList
{
CircleListNode header;
CircleListNode *slider;
int length;
}TCircleList;
CircleList* CircleList_Create()
{
TCircleList *list = NULL;
list = (TCircleList *)malloc(sizeof(TCircleList));
if (list == NULL)
{
return NULL;
}
list->length = 0;
list->header.next = NULL;
list->slider = NULL;
return (CircleList*)list;
}
void CircleList_Destroy(CircleList* list)
{
TCircleList *tlist = NULL;
tlist = (TCircleList *)list;
if (tlist == NULL)
{
return ;
}
free(tlist);
return;
}
void CircleList_Clear(CircleList* list)
{
TCircleList *tlist = NULL;
tlist = (TCircleList *)list;
if (tlist == NULL)
{
return;
}
tlist->header.next = NULL;
tlist->slider = NULL;
tlist->length = 0;
return;
}
int CircleList_Length(CircleList* list)
{
TCircleList *tlist = NULL;
tlist = (TCircleList *)list;
if (tlist == NULL)
{
return 0;
}
return tlist->length;
}
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
{
if (list == NULL || node == NULL || pos < 0)
{
return -1;
}
TCircleList *tlist = NULL;
tlist = (TCircleList *)list;
if (tlist == NULL)
{
return -2;
}
if (pos > CircleList_Length(list))
{
return -3;
}
CircleListNode *current = NULL;
CircleListNode *last = NULL;
current = (CircleListNode *)list;
if (current == NULL)
{
return -4;
}
for (int i = 0; i < pos; i++)
{
current = current->next;
}
if (tlist->length == 0)//当第一次插入节点的时候
{
current->next = node;
node->next = node;
tlist->length++;
return 0;
}
if (current == (CircleListNode *)list)//插入头部时
{
last = CircleList_Get(list, CircleList_Length(list) - 1); //缓存最后一个元素的地址
}
node->next = current->next;
current->next = node;
if (last != NULL )//当插入头部时
{
last->next = node;//让最后一个节点指向头结点
tlist->slider = current->next;
}
tlist->length++;
return 0;
}
CircleListNode* CircleList_Get(CircleList* list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TCircleList *tlist = NULL;
tlist = (TCircleList *)list;
if (tlist == NULL)
{
return NULL;
}
/*if (pos >= CircleList_Length(list))
{
return NULL;
}*/
CircleListNode *current = NULL;
current = (CircleListNode *)list;
if (current == NULL)
{
return NULL;
}
for (int i = 0; i < pos; i++)
{
current = current->next;
}
return (CircleListNode*)current->next;
}
CircleListNode* CircleList_Delete(CircleList* list, int pos)
{
if (list == NULL || pos < 0)
{
return NULL;
}
TCircleList *tlist = NULL;
tlist = (TCircleList *)list;
if (tlist == NULL)
{
return NULL;
}
if (pos >= CircleList_Length(list))
{
return NULL;
}
CircleListNode *current = NULL;
current = (CircleListNode *)list;
if (current == NULL)
{
return NULL;
}
for (int i = 0; i < pos; i++)
{
current = current->next;
}
CircleListNode *last = NULL;
CircleListNode *last_node = NULL;
if (current == (CircleListNode *)list)//删除头部时
{
last_node = CircleList_Get(list, CircleList_Length(list) - 1); //缓存最后一个元素的地址
}
last = current->next;//缓存删除的元素
current->next = last->next;
if (last_node != NULL)//删除头部时
{
last_node->next = last->next;
}
tlist->length--;
if (tlist->slider == last)//如果保存的第一个元素与删除的元素相同时,保存删除的元素的下一个元素
{
tlist->slider = last->next;
}
if (tlist->length == 0)//如果删除了最后一个元素
{
tlist->header.next = NULL;
tlist->slider = NULL;
}
return (CircleListNode*) last;
}
//add
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
{
return NULL;
}
CircleListNode* CircleList_Reset(CircleList* list)
{
return NULL;
}
CircleListNode* CircleList_Current(CircleList* list)
{
return NULL;
}
CircleListNode* CircleList_Next(CircleList* list)
{
return NULL;
}
测试程序:
#include "circlelist.h"
typedef struct Teacher
{
CircleListNode node;
int age;
}Teacher;
void main()
{
int ret = 0;
Teacher t1, t2, t3, t4;
t1.age = 1;
t2.age = 2;
t3.age = 3;
t4.age = 4;
CircleList *list = NULL;
list = CircleList_Create();
if (list == NULL)
{
printf("ERROR!! func CircleList_Create()");
goto END;
}
int length = CircleList_Length(list);
printf("未插入数据时长度:%d\n", length);
ret = CircleList_Insert(list, (CircleListNode *)(&t1), 0);
if (ret != 0)
{
printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
goto END;
}
ret = CircleList_Insert(list, (CircleListNode *)(&t2), 1);
if (ret != 0)
{
printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
goto END;
}
ret = CircleList_Insert(list, (CircleListNode *)(&t3), 2);
if (ret != 0)
{
printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
goto END;
}
ret = CircleList_Insert(list, (CircleListNode *)(&t4), 3);
if (ret != 0)
{
printf("ERROR!! FUNC CircleList_Insert()%d\n", ret);
goto END;
}
Teacher *tmp = NULL;
length = CircleList_Length(list);
printf("插入数据后长度:%d\n", length);
printf("***********************\n");
for (int i = 0; i < 2 * length; i++)//证明是循环链表
{
tmp = (Teacher *)CircleList_Get(list, i);
printf("%d ", tmp->age);
}
printf("\n***********************\n");
tmp = (Teacher *)CircleList_Delete(list, 0);
if (tmp == NULL)
{
printf("ERROR!! FUNC CircleList_Delete()\n");
goto END;
}
printf("删除的老师的年龄:%d\n", tmp->age);
length = CircleList_Length(list);
printf("删除数据后长度:%d\n", length);
tmp = (Teacher *)CircleList_Get(list, 0);
if (tmp == NULL)
{
printf("ERROR!! FUNC CircleList_Delete()\n");
goto END;
}
printf("获取第一个老师的年龄:%d\n", tmp->age);
while (CircleList_Length(list) > 0)
{
tmp = (Teacher *) CircleList_Delete(list, 0);
if (tmp == NULL)
{
printf("ERROR!! FUNC CircleList_Delete()\n");
goto END;
}
printf("删除的老师的年龄:%d\n", tmp->age);
}
CircleList_Clear(list);
CircleList_Destroy(list);
END:
system("pause");
}