项目结构
头文件代码
头文件代码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如果不相等的话就返回-1if (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;}
程序运行结果展示