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\n", 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("---------------\n"); Print_LinkList(list, MyPrint); //返回第一個結點 printf("-----查找結果------------\n"); Person* ret = (Person*)Front_LinkList(list); printf("Name:%s Age:%d Score:%d\n", ret->name, ret->age, ret->score); //銷毀鏈表 Front_LinkList(list); getchar(); return 0; }