闲着没事,借助VS开发工具,用C语言写了个通用/企业链表,具体代码文件分为LinkList.h、LinkList.c、main.c LinkList.h源码: #ifndef LINKLIST_H #define LINKLIST_H #include <stdlib.h> #include <stdio.h> //链表小结点 typedef struct LINKNODE { struct LINKNODE* next; }LinkNode; //链表结点 typedef struct LINKLIST { LinkNode head; int size; }LinkList; //遍历函数指针 typedef void(*PRINTNODE)(LinkNode*); //比较函数指针 typedef int(*COMPARENODE)(LinkNode*, LinkNode*); //初始化链表 LinkList* Init_LinkList(); //插入 void Insert_LinkList(LinkList* list, int pos, LinkNode* data); //查找 int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare); //返回链表大小 int Size_LinkList(LinkList* list); //打印 void Print_LinkList(LinkList* list, PRINTNODE print); //删除 void Remove_LinkList(LinkList* list, int pos); //释放链表内存 void FreeSpace_LinkList(LinkList* list); #endif LinkList.c源码: #include "LinkList.h" //初始化链表 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 || data == NULL) { return; } if (pos < 0 || pos > list->size) { pos = list->size; } int i = 0; //查找插入位置 LinkNode* pCurrent = &(list->head); while (i < pos) { pCurrent = pCurrent->next; i++; } //插入新节点 data->next = pCurrent->next; pCurrent->next = data; list->size++; } //查找 int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) { if (list == NULL || data == NULL) { return -1; } LinkNode* pCurrent = list->head.next; int pos = -1; int i = 0; while (pCurrent != NULL) { if (compare(pCurrent, data) == 0) { pos = i; break; } pCurrent = pCurrent->next; i++; } return pos; } //返回链表大小 int Size_LinkList(LinkList* list) { if (list == NULL) { return -1; } return list->size; } //打印 void Print_LinkList(LinkList* list, PRINTNODE print) { if (list == NULL) { return; } LinkNode* pCurrent = list->head.next; while (pCurrent != NULL) { print(pCurrent); pCurrent = pCurrent->next; } } //删除 void Remove_LinkList(LinkList* list, int pos) { if (list == NULL) { return; } if (pos < 0 || pos >= list->size) { return; } //辅助指针变量 LinkNode* pCurrent = &(list->head); LinkNode* delNode = pCurrent->next; int i = 0; while (i < pos) { pCurrent = pCurrent->next; delNode = pCurrent->next; i++; } //删除结点 pCurrent->next = delNode->next; list->size--; } //释放链表内存 void FreeSpace_LinkList(LinkList* list) { if (list == NULL) { return; } free(list); } main.c源码: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "LinkList.h" typedef struct PERSON { struct LINKNODE node; char name[20]; int age; }Person; void MyPrint(LinkNode* node) { if (node == NULL) { return; } Person* p = (Person*)node; 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; } int main(void) { //创建数据 Person p1 = { NULL, "aaa", 21 }; Person p2 = { NULL, "bbb", 22 }; Person p3 = { NULL, "ccc", 23 }; Person p4 = { NULL, "ddd", 24 }; Person p5 = { NULL, "eee", 25 }; //创建链表 LinkList* list = Init_LinkList(); //将结点插入链表 Insert_LinkList(list, 0, (LinkNode*)&p1); Insert_LinkList(list, 0, (LinkNode*)&p2); Insert_LinkList(list, 0, (LinkNode*)&p3); Insert_LinkList(list, 2, (LinkNode*)&p4); Insert_LinkList(list, 0, (LinkNode*)&p5); printf("链表大小;%d\n", Size_LinkList(list)); Print_LinkList(list, MyPrint);//打印 printf("-----------------\n"); //删除结点 Remove_LinkList(list, 3); Print_LinkList(list, MyPrint); printf("-----------------\n"); //查找 printf("p2的位置:%d\n", Find_LinkList(list, (LinkNode*)&p2, MyCompare)); printf("-----------------\n"); //释放链表内存 FreeSpace_LinkList(list); printf("\n"); system("pause"); return 0; }