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 }

 

 

 

版权声明:本文为ZhuJD原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ZhuJD/p/11857134.html