二 线性表链式存储之企业链表
线性表链式存储之企业链表
一丶企业链表介绍
不受业务结构而限制,在我们用的数据类型发生改变时并不需要去改变底层的链表结构.
二丶企业链表实现
enterpriselist.h
1 #pragma once 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 //小结点 6 typedef struct LinkNode 7 { 8 LinkNode* next; 9 }LinkNode; 10 11 //链表结构体 12 typedef struct LinkList 13 { 14 LinkNode head; 15 int size; 16 }LinkList; 17 18 //遍历函数指针 19 typedef void(*PRINTNODE)(LinkNode* data); 20 21 //比较函数指针 22 typedef int(*COMPARENODE)(LinkNode*, LinkNode*); 23 24 //链表初始化 25 LinkList* init_LinkList(); 26 27 //根据位置插入数据 28 void insert_LinkList(LinkList* list, int pos, LinkNode* data); 29 30 //删除 31 void remove_LinkList(LinkList* list, int pos); 32 33 //查找 34 int find_LinkList(LinkList* list, LinkNode *data, COMPARENODE compare); 35 36 //返回链表大小 37 int size_LinkList(LinkList* list); 38 39 //遍历 40 void print_LinkList(LinkList* list, PRINTNODE myprint); 41 42 //释放链表内存 43 void free_LinkList(LinkList* list);
enterpriselist.c
1 #include "enterpriselist.h" 2 3 //链表初始化 4 LinkList* init_LinkList() 5 { 6 LinkList* list = (LinkList*)malloc(sizeof(LinkList*)); 7 list->head.next = NULL; 8 list->size = 0; 9 return list; 10 } 11 12 //根据位置插入数据 13 void insert_LinkList(LinkList* list, int pos, LinkNode* data) 14 { 15 if (list == NULL) 16 return; 17 if (data == NULL) 18 return; 19 if (pos <0 || pos>list->size) 20 pos = list->size; 21 //查找插入位置 22 LinkNode* pCurrent = &(list->head); 23 for (int i = 0; i < pos; i++) 24 { 25 pCurrent = pCurrent->next; 26 } 27 //插入新节点 28 data->next = pCurrent->next; 29 pCurrent->next = data; 30 31 list->size++; 32 } 33 34 35 //删除 36 void remove_LinkList(LinkList* list, int pos) 37 { 38 if (list == NULL) 39 return; 40 if (pos < 0 || pos >= list->size) 41 return; 42 LinkNode* pCurrent = &(list->head); 43 for (int i = 0; i < pos; i++) 44 { 45 pCurrent = pCurrent->next; 46 } 47 pCurrent->next = pCurrent->next->next; 48 list->size--; 49 } 50 51 //查找 52 int find_LinkList(LinkList* list, LinkNode *data, COMPARENODE compare) 53 { 54 if (list == NULL) 55 return -1; 56 if (data == NULL) 57 return -1; 58 LinkNode* pCurrent = list->head.next; 59 int index = 0; 60 int flag = -1; 61 while (pCurrent != NULL) 62 { 63 if (compare(pCurrent, data) == 0) 64 { 65 flag = index; 66 break; 67 } 68 pCurrent = pCurrent->next; 69 index++; 70 } 71 return flag; 72 } 73 74 //返回链表大小 75 int size_LinkList(LinkList* list) 76 { 77 return list->size; 78 } 79 80 //遍历 81 void print_LinkList(LinkList* list, PRINTNODE print) 82 { 83 if (list == NULL) 84 return; 85 LinkNode* pCurrent = list->head.next; 86 while (pCurrent) 87 { 88 print(pCurrent); 89 pCurrent = pCurrent->next; 90 } 91 } 92 93 //释放链表内存 94 void free_LinkList(LinkList* list) 95 { 96 if (list != NULL) 97 return; 98 free(list); 99 }
main.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include "enterpriselist.h" 3 #include <string> 4 typedef struct Person 5 { 6 LinkNode node;//只能是第一行,相当于是挂钩 7 char name[64]; 8 int age; 9 }Person; 10 11 void MyPrint(LinkNode* data) 12 { 13 Person *p = (Person*)data; 14 printf("姓名:%s,年龄:%d\n", p->name, p->age); 15 } 16 17 int MyCompare(LinkNode* node1, LinkNode* node2) 18 { 19 Person* p1 = (Person*)node1; 20 Person* p2 = (Person*)node2; 21 if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age) 22 { 23 return 0; 24 } 25 return -1; 26 } 27 28 int main() 29 { 30 LinkList* list = init_LinkList(); 31 Person p1, p2, p3, p4, p5; 32 strcpy(p1.name, "张三"); 33 strcpy(p2.name, "李四"); 34 strcpy(p3.name, "王五"); 35 strcpy(p4.name, "陈六"); 36 strcpy(p5.name, "刘贝"); 37 38 p1.age = 20; 39 p2.age = 22; 40 p3.age = 19; 41 p4.age = 25; 42 p5.age = 27; 43 insert_LinkList(list, 0, (LinkNode*)&p1); 44 insert_LinkList(list, 0, (LinkNode*)&p2); 45 insert_LinkList(list, 0, (LinkNode*)&p3); 46 insert_LinkList(list, 0, (LinkNode*)&p4); 47 insert_LinkList(list, 0, (LinkNode*)&p5); 48 49 print_LinkList(list, MyPrint); 50 //remove_LinkList(list, 1); 51 printf("------------\n"); 52 Person findP; 53 strcpy(findP.name, "陈六"); 54 findP.age = 35; 55 int pos = find_LinkList(list, (LinkNode*)&findP, MyCompare); 56 printf("位置:%d\n", pos); 57 system("pause"); 58 return 0; 59 }

浙公网安备 33010602011771号