circlelinklist.h 文件
#ifndef _CIRCLE_LINK_LIST_H_
#define _CIRCLE_LINK_LIST_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//循环链表
//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。
//链表就是一个一个的表通过关系节点连接的
//利用小节点定义一个链表头,其他的业务节点有业务自己定义后连接到表头上
//实现上层调用和底层分离,不让调用用户知道数据结构
typedef void List;
typedef void ListNode;
#ifndef bool
#define bool int
#define true 1
#define false 0
#endif
//定义小节点是有联系的 ,小节点的链表
typedef struct _tag_CircleLinkListConnectedNode
{
struct _tag_CircleLinkListConnectedNode* next;
}CircleLinkListConnectedNode;
//定义链表
typedef struct _tag_CircleLinkList{
CircleLinkListConnectedNode head; //小节点
CircleLinkListConnectedNode* slider; //游标
int length; //小节点的个数就相当于业务节点的个数
}CircleLinkList;
List* CircleLinkList_Create();
bool CircleLinkList_Destory(List* list);
bool CircleLinkList_Clear(List* list);
int CircleLinkList_GetLength(List* list);
bool CircleLinkList_InsertOneNode(List* list , ListNode* listnode, int pos);
ListNode* CircleLinkList_GetOneNode(List* list, int pos);
ListNode* CircleLinkList_DeleteOneNode(List* list,int pos);
bool CircleLinkList_DeleteAllNode(List* list);
ListNode* CircleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode);
ListNode* CircleLinkList_ResetSlider(List* list);
ListNode* CircleLinkList_GetCurrentSlider(List* list);
ListNode* CircleLinkList_SliderMoveToNext(List* list);
#endif
circlelinklist.c 文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "circlelinklist.h"
//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。
//链表就是一个一个的表通过关系节点连接的
List* CircleLinkList_Create()
{
List* ret = NULL;
CircleLinkList* temp_circlelist = NULL;
temp_circlelist = (CircleLinkList*)malloc(sizeof(CircleLinkList));
if (temp_circlelist == NULL)
{
return NULL;
}
temp_circlelist->head.next =NULL;
temp_circlelist->length = 0;
temp_circlelist->slider = NULL;
ret = (CircleLinkList*)temp_circlelist;
return ret;
}
bool CircleLinkList_Destory(List* list)
{
CircleLinkList* temp_circlelist = NULL;
if (list == NULL)
{
return false;
}
temp_circlelist = (CircleLinkList*)list;
free(temp_circlelist);
temp_circlelist = NULL;
return true;
}
bool CircleLinkList_Clear(List* list)
{
CircleLinkList* temp_circlelist = NULL;
if (list == NULL)
{
return false;
}
temp_circlelist = (CircleLinkList*)list;
//长度清零,头部指向空,游标指向空
temp_circlelist->length = 0;
temp_circlelist->head.next = NULL;
temp_circlelist->slider = NULL;
return true;
}
int CircleLinkList_GetLength(List* list)
{
int ret = 0;
CircleLinkList* temp_circlelist = NULL;
if (list == NULL)
{
return -1;
}
temp_circlelist = (CircleLinkList*)list;
ret = temp_circlelist->length;
return ret;
}
bool CircleLinkList_InsertOneNode(List* list , ListNode* listnode, int pos)
{
CircleLinkList* temp_circlelist = NULL;
CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
CircleLinkListConnectedNode* pcurrent = NULL;
int i = 0;
CircleLinkListConnectedNode* lastnode = NULL;
if (list == NULL || listnode == NULL || pos < 0)
{
return false;
}
temp_circlelist = (CircleLinkList*)list;
temp_circlelistconnected_node = (CircleLinkListConnectedNode*)listnode;
//链表的首地址与小节点的地址相同
pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
//pcurrent =(CircleListNode*) &(temp_circlelist->head);
//辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。
for (i = 0; (i < pos && pcurrent->next != NULL); i ++)
{
pcurrent = pcurrent->next;
}
//插入节点
temp_circlelistconnected_node->next = pcurrent->next;
pcurrent->next = temp_circlelistconnected_node;
//第一次插入节点,游标指向插入的第一个节点 即 0 位置
if (temp_circlelist->length == 0)
{
temp_circlelist->slider = temp_circlelistconnected_node;
}
//长度加1
temp_circlelist->length++;
//辅助指针没有调,头插法,插到0位置
if (pcurrent == (CircleLinkListConnectedNode*)temp_circlelist)
{
//得到最后一个节点
lastnode = (CircleLinkListConnectedNode*)CircleLinkList_GetOneNode((List*)temp_circlelist,temp_circlelist->length - 1);
//最后一个节点的next域指向当前插入
lastnode->next = pcurrent->next;
//lastnode->next = temp_circlelist_node;
}
return true;
}
ListNode* CircleLinkList_GetOneNode(List* list, int pos)
{
CircleLinkList* temp_circlelist = NULL;
CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
CircleLinkListConnectedNode* pcurrent = NULL;
int i = 0;
ListNode* ret = NULL;
if (list == NULL || pos < 0)
{
return NULL;
}
temp_circlelist = (CircleLinkList*)list;
//不要判断长度了,循环的嘛
if (temp_circlelist->length <= 0 )
{
return NULL;
}
//链表的首地址与小节点的地址相同
pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
//pcurrent =(CircleListNode*) &(temp_circlelist->head);
//辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。
for (i = 0; (i < pos && pcurrent->next != NULL); i ++)
{
pcurrent = pcurrent->next;
}
temp_circlelistconnected_node = (CircleLinkListConnectedNode*)(pcurrent->next);
ret = (ListNode*)temp_circlelistconnected_node;
return ret;
}
ListNode* CircleLinkList_DeleteOneNode(List* list,int pos)
{
CircleLinkList* temp_circlelist = NULL;
CircleLinkListConnectedNode* temp_circlelistconnected_node_delete = NULL;
CircleLinkListConnectedNode* pcurrent = NULL;
CircleLinkListConnectedNode* lastnode = NULL;
int i = 0;
ListNode* ret = NULL;
if (list == NULL || pos < 0)
{
return NULL;
}
temp_circlelist = (CircleLinkList*)list;
//链表的首地址与小节点的地址相同
pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
//pcurrent =(CircleListNode*) &(temp_circlelist->head);
if (temp_circlelist->length <= 0 || pos >= temp_circlelist->length)
{
return NULL;
}
//辅助指针从头部跳到(pos-1) 处;头部、0、1、2、。。
for (i = 0; (i < pos && pcurrent->next != NULL); i ++)
{
pcurrent = pcurrent->next;
}
temp_circlelistconnected_node_delete = pcurrent->next;
pcurrent->next = temp_circlelistconnected_node_delete->next;
//pcurrent->next = pcurrent->next->next;
//如果从0位置删除
if (pcurrent == (CircleLinkListConnectedNode*)temp_circlelist)
{
//得到最后一个节点
lastnode = (CircleLinkListConnectedNode*)CircleLinkList_GetOneNode((List*)temp_circlelist,temp_circlelist->length - 1);
//最后一个节点的next域指向当前插入
if (lastnode != NULL)
{
lastnode->next = pcurrent->next;
//lastnode->next = temp_circlelist_node_delete->next;
//lastnode->next = temp_circlelist->head.next;
}
}
//长度减1
temp_circlelist->length--;
//如果删除的是游标指向的位置则游标下移
if (temp_circlelist->slider == temp_circlelistconnected_node_delete)
{
temp_circlelist->slider = temp_circlelistconnected_node_delete->next;
}
//长度为0就清空
if (temp_circlelist->length == 0)
{
temp_circlelist->head.next = NULL;
temp_circlelist->slider = NULL;
}
ret = (ListNode*)temp_circlelistconnected_node_delete;
return ret;
}
bool CircleLinkList_DeleteAllNode(List* list)
{
CircleLinkList* temp_circlelist = NULL;
if (list == NULL)
{
return false;
}
temp_circlelist = (CircleLinkList*)list;
while (temp_circlelist->length > 0 )
{
CircleLinkList_DeleteOneNode((List*)temp_circlelist,0);
}
return true;
}
ListNode* CircleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode)
{
CircleLinkList* temp_circlelist = NULL;
CircleLinkListConnectedNode* temp_circlelistconnected_node_delete = NULL;
CircleLinkListConnectedNode* pcurrent = NULL;
CircleLinkListConnectedNode* retnode = NULL;
int i = 0;
ListNode* ret = NULL;
if (list == NULL || listnode == NULL)
{
return NULL;
}
temp_circlelist = (CircleLinkList*)list;
temp_circlelistconnected_node_delete = (CircleLinkListConnectedNode*)listnode;
pcurrent = (CircleLinkListConnectedNode*)temp_circlelist;
for (i = 0; i < temp_circlelist->length; i ++)
{
pcurrent = pcurrent->next;
if (pcurrent == temp_circlelistconnected_node_delete)
{
retnode = pcurrent;
break;
}
}
if (retnode == NULL)
{
return NULL;
}
CircleLinkList_DeleteOneNode((List*)temp_circlelist,i);
ret =(ListNode*)retnode;
return ret;
}
//重置游标
ListNode* CircleLinkList_ResetSlider(List* list)
{
CircleLinkList* temp_circlelist = NULL;
CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
ListNode* ret = NULL;
if (list == NULL)
{
return NULL;
}
temp_circlelist = (CircleLinkList*)list;
temp_circlelist->slider = temp_circlelist->head.next;
temp_circlelistconnected_node = temp_circlelist->slider;
ret = (ListNode* )temp_circlelistconnected_node;
return ret;
}
//返回当前游标,
ListNode* CircleLinkList_GetCurrentSlider(List* list)
{
CircleLinkList* temp_circlelist = NULL;
CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
ListNode* ret = NULL;
if (list == NULL)
{
return NULL;
}
temp_circlelist = (CircleLinkList*)list;
temp_circlelistconnected_node = temp_circlelist->slider;
ret = (ListNode* )temp_circlelistconnected_node;
return ret;
}
//游标下移,并返回游标下移之前的节点
ListNode* CircleLinkList_SliderMoveToNext(List* list)
{
CircleLinkList* temp_circlelist = NULL;
CircleLinkListConnectedNode* temp_circlelistconnected_node = NULL;
ListNode* ret = NULL;
if (list == NULL)
{
return NULL;
}
temp_circlelist = (CircleLinkList*)list;
if (temp_circlelist->slider == NULL)
{
return NULL;
}
//得到当前游标指向的节点
temp_circlelistconnected_node = temp_circlelist->slider;
//游标下移,指向下一个节点
temp_circlelist->slider = temp_circlelistconnected_node->next;
//返回当初得到的节点
ret = (ListNode*)temp_circlelistconnected_node;
return ret;
}
/***********************以下为测试代码************************/
/*
typedef struct _tag_Teacher
{
CircleLinkListConnectedNode node;
int age ;
char name[];
}Teacher;
void main()
{
List* list = NULL;
Teacher t1,t2,t3,t4,t5;
int kk = 0;
Teacher* teacher = NULL;
t1.age = 21;t2.age = 22;t3.age = 23;t4.age = 24;t5.age = 25;
list = CircleLinkList_Create();
if (list == NULL)
{
printf("创建list失败");
}
//尾插法
CircleLinkList_InsertOneNode(list,(ListNode*)&t1,CircleLinkList_GetLength(list));
CircleLinkList_InsertOneNode(list,(ListNode*)&t2,CircleLinkList_GetLength(list));
CircleLinkList_InsertOneNode(list,(ListNode*)&t3,CircleLinkList_GetLength(list));
CircleLinkList_InsertOneNode(list,(ListNode*)&t4,CircleLinkList_GetLength(list));
CircleLinkList_InsertOneNode(list,(ListNode*)&t5,CircleLinkList_GetLength(list));
//打印2边,能输出2遍,没有越界,证明是循环链表
for (kk = 0; kk < 2*CircleLinkList_GetLength(list); kk ++)
{
teacher = (Teacher* )CircleLinkList_GetOneNode(list,kk);
printf("老师%d的年龄是%d",kk,teacher->age);
printf("\n");
}
CircleLinkList_DeleteOneNodeByNodePointer(list,(ListNode*)&t5);
printf("链表长度%d \n",CircleLinkList_GetLength(list));
for (kk = 0; kk < 2*CircleLinkList_GetLength(list); kk ++)
{
teacher = (Teacher* )CircleLinkList_GetOneNode(list,kk);
printf("老师%d的年龄是%d",kk,teacher->age);
printf("\n");
}
printf("链表长度%d \n",CircleLinkList_GetLength(list));
CircleLinkList_DeleteAllNode(list);
printf("链表长度%d \n",CircleLinkList_GetLength(list));
CircleLinkList_Destory(list);
system("pause");
}
*/
可能会调用其它头文件或源文件,如果调用,请翻看我的其它博客,对其头文件或源文件的实现。
good luck !