C/C++企业链表的实现
首先 先介绍企业链表 和Linux内核链表 和 之前我发的一篇单项链表的区别
结构体变量名是结构体的首地址吗? 这个问题会在待会链表实现中体现!!
答案:有些编译器 支持用结构体变量名做地址的方式但一般不推荐,因为非标准
正确的方式是用&变量名比如struct type s;那么s的地址为&s,使用&(取地址运算符) 才能得到结构体的地址。
下面d是代码!!!
#pragma once #ifndef EnterpriseLinkList #define EnterpriseLinkList //链表小结点 typedef struct LinkNode { struct LinkNode *Next; }LinkNode; //链表结点 typedef struct LinkList { LinkNode head; 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 Delete_LinkList(LinkList* list, int pos); //获得链表的长度 int Get_LinkList_Length(LinkList* list); //查找 int Find_LinkList_data(LinkList* list, LinkNode *data, COMPARENODE campare); //打印 void Print_LinkList(LinkList* list, PRINTLINKNODE print); //释放链表内存 void Free_LinkList(LinkList* list); #endif // !EnterpriseLinkList
#include"EnterpriseLinkList.h" #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //初始化链表 LinkList *Init_LinkList() { LinkList*list = (LinkList*)malloc(sizeof(LinkList)); list->head.Next = NULL; list->size = 0; return list; } /*//打印函数指针 typedef void(*PRINTLINKNODE)(LinkNode *);*/ //插入 void Insert_LinkList(LinkList* list, int pos, LinkNode *data) { if (list == NULL) return; if (data == 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 Delete_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; } //删除结点 pCurrent->Next = pCurrent->Next->Next; list->size--; } //获得链表的长度 int Get_LinkList_Length(LinkList* list) { return list->size; } //查找 int Find_LinkList_data(LinkList* list, LinkNode *data, COMPARENODE campare) { if (list == NULL) { printf("list == NULL"); return -1; } if (data == NULL) { printf("data == NULL"); return -1; } //辅助指针查找 LinkNode*pCurrent = list->head.Next; int index = 0; int flag = -1; while (pCurrent!=NULL) { if (campare(pCurrent, data) == 0) { flag = 1; break; } pCurrent = pCurrent->Next; index++; } if (flag == 1) { printf("\nFound!! "); return index; } else { printf("Not found!!\n"); return -1; } } //打印 void Print_LinkList(LinkList* list, PRINTLINKNODE print) { if (list == NULL) return; //定义一个辅助指针 LinkNode*pCurrent = list->head.Next; while (pCurrent != NULL) { print(pCurrent); pCurrent = pCurrent->Next; } } //释放链表内存 void Free_LinkList(LinkList* list) { if (list == NULL)return; free(list); }
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include"EnterpriseLinkList.h" 6 7 typedef struct Person 8 { 9 LinkNode node; 10 char name[64]; 11 int age; 12 }Person; 13 14 void Myprint(LinkNode*data) 15 { 16 Person*p = (Person*)data; 17 printf("name is %s age is %d \n", p->name, p->age); 18 } 19 int campare(LinkNode*data1, LinkNode*data2) 20 { 21 Person*p1 = (Person*)data1; 22 Person*p2 = (Person*)data2; 23 if (p1->age == p2->age && strcmp(p1->name,p2->name)==0 ) 24 { 25 return 0; 26 } 27 else { 28 return -1; 29 } 30 } 31 32 int main(void) 33 { 34 //创建链表 35 LinkList* list = Init_LinkList(); 36 //创建数据 37 Person p1, p2, p3, p4, p5,p6; 38 strcpy(p1.name, "aaa"); 39 strcpy(p2.name, "bbb"); 40 strcpy(p3.name, "ZJD"); 41 strcpy(p4.name, "LK"); 42 strcpy(p5.name, "eee"); 43 strcpy(p6.name, "HHH"); 44 p1.age = 10; 45 p2.age = 20; 46 p3.age = 10; 47 p4.age = 30; 48 p5.age = 10; 49 p6.age = 50; 50 51 //将结点插入链表 52 Insert_LinkList(list,0,(LinkNode*)&p1); 53 Insert_LinkList(list, 0, (LinkNode*)&p2); 54 Insert_LinkList(list, 0, (LinkNode*)&p3); 55 Insert_LinkList(list, 0, (LinkNode*)&p4); 56 Insert_LinkList(list, 0, (LinkNode*)&p5); 57 Insert_LinkList(list, 0, (LinkNode*)&p6); 58 59 //打印 60 Print_LinkList(list, Myprint); 61 //获得链表长度 62 int Linklist_size; 63 Linklist_size=Get_LinkList_Length(list); 64 printf("Linklist_size is %d \n", Linklist_size); 65 66 //查找 67 Person zjd; 68 strcpy(zjd.name,"LK"); 69 zjd.age = 30; 70 printf("\nTo get LK posion wait~~~~"); 71 int posFound = Find_LinkList_data(list, (LinkNode*)&zjd, campare); 72 printf("\nLK's posion %d\n \n", posFound+1); 73 74 75 //打印 76 Print_LinkList(list, Myprint); 77 //获得链表长度 78 Linklist_size = Get_LinkList_Length(list); 79 printf("Linklist_size is %d \n", Linklist_size); 80 81 //删除结点 82 int pos; 83 printf("Enter the posion what you want to delete \n"); 84 scanf("%d", &pos); 85 Delete_LinkList(list,pos); 86 87 //打印 88 Print_LinkList(list, Myprint); 89 //获得链表长度 90 Linklist_size = Get_LinkList_Length(list); 91 printf("Linklist_size is %d \n", Linklist_size); 92 93 94 //释放 95 Free_LinkList(list); 96 printf("\n"); 97 system("pause"); 98 return 0; 99 }