1、企业链表CPP实现
企业链表中将信息单独成为一个节点,然后将next信息,单独分配,这样的话就像一个衣架的挂钩一样,使得链表上的操作可以更加高效和灵活。
和传统的单项链表相比,企业链表的数据域是由用户自己定义的,不需要动态分配内存,可以不用考虑内存泄漏问题。
2、企业链表.h文件实现
#pragma once
//节点类
class LinkNode {
public:
LinkNode* next;//指向下一个节点
};
//比较函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);
//打印函数指针
typedef void(*PRINTNODE)(LinkNode*);
//链表类
class LinkList {
public:
LinkList();
~LinkList();
void InsertList(int pos, LinkNode* data);
void DeleteList(int pos);
LinkNode* FindByPosList(int pos);
int FindByValueList(LinkNode* data, COMPARENODE compareNode);
int GetSizeList();
void PrintList(PRINTNODE printNode);
private:
LinkNode head;//头节点
int size;//链表长度
};
3、企业链表.cpp文件
#include "企业链表.h"
//初始化
LinkList::LinkList() {
head.next = nullptr;
this->size = 0;
}
//析构函数
LinkList::~LinkList() {
}
/**
* @brief 插入元素
* @param pos 插入元素的位置
* @param data 插入的元素
*/
void LinkList::InsertList(int pos, LinkNode* data) {
if (pos<0 || pos>this->size) {
pos = this->size;
}
//查找到需要插入的位置
LinkNode* pCurrent = &head;
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
//插入元素
data->next = pCurrent->next;
pCurrent->next = data;
this->size++;
}
/**
* @brief 删除元素
* @param pos 删除元素的位置
*/
void LinkList::DeleteList(int pos) {
if (pos < 0 || pos >= this->size) {
return;
}
//查找插入位置
LinkNode* pCurrent = &(this->head);
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
//删除节点
pCurrent->next = pCurrent->next->next;
this->size--;
}
/**
* @brief 通过pos位置查找元素,返回元素
* @param pos 元素位置
* @return 返回LinkNode* 强转为数据类型后,可获得数据
*/
LinkNode* LinkList::FindByPosList(int pos) {
LinkNode* pCurrent = this->head.next;
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
return pCurrent;
}
/**
* @brief 通过数据查找元素位置
* @param data 数据
* @param compareNode 比较函数指针,自定义比较函数
* @return pos元素位置
*/
int LinkList::FindByValueList(LinkNode* data, COMPARENODE compareNode) {
if (data == nullptr) {
return -1;
}
int flag = -1;
int count = 1;;
LinkNode* pCurrent = this->head.next;
while (pCurrent != nullptr) {
if (compareNode(data, pCurrent) == 0) {
flag = count;
break;
}
count++;
pCurrent = pCurrent->next;
}
return flag;
}
/**
* @brief 获取链表的size大小
* @return 链表大小
*/
int LinkList::GetSizeList() {
return this->size;
}
/**
* @brief 遍历打印链表
* @param printNode 自定义打印函数指针
*/
void LinkList::PrintList(PRINTNODE printNode) {
LinkNode* pCurrent = this->head.next;
while (pCurrent != nullptr) {
printNode(pCurrent);
pCurrent = pCurrent->next;
}
}
4、试验
4.1 main.cpp
#include <iostream>
using namespace std;
#include "企业链表.h"
typedef struct MyData {
LinkNode node;//类似一个挂钩
char name[64];
int age;
}Person;
void MyPrint(LinkNode* data) {
Person* p1 = (Person*)data;
printf("Name = %s,Age =%d\n", p1->name, p1->age);
}
int MyCompare(LinkNode* a, LinkNode* b) {
Person* p1 = (Person*)a;
Person* p2 = (Person*)b;
if ((p1->age == p2->age) && (p1->name == p2->name)) {
return 0;
}
else {
return -1;
}
}
int main() {
cout << "企业链表CPP的实现" << endl;
//LinkList* list = new LinkList;
LinkList list;
Person p1, p2, p3, p4;
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
list.InsertList(0, (LinkNode*)&p1);
list.InsertList(0, (LinkNode*)&p2);
list.InsertList(0, (LinkNode*)&p3);
list.InsertList(0, (LinkNode*)&p4);
//打印
list.PrintList(MyPrint);
list.DeleteList(1);
cout << "--------------------" << endl;
list.PrintList(MyPrint);
int pos = list.FindByValueList((LinkNode*)&p1, MyCompare);
if (pos == -1) {
printf("没有找到了p1\n");
}
else {
printf("找到了p1,在%d位置\n", pos);
}
cout << "--------------------" << endl;
LinkNode * data = list.FindByPosList(1);
MyPrint(data);
cout << "--------------------" << endl;
int linkListSize = list.GetSizeList();
cout << "链表的长度为:"<< linkListSize << endl;
system("pause");
return 0;
}