企业链表CPP实现

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;
}

4.2 结果显示

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值