/* * 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; }