/* * 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 { struct LINKNODE *next; } LinkNode; //鏈表結構體 typedef struct LINKLIST { LinkNode head; // 和普通鏈表的區別, 不是linkNode指針,而是一個 LinkNode 結構體 int size; }LinkList; //打印函數指針 typedef void(*PRINTLINKNODE)(LinkNode *); //比較的函數指針 typedef int(*COMPARENODE)(LinkNode *, LinkNode *); //初始化鏈表 LinkList * Init_LinkList(); //在指定位置插入 void Insert_LinkList(LinkList *list, int pos, LinkNode *data); //刪除指定位置的值 void RemoveByPos_LinkList(LinkList *list, int pos); //得到鏈表的長度 int Size_LinkList(LinkList *list); //查找 int Find_LinkList(LinkList *list, LinkNode* data, COMPARENODE compare); //打印鏈表節點 void Print_LinkList(LinkList *list, PRINTLINKNODE print); // 返回第一個節點 LinkNode *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->head.next = NULL; list->size = 0; return list; } //在指定位置插入 void Insert_LinkList(LinkList *list, int pos, LinkNode *data) { if(list == 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){ pos = list->size; } //輔助指針變量 LinkNode *pCurrent = &(list->head); while(pCurrent != NULL){ pCurrent = pCurrent->next; } //刪除節點 pCurrent->next = pCurrent->next->next; list->size--; } //得到鏈表的長度 int Size_LinkList(LinkList *list) { return list->size; } //查找 int Find_LinkList(LinkList *list, LinkNode* data, COMPARENODE compare) { if(list == NULL) { return -1; } if(data == NULL){ return -1; } //輔助指針變量 LinkNode *pCurrent = list->head.next; int index = 0; int flag = -1; while(pCurrent != NULL){ if(compare(pCurrent, data) == 0){ flag = index; break; } index++; pCurrent = pCurrent->next; } return flag; } //打印鏈表節點 void Print_LinkList(LinkList *list, PRINTLINKNODE print) { if(list == NULL){ return; } //輔助指針 list->head.next 指向第一個有效值 LinkNode *pCurrent = list->head.next; while(pCurrent != NULL){ print(pCurrent); pCurrent = pCurrent->next; } } // 返回第一個節點 LinkNode *Front_LinkList(LinkList *list) { return (LinkNode *)&list->head; } // 釋放鏈表 void FreeSpace_LinkList(LinkList *list) { if(list == NULL){ return; } free(list); }
#include "LinkList.h" #include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct PERSON { LinkNode *next; 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(strcmp(p1->name, p2->name) && p1->age == p2->age) { return 0; } return -1; } int main(){ printf("企業鏈表 \n"); //建立鏈表 LinkList *list = Init_LinkList(); //建立數據 Person p1,p2,p3,p4,p5; strcpy(p1.name, "jarvis1"); strcpy(p2.name, "jarvis2"); strcpy(p3.name, "jarvis3"); strcpy(p4.name, "jarvis4"); strcpy(p5.name, "jarvis5"); p1.age = 11; p2.age = 12; p3.age = 13; p4.age = 14; p5.age = 15; //將結點加入鏈表 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); //打印 printf("----------\n"); Print_LinkList(list, MyPrint); //查找 Person *findP; strcpy(findP->name, "Jarvis1"); findP->age = 15; int findFlag = Find_LinkList(list, findP, MyCompare); printf("findFlag %d \n",findFlag); //刪除鏈表 printf("刪除鏈表----------\n"); printf("----------\n"); system("pause"); //刪除鏈表 FreeSpace_LinkList(list); return 0; }