circle.h
#pragma once
//给用户的头文件
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);
//插入
CircleListNode *CircleList_Insert(CircleList *list, CircleListNode *node, int pos);
//获取
CircleListNode *CircleList_Get(CircleList *list, int pos);
//删除
CircleListNode *CircleList_Delete(CircleList *list, int pos);
//删除某个节点
CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node);
//重置游标
CircleListNode *CircleList_Reset(CircleList *list);
//返回当前游标值
CircleListNode *CircleList_Current(CircleList *list);
//返回当前值,且游标下移
CircleListNode *CircleList_Next(CircleList *list);
circle.c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "circle.h"
//内部实现
typedef struct _tag_Circle
{
CircleListNode header;
CircleListNode *slider;
int length;
}TCircleList;
//创建
CircleList *CircleList_Create()
{
TCircleList *ret = (TCircleList *)malloc(sizeof(TCircleList));
if (ret == NULL)
{
return NULL;
}
ret->length = 0;
ret->slider = NULL;
ret->header.next = NULL;
//初始化
return ret;
}
//销毁
void CircleList_Destroy(CircleList *list)
{
TCircleList *ret = (TCircleList *)list;
if (ret != NULL)
free(ret);
}
//清空
void CircleList_Clear(CircleList *list)
{
TCircleList *ret = (TCircleList *)list;
if (ret != NULL)
{
ret->header.next = NULL;
ret->slider = NULL;
}
}
//长度
int CircleList_Length(CircleList*list)
{
TCircleList *ret = (TCircleList *)list;
if (ret != NULL)
{
return ret->length;
}
return 0;
}
//插入
CircleListNode *CircleList_Insert(CircleList *list, CircleListNode *node, int pos)
{
TCircleList *ret = (TCircleList *)list;
if (ret == NULL || node == NULL)
{
return NULL;
}
//结构体的首元素地址,就是结构体本身的地址/C语言
CircleListNode * current = (CircleListNode *)ret;
for (int i = 0; i<pos&& current != NULL; i++)
{
current = current->next;
}
node->next = current->next;
current->next = node;
ret->length++;
if (current == (CircleListNode *)ret)
{
//求出最后一个元素//用来指向第一个元素
CircleListNode *last = CircleList_Get(ret, ret->length - 1);
if (last != NULL)
{
//把最后一个元素->指向开头
last->next = current->next;
}
}
return current->next;
}
//获取
CircleListNode *CircleList_Get(CircleList *list, int pos)
{
TCircleList *ret = (TCircleList *)list;
if (ret == NULL || pos<0)
{
return NULL;
}
//结构体的首元素地址,就是结构体本身的地址/C语言
CircleListNode * current = (CircleListNode *)ret;
for (int i = 0; i<pos&& current != NULL; i++)
{
current = current->next;
}
return current->next;
}
//删除
CircleListNode *CircleList_Delete(CircleList *list, int pos)
{
TCircleList *ret = (TCircleList *)list;
if (ret == NULL || ret->length == 0 || pos<0)
{
return NULL;
}
//结构体的首元素地址,就是结构体本身的地址/C语言
CircleListNode * current = (CircleListNode *)ret;
//要删除的元素
CircleListNode *deleteNode = NULL;
CircleListNode *last = NULL;
for (int i = 0; i<pos&& current != NULL; i++)
{
current = current->next;
}
//删除的第一个
if (current == (CircleListNode *)ret)
{
//如果删除的第一个,那么最后一个元素,就要重新指向新的节点。
last = (CircleListNode *)CircleList_Get(ret, ret->length - 1);
}
deleteNode = current->next;
current->next = deleteNode->next;
ret->length--;
//判断是不是删除的第一个
if (last != NULL)
{
//重置头节点
ret->header.next = deleteNode->next;
last->next = deleteNode->next;
}
//游标指向删除节点处理
if (ret->slider == deleteNode)
{
ret->slider = deleteNode->next;
}
if (ret->length == 0)
{
CircleList_Clear(ret);
}
return deleteNode;
}
//删除某个节点
CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node)
{
TCircleList *ret = (TCircleList *)list;
if (ret == NULL || ret->length == 0 || node == NULL)
{
return NULL;
}
//结构体的首元素地址,就是结构体本身的地址/C语言
CircleListNode * current = (CircleListNode *)ret;
//要删除的元素
CircleListNode *deleteNode = NULL;
int i = 0;
for (i = 0; i<ret->length && current != NULL; i++)
{
if (current->next == node)
{
deleteNode = current->next;
}
current = current->next;
}
if (deleteNode != NULL)
{
return CircleList_Delete(ret, i);
}
return NULL;
}
//重置游标
CircleListNode *CircleList_Reset(CircleList *list)
{
TCircleList *ret = (TCircleList *)list;
if (ret == NULL)
{
return NULL;
}
ret->slider = ret->header.next;
return ret->slider;
}
//返回当前游标值
CircleListNode *CircleList_Current(CircleList *list)
{
TCircleList *ret = (TCircleList *)list;
if (ret == NULL)
{
return NULL;
}
return ret->slider;
}
//返回当前值,且游标下移
CircleListNode *CircleList_Next(CircleList *list)
{
TCircleList *ret = (TCircleList *)list;
if (ret == NULL)
{
return NULL;
}
CircleListNode *current = ret->slider;
ret->slider = ret->slider->next;
return current;
}
测试文件 main.c
#include "circle.h"
#include "stdlib.h"
#include "stdio.h"
typedef struct _Teacher
{
CircleListNode *head;
int age;
}Teacher;
void main()
{
CircleList *circle = CircleList_Create();
if (circle == NULL)
return 0;
Teacher t1, t2, t3;
t1.age = 10;
t2.age = 20;
t3.age = 30;
CircleList_Insert(circle, (CircleListNode*)&t1,0);
CircleList_Insert(circle, (CircleListNode*)&t2, 0);
CircleList_Insert(circle, (CircleListNode*)&t3, 0);
for (int i = 0; i < 6; i++)
{
Teacher *temp = (Teacher *)CircleList_Get(circle, i);
if (temp != NULL)
{
printf("Teacher age:%d \n",temp->age)
;
}
}
system("pause");
}
有意见,或者有问题,欢迎提出.