循环单向链表原理
循环单项链表项目结构
头文件RecycleLinlList.h
头文件具体代码
#ifndef RECYCLRLINKLIST
#define RECYCLRLINKLIST
#include <stdio.h>
#include <stdlib.h>
// 宏定义
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0
// 链表的小节点
typedef struct CIRCLELINKNODE {
struct CIRCLELINKNODE* next;
}CircleLinkNode;
// 链表的结构体
typedef struct CIRCLELINKLIST {
CircleLinkNode head;
int size;
}CircleLinkList;
// 针对链表结构体的操作API函数
typedef int (*COMPARENODE)(CircleLinkNode*,CircleLinkNode*);
// 打印的回调函数
typedef void(*PRINTNODE)(CircleLinkNode*);
// 初始化函数
CircleLinkList* Init_CircleLinkList();
// 插入函数
void Insert_CircleLinkList(CircleLinkList * clist,int pos, CIRCLELINKNODE* data);
// 获得第一个元素
CircleLinkNode* Front_CircleLinkList(CircleLinkList* clist);
// 根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList* clist, int pos);
// 根据值进行删除
void RemoveByValue_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data,COMPARENODE compare);
// 获得链表的长度
int Size_CircleLinkList(CircleLinkList* clist);
// 判断是否为空
int IsEmpty_CircleLinkList(CircleLinkList* clist);
//查找根据值查找
int Find_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare);
// 打印节点
void Print_CircleLinkList(CircleLinkList* clist, PRINTNODE print);
// 释放内存
void FreeSpace_CircleLinkList(CircleLinkList* clist);
#endif
cpp文件RecycleLinkList.cpp
cpp文件具体代码
// RecycleLinkList.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "RecycleLinlList.h"
// 初始化函数
CircleLinkList* Init_CircleLinkList() {
CircleLinkList* clist = (CircleLinkList*)malloc(sizeof(CircleLinkList));
clist->head.next = &(clist->head);
clist->size = 0;
return clist;
};
// 插入函数
void Insert_CircleLinkList(CircleLinkList* clist, int pos, CIRCLELINKNODE* data) {
if (clist == NULL) {
return;
}
if (data == NULL) {
return;
}
if (pos < 0 || pos >= clist->size) {
pos = clist->size;
}
// 根据位置查找节点:借助辅助指针变量
CircleLinkNode* pCurrent = &(clist->head);
// 使用for循环
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
// 将数据设置进入链表
data->next = pCurrent->next;
// 将数据放进去
pCurrent->next = data;
clist->size++;
};
// 获得第一个元素
CircleLinkNode* Front_CircleLinkList(CircleLinkList* clist) {
return clist->head.next;
};
// 根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList* clist, int pos) {
if (clist == NULL) {
return;
}
if (pos < 0 || pos >= clist->size) {
return;
}
// 更具pos找删除节点的前一个节点,使用辅助指针变量
CircleLinkNode* pCurrent = &(clist->head);
for (int i = 0; i < pos; i++) {
// 指针不停的向后移动
pCurrent = pCurrent->next;
}
// 缓存当前节点的下一个节点
CircleLinkNode* pNext = pCurrent->next;
pCurrent->next = pNext->next;
clist->size--;
};
// 根据值进行删除
void RemoveByValue_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) {
if (clist == NULL) {
return;
}if (data == NULL) {
return;
}
// 根据值进行删除:循环链表
CircleLinkNode* pPrev = &(clist->head);
CircleLinkNode* pCurrent = clist->head.next;
int i = 0;
int flag = -1;
for (i = 0; i < clist->size; i++) {
if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) {
pPrev->next = pCurrent->next;
break;
}
pPrev = pCurrent;
pCurrent = pPrev->next;
}
};
// 获得链表的长度
int Size_CircleLinkList(CircleLinkList* clist) {
return clist->size;
};
// 判断是否为空
int IsEmpty_CircleLinkList(CircleLinkList* clist) {
if (clist->size == 0) {
return CIRCLELINKLIST_TRUE;
}
return CIRCLELINKLIST_FALSE;
};
//查找根据值查找
int Find_CircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARENODE compare) {
if (clist == NULL) {
return 0;
}if (data == NULL) {
return 0;
}
CircleLinkNode* pCurrent = clist->head.next;
int flag = -1;
for (int i = 0; i < clist->size; i++) {
if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE) {
flag = i;
break;
}
pCurrent = pCurrent->next;
}
return flag;
};
// 打印节点
void Print_CircleLinkList(CircleLinkList* clist, PRINTNODE print) {
if (clist == NULL) {
return;
}
// 辅助指针变量
CircleLinkNode* pCurrent = clist->head.next;
for (int i = 0; i < clist->size * 1; i++) {
// 指向头结点
if (pCurrent == &(clist->head)) {
pCurrent = pCurrent->next;
printf("------------------------------\n");
}
print(pCurrent);
pCurrent = pCurrent->next;
}
};
// 释放内存
void FreeSpace_CircleLinkList(CircleLinkList* clist) {
if (clist == NULL) {
return;
}
free(clist);
};
typedef struct PERSON {
CircleLinkNode node;
char name[64];
int age;
int score;
}Person;
void MyPrint(CircleLinkNode* data) {
Person* p = (Person*)data;
printf("Name = %s Age = %d Score = %d\n", p->name, p->age, p->score);
}
int MyCompare(CircleLinkNode* data1, CircleLinkNode* data2) {
Person* p1 = (Person*)data1;
Person* p2 = (Person*)data2;
if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age && p1->score== p2->score) {
return CIRCLELINKLIST_TRUE;
}
CIRCLELINKLIST_FALSE;
}
int main(void)
{
// 创建循环链表
CircleLinkList* list = Init_CircleLinkList();
// 创建数据
PERSON z1, z2, z3;
strcpy(z1.name, "qq");
strcpy(z2.name, "zz");
strcpy(z3.name, "azaz");
z1.age = 22;
z2.age = 22;
z3.age = 22;
z1.score = 100;
z2.score = 100;
z3.score = 100;
// 数据入链表
Insert_CircleLinkList(list, 100, (CircleLinkNode*)&z1);
Insert_CircleLinkList(list, 100, (CircleLinkNode*)&z2);
Insert_CircleLinkList(list, 100, (CircleLinkNode*)&z3);
// 打印
Print_CircleLinkList(list, MyPrint);
Person pDel;
strcpy(pDel.name, "qq");
pDel.age = 22;
pDel.score = 100;
// 根据值删除
RemoveByValue_CircleLinkList(list,(CircleLinkNode*)&pDel,MyCompare);
// 打印
printf("--------------------------\n");
Print_CircleLinkList(list, MyPrint);
// 释放内存
FreeSpace_CircleLinkList(list);
system("pause");
return 0;
}
运行结果展示