LinkList.h
#include <WINDOWS.H> #include <stdio.h> // list Summary point typedef struct LINKNODE { LINKNODE * Next; } LinkNode; // linked list node typedef struct LINKLIST { LinkNode head; int size; } LinkList; // traversing the nodes function pointer typedef void (* PRINTLINKNODE) (LinkNode * ); // comparison function pointer typedef int (* COMPARENODE) (* LinkNode, LinkNode * ); // initialize list LinkList * Init_LinkList (); // The position of a node parenthesis void Insert_LinkList (LinkList List *, int POS, LinkNode * Data); // delete a node according to the position void RemoveByPos_LinkList (LinkList List *, int POS); // Find the node int Find_LinkList (LinkList List *, LinkNode * Data, COMPARENODE Compare); // returns the size of the list int Size_LinkList (LinkList * List); // print list void Print_LinkList (LinkList * List, PRINTLINKNODE Print); // release memory void FreeMem_LinkList (* List LinkList );
LinkList.cpp
#include " LinkList.h " // initialization list LinkList * Init_LinkList () { LinkList * List = (LinkList *) the malloc ( the sizeof (LinkList)); List -> size = 0 ; List -> head.next = NULL; return List; } // The node position of a parenthesis void Insert_LinkList (LinkList List *, int POS, LinkNode * Data) { IF (List Data == NULL || == 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 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; } pCurrent->next = pCurrent->next->next; list->size--; } // 查找结点 int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) { if (list == NULL || data == NULL) { return -1; } int flag = -1; int index = 0; LinkNode* pCurrent = list->head.next; while (pCurrent != NULL) { if (compare(data, pCurrent) == 0) { flag = index; break; } pCurrent = pCurrent->next; index++; } return flag; } // 返回链表的大小 int Size_LinkList(LinkList* list) { if (list == NULL) { return -1; } return list->size; } // 打印链表 void Print_LinkList(LinkList* list, PRINTLINKNODE print) { if (list == NULL) { return; } LinkNode* pCurrent = list->head.next; while (pCurrent != NULL) { print(pCurrent); pCurrent = pCurrent->next; } } // 释放内存 void FreeMem_LinkList(LinkList* list) { if (list == NULL) { return; } free(list); }
main.cpp
#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 ((p1->age == p2->age) && (strcmp(p1->name, p2->name) == 0)) { return 0; } return -1; } int main() { //创建链表 LinkList* list = Init_LinkList(); //创建数据 Person p1, p2, p3, p4, p5; strcpy_s(p1.name, sizeof("aaa"), "aaa"); strcpy_s(p2.name, sizeof("bbb"), "bbb"); strcpy_s(p3.name, sizeof("ccc"), "ccc"); strcpy_s(p4.name, sizeof("ddd"), "ddd"); strcpy_s(p5.name, sizeof("eee"), "eee"); p1.age = 10; p2.age = 20; p3.age = 30; p4.age = 40; p5.age = 50 ; // the node in the linked list 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 Print_LinkList (List, MyPrint); // delete node RemoveByPos_LinkList ( List, 2 ); // print printf ( "--------------- \ the n- " ); Print_LinkList (List, MyPrint); printf ( " --------------- \ the n- " ); // Find the Person findP; strcpy_s (findP.name, sizeof ( " bbb " ), " bbb " ); findP.age = 20 ; int POS = Find_LinkList (List, (LinkNode *) & findP, MyCompare); printf ( " position: D% \ n- " , POS); // release list memory FreeMem_LinkList (List); getchar (); return 0; }