代码实现形式
首先我暂时没有做根据值删除,因为我的回调函数比较出现问题,之后在更新
#include <stdlib.h>
#include <stdio.h>
//链表小节点
typedef struct CIRCLELINKNODE
{
struct CIRCLELINKNODE* next;
}CircleLinkNode;
//链表结点
typedef struct CIRCLELINKLIST
{
CircleLinkNode head;
int size;
}CircleList;
//编写针对链表结构体操作的API函数
#define CIRCLELINKLINK_TRUE 1;
#define CIRCLELINKLINK_FALSE 0;
//遍历函数指针
typedef void(*PRINTNODE)(CircleLinkNode *);
//比较函数指针
typedef int(*COMPARENODE)(CircleLinkNode*, CircleLinkNode*);
//初始化链表
CircleList *Init_LinkList();
//插入
void Insert_CircleLinkList(CircleList *list,int pos,CircleLinkNode *data);
//获得第一个值
CircleLinkNode *Front_CircleLinkLint(CircleList *list);
//根据位置删除
void Remove_CircleLinkList(CircleList *list,int pos);
//根据值删除
//void Remove_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare);
//判断链表是否为空
int IsEmpty_CircleLinkList(CircleList *list);
//根据值查找
//int Find_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare);
//根据位置查找
int Findvalue_CircleLinkList(CircleList *list,int pos);
//返回链表大小
int Size_CircleLinkList(CircleList *list);
//打印
void Print_CircleLinkList(CircleList *list,PRINTNODE print);
//释放链表内存
void PressSpace_CircleLinkList(CircleList *list);
实现代码
#include "CircleLinkList.h"
//初始化链表
CircleList *Init_LinkList()
{
CircleList *list=(CircleList *)malloc(sizeof(CircleList));
list->size=0;
//循环链表,这样可以减少代码量,定义最后一个结点直接指向第一个结点
list->head.next=&(list->head);
return list;
}
//插入
void Insert_CircleLinkList(CircleList *list,int pos,CircleLinkNode *data)
{
CircleLinkNode *pCurent=&(list->head);
if(list==NULL)
{
return;
}
if(data==NULL)
{
return;
}
if(pos<0||pos>list->size)
{
pos=list->size;
}
for(int i=0;i<pos;i++)
{
pCurent=pCurent->next;
}
//一定不要操作原指针
data->next=pCurent->next;
pCurent->next=data;
list->size++;
}
//获得第一个元素
CircleLinkNode *Front_CircleLinkLint(CircleList *list)
{
return list->head.next;
}
//删除
void Remove_CircleLinkList(CircleList *list,int pos)
{
if(list==NULL)
{
return;
}
if(pos<0||pos>list->size)
{
return;
}
CircleLinkNode *pCurent=&(list->head);
for(int i=0;i<pos;i++)
{
pCurent=pCurent->next;
}
pCurent->next=pCurent->next->next;
list->size--;
}
//根据值删除
//void Remove_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare)
//{
// if(list==NULL)
// {
// return;
// }
// if(data==NULL)
// {
// return;
// }
// //从值查找,所以我把位置定在next
// CircleLinkNode *pPrew=&list->head;
// CircleLinkNode *pCurent=list->head.next;
// for(int i=0;i<list->size;i++)
// {
// //pCurent=pCurent->next;
// if(compare(pCurent,data)==CIRCLELINKLINK_TRUE)
// {
// pPrew->next=pCurent->next;
// break;
// }
// pPrew=pCurent;
// pCurent=pPrew->next;
// }
//
// list->size--;
//}
//判断链表是否为空
int IsEmpty_CircleLinkList(CircleList *list)
{
if(list->size==0)
{
//是空
return CIRCLELINKLINK_TRUE;
}
else
{//非空
return CIRCLELINKLINK_FALSE;
}
}
//根据值查找
//int Find_CircleLinkList(CircleList *list,CircleLinkNode *data,COMPARENODE compare)
//{
// if(list==NULL)
// {
// return -1;
// }
// if(data==NULL)
// {
// return -1;
// }
// CircleLinkNode *pCurrent=list->head.next;
// int flag=-1;
// for(int i=0;i<list->size;i++)
// {
// if(compare(pCurrent,data)==CIRCLELINKLINK_TRUE)
// {
// flag=i;
// break;
// }
// pCurrent=pCurrent->next;
// }
// return flag;
//}
//根据位置查找
int Findvalue_CircleLinkList(CircleList *list,int pos)
{
return 0;
}
//返回链表大小
int Size_CircleLinkList(CircleList *list)
{
return list->size;
}
//打印
void Print_CircleLinkList(CircleList *list,PRINTNODE print)
{
if(list==NULL)
{
return;
}
CircleLinkNode *pCurrent=list->head.next;
//打印俩次,循环链表
for(int i=0;i<list->size*3;i++)
{
if(pCurrent==&list->head)
{
printf("---------------------\n");
pCurrent=pCurrent->next;
}
print(pCurrent);
pCurrent=pCurrent->next;
}
}
//释放链表内存
void PressSpace_CircleLinkList(CircleList *list)
{
if(list==NULL)
{
return;
}
free(list);
}
我是采用企业链表格式写的,可以节约代码量