/* * LinkList.h * * Created on: 2019年7月20日 * Author: Administrator */ #ifndef SRC_LINKLIST_H_ #define SRC_LINKLIST_H_ #include<stdlib.h> #include<stdio.h> //鏈表節點 typedef struct LINKNODE { void *data; struct LINKNODE *next; } LinkNode; //鏈表結構體 typedef struct LINKLIST { LinkNode *head; int size; }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 Size_LinkList(LinkList *list); //查找 int Find_LinkList(LinkList *list, void* data); //打印鏈表節點 void Print_LinkList(LinkList *list, PRINTLINKNODE print); // 返回第一個節點 void *Front_LinkList(LinkList *list); // 釋放鏈表 void FreeSpace_LinkList(LinkList *list); #endif /* SRC_LINKLIST_H_ */
/* * LinkList.c * * Created on: 2019年7月20日 * Author: Administrator */ #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) { return; } if(data == NULL) { return; } //安全驗證 if(pos < 0 || pos > list->size) { pos = list->size; } //建立新的節點 LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode)); newnode->data = data; newnode->next = NULL; //找節點 //輔助指針變量 LinkNode *pCurrent = list->head; for(int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } //新節點加入鏈表 newnode->next = pCurrent->next; pCurrent->next = newnode; 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 = pDel->next; free(pDel); list->size--; } //得到鏈表的長度 int Size_LinkList(LinkList *list) { return list->size; } //查找 int Find_LinkList(LinkList *list, void* data) { if(list == NULL){ return -1; } if(data == NULL){ return -1; } //遍歷查找 LinkNode* pCurrent = list->head->next; int i = 0; while(pCurrent != NULL){ if(pCurrent->data == data){ break; } i++; pCurrent = pCurrent->next; } return i; } //打印鏈表節點 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; } } // 返回第一個節點 void *Front_LinkList(LinkList *list) { return list->head->next->data; } // 釋放鏈表 void FreeSpace_LinkList(LinkList *list) { if(list == NULL){ return; } //輔助指針變量 LinkNode *pCurrent = list->head; while(pCurrent != NULL){ //先緩衝下一個節點 LinkNode *pNext = pCurrent->next; free(pCurrent); pCurrent = pNext; } //釋放鏈表自己 free(list); }
#include <stdio.h> #include <stdlib.h> #include <string.h> #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(){ printf("link list test! \n"); //建立鏈表 LinkList *list = Init_LinkList(); //建立數據 Person p1 = {"jarvis",18,100}; Person p2 = {"zhangsan",19,99}; Person p3 = {"lishi",18,100}; Person p4 = {"wangwu",23,70}; Person p5 = {"zhaoliu",18,100}; //數據插入 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); printf("--------------------\n"); //打印 Print_LinkList(list, MyPrint); printf("--------------------\n"); printf("返回第一個結點\n"); //返回第一個結點 Person *ret = (Person*)Front_LinkList(list); printf("Name: %s Age: %d Score:%d \n", ret->name, ret->age, ret->score); //銷燬鏈表 FreeSpace_LinkList(list); system("pause"); return 0; }