循环链表
CircleList.h
#define _CRT_SECURE_NO_DEPRECATE
#pragma once
#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_
#include<string.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);
CircleListNode* CircleList_Get(CircleList* list, int pos);
int CircleList_Insert(CircleList* list, CircleListNode* node, 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
CircleList.c
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "CircleList.h"
typedef struct _tag_CircleList
{
CircleListNode pHead;
CircleListNode* Slider;//游标
int length;
}TCircleList;
CircleList* CircleList_Create()
{
TCircleList *pTem = NULL;
pTem = (TCircleList*)malloc(sizeof(TCircleList));//分配内存
//初始化
pTem->pHead.next = NULL;
pTem->length = 0;
pTem->Slider = NULL;
return pTem;
}
void CircleList_Destroy(CircleList* list)
{
TCircleList *pTem = (TCircleList*)list;
if (pTem!=NULL)
{
free(pTem);
pTem = NULL;
}
list = pTem;
return ;
}
void CircleList_Clear(CircleList* list)
{
TCircleList *pTem = (TCircleList*)list;
if (list==NULL)
{
printf("CircleList_Clear() err \n");
return;
}
pTem->length = 0;
pTem->pHead.next = NULL;
pTem->Slider = NULL;
return ;
}
int CircleList_Length(CircleList* list)
{
TCircleList *pTem = (TCircleList*)list;
if (list == NULL)
{
printf("CircleList_Length() err \n");
return -1;
}
return pTem->length;
}
CircleListNode* CircleList_Get(CircleList* list, int pos)
{
TCircleList *pTem = (TCircleList*)list;
CircleListNode *Current = (CircleListNode*)list;
CircleListNode *pRem = NULL;
if (list == NULL|| pos < 0)
{
printf("CircleList_Get() err \n");
return NULL;
}
for (int i = 0; i < pos; i++)
{
Current = Current->next;
}
pRem = Current->next;
return pRem;
}
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
{
TCircleList *pTem = (TCircleList*)list;
CircleListNode *Current = (CircleListNode*)list;
CircleListNode *pRem = NULL;
CircleListNode *pLast = (CircleListNode*)list;
if (list == NULL || pos < 0|| node == NULL)
{
printf("CircleList_Get() err \n");
return 0;
}
for (int i = 0; i < pos; i++)
{
Current = Current->next;
}
pRem = Current->next;
//普通插入和线性链表一样
node->next = Current->next;
Current->next = node;
//如果链表为空
if (pTem->length==0)
{
//pTem->pHead.next = node;
node->next = node;
pTem->Slider = node;
}
pTem->length++;
//如果是你在头部插入 长度大于0 且插入位置是0
if (pTem->length>0)
{
if (pos==0)
{
pLast = CircleList_Get(pTem, pTem->length - 1);//获取最后一个元素
pLast->next = node;
}
}
return 0;
}
CircleListNode* CircleList_Delete(CircleList* list, int pos)
{
TCircleList *pTem = (TCircleList*)list;
CircleListNode *Current = &pTem->pHead;
CircleListNode *pRem = NULL;
CircleListNode *pLast = (CircleListNode*)list;
if (list == NULL || pos < 0)
{
printf("CircleList_Get() err \n");
return 0;
}
for (int i = 0; i < pos; i++)
{
Current = Current->next;//待删节点的前一节点
}
//如果的删除的元素在首部
if (Current == &pTem->pHead)//pos==0
{
if (pTem->length == 1)//只有一个元素
{
pRem = Current->next;
pTem->pHead.next = NULL;
pTem->length = 0;
pTem->Slider = NULL;
return pRem;
}
else if (pTem->length > 1)//长度大于1
{
pRem = Current->next;
pLast = CircleList_Get(pTem, pTem->length - 1);//最后一个元素的地址在前一元素的next域
Current->next = Current->next->next;//删除节点
pLast->next = Current->next;
pTem->length--;
if (pTem->Slider = pRem)//若为游标所指元素
{
pTem->Slider = pRem->next;
}
return pRem;
}
}
//如果删除的元素位置不是pos=0
pRem = Current->next;
Current->next = pRem->next;
pTem->length--;
if (pTem->Slider = pRem)//若为游标所指元素
{
pTem->Slider = pRem->next;
}
return pRem;
}
//Add
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node) // O(n)
{
TCircleList* sList = (TCircleList*)list;
CircleListNode* ret = NULL;
int i = 0;
if (sList != NULL)
{
CircleListNode* current = (CircleListNode*)sList;
//查找node在循环链表中的位置i
for (i = 0; i < sList->length; i++)
{
if (current->next == node)
{
ret = current->next;
break;
}
current = current->next;
}
//如果ret找到,根据i去删除
if (ret != NULL)
{
CircleList_Delete(sList, i);
}
}
return ret;
}
CircleListNode* CircleList_Reset(CircleList* list) // O(1)
{
TCircleList* sList = (TCircleList*)list;
CircleListNode* ret = NULL;
if (sList != NULL)
{
sList->Slider = sList->pHead.next;
ret = sList->Slider;
}
return ret;
}
CircleListNode* CircleList_Current(CircleList* list) // O(1)
{
TCircleList* sList = (TCircleList*)list;
CircleListNode* ret = NULL;
if (sList != NULL)
{
ret = sList->Slider;
}
return ret;
}
CircleListNode* CircleList_Next(CircleList* list) // O(1)
{
TCircleList* sList = (TCircleList*)list;
CircleListNode* ret = NULL;
if ((sList != NULL) && (sList->Slider != NULL))
{
ret = sList->Slider;
sList->Slider = ret->next;
}
return ret;
}
mainTest.c
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "CircleList.h"
typedef struct Student
{
CircleListNode pHead;
int age;
}Student;
void print(CircleList* list)
{
Student *p = NULL;
CircleListNode *q = NULL;
for (int i = 0; i <CircleList_Length(list); i++)
{
q=CircleList_Get(list,i);
p = (Student *)q;
printf("%d \t", p->age);
}
}
int main()
{
Student s1, s2, s3, s4, s5;
s1.age = 25;
s2.age = 20;
s3.age = 21;
s4.age = 22;
s5.age = 24;
CircleList*circlelist;
circlelist=CircleList_Create();
CircleList_Insert(circlelist, (CircleListNode*)(&s1), 0);
CircleList_Insert(circlelist, (CircleListNode*)(&s2), 0);
CircleList_Insert(circlelist, (CircleListNode*)(&s3), 0);
CircleList_Insert(circlelist, (CircleListNode*)(&s4), 0);
CircleList_Insert(circlelist, (CircleListNode*)(&s5), 0);
print(circlelist);
printf("\n");
CircleList_Delete(circlelist, 2);
CircleList_Delete(circlelist, 1);
CircleList_Delete(circlelist, 0);
print(circlelist);
system("pause");
return 0;
}