[C语言]企业链表-Linux内核链表优化简单实现

企业链表-Linux内核链表优化简单实现

头文件:LinuxKernelList.h

#ifndef  LINUXKERNELLIST_H
#define LINUXKERNELLIST_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//链表指针节点
typedef struct LINUXNODE {
    struct LINUXNODE* next;
}LinuxNode;

//链表真正节点
typedef struct LINUXLIST {
    LinuxNode head;
    int size;
}LinuxList;

//遍历函数的指针
typedef void(*PRINTNODE)(LinuxNode*);
//比较函数的指针
typedef int(*COMPARENODE)(LinuxNode*, LinuxNode*);


//初始化链表
LinuxList* INIT_LINUXLIST();
//插入链表
void Insert_LinuxList(LinuxList* list, int pos, LinuxNode* data);
//删除链表
void Remove_LinuxList(LinuxList* list, int pos);
//查找链表元素
int Find_LinuxList(LinuxList* list, LinuxNode* data ,COMPARENODE compare);
//返回链表大小
int Size_LinuxList(LinuxList* list);
//打印链表
void Print_LinuxList(LinuxList* list, PRINTNODE print);
//释放链表内存
void FreeSpace_LinuxList(LinuxList* list);


#endif // ! LINUXKERNELLIST_H

实现文件:LinuxKernelList.c

#include "LinuxKernelList.h"


//初始化链表
LinuxList* INIT_LINUXLIST() {
    LinuxList* list = (LinuxList*)malloc(sizeof(LinuxList));
    list->head.next = NULL;
    list->size = 0;
    return list;
}
//插入链表
void Insert_LinuxList(LinuxList* list, int pos, LinuxNode* data) {
    if (list == NULL) {
        return;
    }
    if (data == NULL) {
        return;
    }
    if (pos<0 || pos>list->size) {
        pos = list->size;
    }
    //查找插入位置
    LinuxNode* pCurrent = &(list->head);
    for (int i = 0; i < pos; i++) {
        pCurrent = pCurrent->next;
    }
    //插入新节点
    data->next = pCurrent->next;
    pCurrent->next = data;
    list->size++;
}
//删除链表
void Remove_LinuxList(LinuxList* list, int pos) {
    if (list == NULL) {
        return;
    }
    if (pos<0 || pos>list->size) {
        pos = list->size;
    }
    //查找删除位置
    LinuxNode* pCurrent = &(list->head);
    for (int i = 0; i < pos; i++) {
        pCurrent = pCurrent->next;
    }
    //删除节点
    pCurrent->next = pCurrent->next->next;
    //因为我们并没有在节点里分配内存,数据信息储存在链表的其他域内,所以我们在删除时也不需要释放内存
    list->size--;

}
//查找链表元素
int Find_LinuxList(LinuxList* list, LinuxNode* data, COMPARENODE compare) {
    if (list == NULL) {
        return-1;
    }
    if (data == NULL) {
        return-1;
    }
    //辅助指针
    LinuxNode* pCurrent = list->head.next;
    int index = 0;
    int flag = -1;  //用于判断是否查找到了目标值
    //如果查找到了就将index 赋给flag
    //如果没查找到,就将flag=-1返回
    while (pCurrent != NULL) {
        if (compare(pCurrent, data)==0) {
            flag = index;
            break;
        }
        pCurrent = pCurrent->next;
        index++;
    }
    return flag;
}
//返回链表大小
int Size_LinuxList(LinuxList* list) {
    return list->size;
}
//打印链表
void Print_LinuxList(LinuxList* list, PRINTNODE print) {
    if (list == NULL) {
        return;
    }
    //辅助指针
    LinuxNode* pCurrent = list->head.next;
    while (pCurrent != NULL) {
        print(pCurrent);
        pCurrent = pCurrent->next;
    }


}
//释放链表内存
void FreeSpace_LinuxList(LinuxList* list) {
    if (list == NULL) {
        return;
    }
    free(list);
}

主文件:Main.c

typedef struct  PERSON_2{
    LinuxNode node;  //加入结构体作为连接多组数据的桥梁
    /*
    这里巧妙之处在于把node放到MyData结构体首地址的位置
    这样在定初始化一个MyData结构体后
    只需要利用强制类型转换就可以获得结构体首地址
    需要利用元素时,只需要将地址强制转换回结构体类型即可
    MyData data1;
    LinuxNode* node=(LinuxNode*) &data1;
    MyData data2=(MyData) node;
    */
    char name[64];
    int age;
}Person_2;

//打印方式
void MyPrint2(LinuxNode*data) {
    Person_2* p = (Person_2*)data;
    printf("姓名:%-10s 年龄:%-10d\n", p->name, p->age);
}

//比较方式
int MyCompare(LinuxNode* pCurrent,LinuxNode*data) {
    Person_2* p1 = (Person_2*)pCurrent;
    Person_2* p2 = (Person_2*)data;
    if (strcmp(p1->name , p2->name)==0 && p1->age==p2->age) { 
        //当姓名年龄都一样时,才返回0
        return 0;
    }
    return -1;

}


void LinuxListTest() {
    /*企业链表操作*/
    //创建链表
    LinkList* list = INIT_LINUXLIST();
    //创建数据
    Person_2 p1, p2, p3, p4, p5;
    strcpy(p1.name, "Tom");
    strcpy(p2.name, "Bob");
    strcpy(p3.name, "Lili");
    strcpy(p4.name, "Bryan");
    strcpy(p5.name, "Hugo");
    p1.age = 45;
    p2.age = 16;
    p3.age = 65;
    p4.age = 19;
    p5.age = 26;
    //将节点插入链表
    Insert_LinuxList(list, 0, (LinuxNode*)&p1);
    Insert_LinuxList(list, 0, (LinuxNode*)&p2);
    Insert_LinuxList(list, 0, (LinuxNode*)&p3);
    Insert_LinuxList(list, 0, (LinuxNode*)&p4);
    Insert_LinuxList(list, 0, (LinuxNode*)&p5);
    //打印链表
    Print_LinuxList(list, MyPrint2);
    //删除节点
    printf("------------------------\n");
    Remove_LinuxList(list, 2);
    Print_LinuxList(list, MyPrint2);
    //查找
    Person_2 p6;
    strcpy(p6.name, "Bob");
    p6.age = 16;
    int index = Find_LinuxList(list, (LinuxNode*)&p6, MyCompare);
    printf("------------------------\n");
    printf("链表中存在这个人,他的索引是:%d\n", index);
    //释放链表内存
    FreeSpace_LinuxList(list);

}

int main(){
    LinuxListTest();
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值