二 线性表链式存储之企业链表

线性表链式存储之企业链表

一丶企业链表介绍

  不受业务结构而限制,在我们用的数据类型发生改变时并不需要去改变底层的链表结构.

二丶企业链表实现

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 }

 

posted @ 2020-05-09 13:49  mcf8293  阅读(114)  评论(0)    收藏  举报