版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处 https://blog.csdn.net/qq_21231413/article/details/89873963
1、定义链表节点以及表头数据结构
typedef struct CircleLinkNode{
void* data;
struct CircleLinkNode* next;
}CircleLinkNode;
typedef struct CircleLinkList{
CircleLinkNode* head; //头结点
CircleLinkNode* rear; //尾节点
int length;
}CircleLinkList;
2、链表的初始化
CircleLinkNode* CircleLinkListInit()
{
CircleLinkList* dlist = (CircleLinkList*)malloc(sizeof(CircleLinkList));
if (dlist == NULL)
{
return NULL;
}
//创建头结点 创建头结点 是为了空链表和非空链表处理一致
CircleLinkNode* head = (CircleLinkNode*)malloc(sizeof(CircleLinkNode));
if (head == NULL)
{
if (dlist != NULL)
{
free(dlist);
}
return NULL;
}
head->data = NULL;
head->next = NULL;
//初始化链表
dlist->head = head;
dlist->rear = head;
dlist->length = 0;
return dlist;
}
3、指定位置插入链表节点
void CircleLinkList_Insert(CircleLinkList* dlist, int pos, void* data)
{
if (dlist == NULL || data == NULL || pos < 0)
{
return;
}
if (pos > dlist->length)
{
pos = dlist->length;
}
//辅助指针
CircleLinkNode* pCurrent = dlist->head;
for (int i = 0; i < pos;i++)
{
pCurrent = pCurrent->next;
}
//创建新节点
CircleLinkNode* newnode = (CircleLinkNode*)malloc(sizeof(CircleLinkNode));
if (newnode == NULL)
{
return;
}
newnode->data = data;
newnode->next = NULL;
//将新结点插入到链表中
newnode->next = pCurrent->next;
pCurrent->next = newnode;
//判断是否在尾部插入结点
if (pCurrent == dlist->rear){
dlist->rear = newnode;
dlist->rear->next = dlist->head;
}
dlist->length++;
}
4、删除指定位置链表节点
void CircleLinkList_Delete(CircleLinkList* dlist, int pos)
{
if (dlist == NULL || pos < 0)
{
return;
}
if (pos >= dlist->length)
{
return;
}
//赋值指针
CircleLinkNode* pCurrent = dlist->head;
for (int i = 0; i < pos;i++)
{
pCurrent = pCurrent->next;
}
//缓存被删除结点
CircleLinkNode* pDel = pCurrent->next;
//重新建立前后结点关系
pCurrent->next = pDel->next;
//释放被删除结点内存
free(pDel);
//链表结点数量减 1
dlist->length--;
}
5、判断链表是否为空
int isEmptyCircleLinkList(CircleLinkList* dlist)
{
if (dlist->length == 0)
{
return 1;
}
return 0;
}
6、获取链表的节点数
int CircleLinkList_Length(CircleLinkList* dlist){
if (dlist == NULL)
{
return -1;
}
return dlist->length;
}
7.清空链表
void CircleLinkList_Clear(CircleLinkList* dlist){
CircleLinkNode* pCurrent = dlist->head->next;
while (pCurrent != dlist->head)
{
CircleLinkNode* pNext = pCurrent->next;
free(pCurrent);
pCurrent = pNext;
}
dlist->head->next = NULL;
dlist->rear = dlist->head;
dlist->length = 0;
}
8、销毁链表
void CircleLinkList_Destroy(CircleLinkList* dlist){
CircleLinkNode* pCurrent = dlist->head;
while (pCurrent!=dlist->head)
{
//缓存被删除结点的下一个结点
CircleLinkNode* pNext = pCurrent->next;
free(pCurrent);
pCurrent = pNext;
}
free(dlist);
}