
 
 
 
项目结构
 
头文件代码
头文件代码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;
}
 
程序运行结果展示
 



















