LinkList.h
#include <windows.h> #include <stdio.h> // 链表结点 typedef struct LINKNODE { void* data; // 可以指向任何类型的数据 LINKNODE* next; }LinkNode; // 链表结构体 typedef struct LINKLIST { int size; LinkNode* head; }LinkList; // 打印函数指针 typedef void(*PRINTLINKNODE)(void*); // 初始化链表 LinkList* Init_LinkList(); // 指定位置插入 void Insert_LinkList(LinkList* list, int pos, void* data); // 指定位置删除 void RemoveByPos_LinkList(LinkList* list, int pos); // 获得链表的长度 int GetLinkListSize(LinkList* list); // 查找(根据数据返回索引) int Find_LinkList(LinkList* list, void* data); // 返回第一个结点 void* Front_LinkList(LinkList* list); // 释放链表内存 void FreeMem_LinkList(LinkList* list); // 打印链表 void Print_LinkList(LinkList* list, PRINTLINKNODE);
LinkList.cpp
#include "LinkList.h" // 初始化链表 LinkList* Init_LinkList() { LinkList* list = (LinkList*)malloc(sizeof(LinkList)); list->size = 0; // 头结点是不保存数据的 list->head = (LinkNode*)malloc(sizeof(LinkNode)); list->head->data = NULL; list->head->next = NULL; return list; } // 指定位置插入 void Insert_LinkList(LinkList* list, int pos, void* data) { if (list == NULL || data == NULL) { return; } if (pos < 0 || pos > list->size) { pos = list->size; } // 创建新的结点 LinkNode* InsertNode = (LinkNode*)malloc(sizeof(LinkNode)); InsertNode->data = data; InsertNode->next = NULL; // 找结点 LinkNode* pCurrent = list->head; for (int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } // 将新结点插入链表 InsertNode->next = pCurrent->next; pCurrent->next = InsertNode; // 链表大小加1 list->size++; } // 指定位置删除 void RemoveByPos_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; } LinkNode* pDel = pCurrent->next; pCurrent->next = pCurrent->next->next; free(pDel); // 链表长度减一 list->size--; } // 获得链表的长度 int GetLinkListSize(LinkList* list) { if (list == NULL) { return - 1; } return list->size; } // 查找(根据数据返回索引) int Find_LinkList(LinkList* list, void* data) { if (list == NULL || data == NULL) { return -1; } int pos = -1; LinkNode* pCurrent = list->head->next; for (int i = 0; i < list->size; i++) { if (pCurrent->data == data) { pos = i; break; } pCurrent = pCurrent->next; } return pos; } // 返回第一个结点 void* Front_LinkList(LinkList* list) { return list->head->next->data; } // 释放链表内存 void FreeMem_LinkList(LinkList* list) { if (list == NULL) { return; } LinkNode* pCurrent = list->head; while (pCurrent != NULL) { LinkNode* pDel = pCurrent; pCurrent = pCurrent->next; free(pDel); } list->size = 0; free(list); } // 打印链表 void Print_LinkList(LinkList* list, PRINTLINKNODE print) { if (list == NULL) { return; } LinkNode* pCurrent = list->head->next; while (pCurrent != NULL) { print(pCurrent->data); pCurrent = pCurrent->next; } }
main.cpp
#include "LinkList.h" //自定义数据类型 typedef struct PERSON { char name[64]; int age; int score; }Person; //打印函数 void MyPrint(void* data) { Person* p = (Person*)data; printf("Name:%s Age:%d Score:%d ", p->name, p->age, p->score); } int main() { //创建链表 LinkList* list = Init_LinkList(); //创建数据 Person p1 = { "aaa", 18, 100 }; Person p2 = { "bbb", 19, 99 }; Person p3 = { "ccc", 20, 101 }; Person p4 = { "ddd", 17, 97 }; Person p5 = { "eee", 16, 59 }; //数据插入链表 Insert_LinkList(list, 0, &p1); Insert_LinkList(list, 0, &p2); Insert_LinkList(list, 0, &p3); Insert_LinkList(list, 0, &p4); Insert_LinkList(list, 0, &p5); //打印 Print_LinkList(list, MyPrint); //删除3 RemoveByPos_LinkList(list, 3); //打印 printf("--------------- "); Print_LinkList(list, MyPrint); //返回第一个结点 printf("-----查找结果------------ "); Person* ret = (Person*)Front_LinkList(list); printf("Name:%s Age:%d Score:%d ", ret->name, ret->age, ret->score); //销毁链表 Front_LinkList(list); getchar(); return 0; }