所谓企业链表,就是在生产中经常使用的链表
在连接链表的时候将指向节点的指针强转成(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);
}