企业链表 C实现

本文介绍了一种名为企业链表的数据结构实现方式,该链表通过强转指针来支持多种数据类型的操作,如插入、删除、查找等,并提供了一个具体的示例程序说明其使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓企业链表,就是在生产中经常使用的链表

在连接链表的时候将指向节点的指针强转成(LinkNode *),
在使用其中的data数据时,将指向节点的指针强转为(Person *
//qiyelist.h
// Created by Administrator on 2022/10/16 0016.
//

#ifndef DAY03_QIYELIST_H
#define DAY03_QIYELIST_H

#include <iostream>

struct LinkNode {
    LinkNode * next;
};
struct LinkList{
    LinkNode head;
    int size;
};

typedef void (*PRINTNODE) (LinkNode*);
typedef bool (*XIANGDENG) (LinkNode*,LinkNode*);

LinkList * init_list();
void insert_list(LinkList * list,int pos,LinkNode* data);
void delete_list(LinkList * list,int pos);
int get_list_size(LinkList * list);
void Print_list(LinkList * list,PRINTNODE print);
void free_list(LinkList * list);
//利用函数指针回调,这样可以自定义的判断任何的数据类型
//其实可以改成模板类型 但我还不会目前  哈哈哈
int find_list(LinkList * list,LinkNode * data,XIANGDENG xiangdeng);

#endif //DAY03_QIYELIST_H

//qiyelist.cpp
// Created by Administrator on 2022/10/16 0016.
//

#include "qiyelist.h"

LinkList * init_list(){
    auto list = (LinkList*)malloc(sizeof(LinkList));
    list->size = 0;
    list->head.next = nullptr;
    return list;
}

void insert_list(LinkList * list,int pos,LinkNode* data){
    if(list == nullptr){
        return;
    }
    if(data == nullptr){
        return;
    }
    if(pos<0||pos>list->size){
        pos = list->size;
    }

    auto pCurrent = &(list->head);
    for(int i=0;i<pos;i++){
        pCurrent = pCurrent->next;
    }

    data->next = pCurrent->next;
    pCurrent->next = data;

    list->size++;

}

void delete_list(LinkList * list,int pos){
    if(list == nullptr){
        return;
    }

    auto pCurrent = &(list->head);
    for(int i=0;i<pos;i++){
        pCurrent = pCurrent->next;
    }

    auto pNext = pCurrent->next;
    pCurrent->next = pNext->next;
//    free(pNext);
    list->size--;
}

int get_list_size(LinkList * list){
    return list->size;
}

void Print_list(LinkList * list,PRINTNODE print){
    if(list == nullptr){
        return;
    }

    auto pCurrent = list->head.next;
    while (pCurrent != nullptr){
        print(pCurrent);
        pCurrent = pCurrent->next;
    }

    std::cout<<std::endl;
}

void free_list(LinkList * list){
    if(list == nullptr){
        return;
    }
    free(list);
}

int find_list(LinkList * list,LinkNode * data,XIANGDENG xiangdeng){
    if(list== nullptr||data == nullptr){
        return -1;
    }
    int pos = 0;
    auto pCurrent = list->head.next;
    while (pCurrent != nullptr){
        if(xiangdeng(pCurrent,data)){
            return pos;
        }
        pos++;
        pCurrent = pCurrent->next;
    }
    return -1;
}
//
// Created by Administrator on 2022/10/13 0013.


#include <string>
#include <iostream>
#include "day03/qiyelist.h"

struct Person{
    LinkNode node;

    Person(std::string m_name, int mage): name(m_name), age(mage) {}

    std::string name;
    int age;
};



void my_print(LinkNode * data){
    auto p = (Person*) data;
    std::cout<<"name: "<<p->name<<" age:"<<p->age;
}


bool my_xiangdeng(LinkNode* a,LinkNode* b){
    auto p1 = (Person*) a;
    auto p2 = (Person*) b;
    if(p1->name==p2->name&&p1->age==p2->age){
        return true;
    }
    return false;
}

int main() {

    Person p1("A3",12);
    Person p2("B3",22);
    Person p3("C3",32);
    Person p4("D3",42);
    Person p5("E3",52);

    auto list = init_list();

    insert_list(list,0,(LinkNode*)&p1);
    insert_list(list,0,(LinkNode*)&p2);
    insert_list(list,0,(LinkNode*)&p3);
    insert_list(list,0,(LinkNode*)&p4);
    insert_list(list,0,(LinkNode*)&p5);


    Print_list(list,my_print);
    std::cout<<"list length:"<<get_list_size(list)<<std::endl;

    delete_list(list, get_list_size(list)-1);
    Print_list(list,my_print);
    std::cout<<"list length:"<<get_list_size(list)<<std::endl;

    std::cout<<"p3 index in list:"<<find_list(list,(LinkNode*)&p3,my_xiangdeng);

    free_list(list);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值