项目结构
头文件代码
头文件代码LinkList.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
// 链表小节点
typedef struct LINKBODE {
struct LINKBODE* next;
}LinkNode;
// 遍历的函数指针
typedef void(*PRINTNODE)(LinkNode*);
// 比较的函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);
// 链表节点
typedef struct LINKLIST {
LinkNode head;
int size;
}LinkList;
// 初始化链表
LinkList* Init_LinkList();
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data);
// 删除
void Remove_LinkList(LinkList* list, int pos);
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare);
// reback
int Size_LinkList(LinkList* list);
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print);
// 释放链表
void FreeSpace_LinkList(LinkList* list);
#endif
cpp代码截图
cpp文件详细代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "LinkList.h"
typedef struct PERSON {
// 链表的节点,属于是进行链接的挂钩
LinkNode node;
char name[64];
int age;
}Person;
// 回调函数
void MyPrint(LinkNode* data) {
Person* p = (Person*)data;
printf("Name = %s Age = %d\n", p->name, p->age);
}
// 回调函数
int MyCompare(LinkNode* node1, LinkNode* node2) {
// 强制类型转换
Person* p1 = (Person*)node1;
Person* p2 = (Person*)node2;
// 判断
if (strcmp(p1->name, p2->name) == 0 && p1->age == p2 -> age) {
return 0;
}
return -1;
}
// 初始化链表
LinkList* Init_LinkList() {
// 使用这种方式初始化的链表不需要分配头结点
LinkList* list = (LinkList*)malloc(sizeof(LinkList));
list->head.next = NULL;
list->size = 0;
return list;
};
// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data) {
// 对链表的参数进行判断
if (list == NULL) {
return;
}
if (data == NULL) {
return;
}
if (pos < 0 || pos > list->size) {
pos = list->size;
}
// 插入节点,查找插入位置(辅助指针变量)
LinkNode* pCurrent = &(list->head);
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
// 插入新的节点
data->next = pCurrent->next;
pCurrent->next = data;
list->size++;
};
// 删除
void Remove_LinkList(LinkList* list, int pos) {
// 判断
if (list == NULL) {
return;
}
if (pos < 0 || pos >= list->size) {
return;
}
// 辅助指针变量
LinkNode* pCurrent = &(list->head);
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
// 删除节点
pCurrent->next = pCurrent->next->next;
list->size--;
};
// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) {
if (list == NULL) {
return -1;
}
if (data == NULL) {
return -1;
}
// 辅助指针变量进行遍历,获取到第一个数据
LinkNode* pCurrent = list->head.next;
int index = 0;
int flag = -1;
// 使用while循环进行遍历
while (pCurrent != NULL) {
// 判断,如果相等的话就返回0如果不相等的话就返回-1
if (compare(pCurrent, data) == 0) {
flag = index;
break;
}
pCurrent = pCurrent->next;
index++;
}
return flag;
};
// reback
int Size_LinkList(LinkList* list) {
return 0;
};
// 打印
void Print_LinkList(LinkList* list, PRINTNODE print) {
if (list == NULL) {
return;
}
// 使用辅助指针变量进行遍历
LinkNode* pCurrent = list->head.next;
// 使用while循环
while (pCurrent != NULL) {
print(pCurrent);
pCurrent = pCurrent->next;
}
};
// 释放链表
void FreeSpace_LinkList(LinkList* list) {
// 释放内存空间,根据初始化的内容进行释放
if (list == NULL) {
return;
}
free(list);
};
int main(void)
{
// 创建一个链表
LinkList* list = Init_LinkList();
// 创建数据
Person p1, p2, p3, p4, p5;
// 拷贝赋值
strcpy(p1.name, "aaa");
strcpy(p2.name, "nnn");
strcpy(p3.name, "hhh");
strcpy(p4.name, "qqq");
strcpy(p5.name, "www");
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;
// 将节点插入到链表:企业级链表相当于是将指针串联起来,同时带上数据,实际上并没有上传数据
Insert_LinkList(list, 0, (LinkNode*)&p1);
Insert_LinkList(list, 0, (LinkNode*)&p2);
Insert_LinkList(list, 0, (LinkNode*)&p3);
Insert_LinkList(list, 0, (LinkNode*)&p4);
Insert_LinkList(list, 0, (LinkNode*)&p5);
// 打印
Print_LinkList(list, MyPrint);
// 删除节点
Remove_LinkList(list, 2);
// 打印
printf("--------------------\n");
Print_LinkList(list, MyPrint);
// 查找
Person findP ;
strcpy(findP.name, "aaa");
findP.age = 10;
int pos = Find_LinkList(list,(LinkNode*)&findP, MyCompare);
printf("位置 = %d\n", pos);
// 释放链表内存
FreeSpace_LinkList(list);
system("pause");
return 0;
}
程序运行结果展示