C++实现一个简单的链表

C++实现一个简单的链表

/**---------------------------------------
* 文件名称: CLinkList.h
* 功能描述: 链表实现
* 创建标识: xad 2022/2/8
*
* 修改标识:
* 修改描述:
------------------------------------------**/
#ifndef CLINKLSI_LINKLIST_H
#define CLINKLSI_LINKLIST_H

namespace Alog {

	// 打印函数指针
	typedef void(*PRINTLINKNODE)(void* data);

	typedef struct stuLinkNode
	{
		void*					_pNodeData;
		struct stuLinkNode*		_pNext;
	}stuLinkNode;

	class CLinkList
	{
	private:
		stuLinkNode*   _pHead;  //链表头指针
		int			   _nSize;	//链表长度

	public:
		CLinkList();
		~CLinkList();

		/**
		*  @brief    插入元素
		*
		*  @param    int pos
		*  @param    void * data
		*  @return   void
		*/
		void insert_linkList(int pos ,void* data);

		/**
		*  @brief    移除某个位置元素
		*
		*  @param    int pos
		*  @return   void
		*/
		void remove_linkList_pos(int pos);

		/**
		*  @brief    获取元素个数
		*
		*  @param    void
		*  @return   int
		*/
		int get_size(void);

		/**
		*  @brief    查找元素位置
		*
		*  @param    void * data
		*  @return   int
		*/
		int find_linkList_pos(void* data);

		/**
		*  @brief    获取第一个元素
		*
		*  @param    void
		*  @return   void*
		*/
		void* get_frist_linkList_node(void);
		
		/**
		*  @brief    打印链表的数据
		*
		*  @param    PRINTLINKNODE print
		*  @return   void
		*/
		void print_linkList(PRINTLINKNODE print);
	};
}


#endif
#include "CLinkList.h"
#include <iostream>

Alog::CLinkList::CLinkList()
{
	_pHead = new stuLinkNode;
	_nSize = 0;
	// 头结点不保存数据信息
	_pHead->_pNodeData = nullptr;
	_pHead->_pNext = nullptr;
}

Alog::CLinkList::~CLinkList()
{
	if (_pHead == nullptr)
	{
		return;
	}

	auto* CurrentNode = _pHead;
	while (CurrentNode != nullptr)
	{
		auto* pNext = CurrentNode->_pNext;
		delete CurrentNode;
		CurrentNode = pNext;
	}
	_nSize = 0;

	std::cout << "free LinkList" << std::endl;

}

void Alog::CLinkList::insert_linkList(int pos, void* data)
{
	if (_pHead == nullptr|| data == nullptr )
	{
		return;
	}

	if (pos < 0 || pos >_nSize)
	{
		pos = _nSize;
	}

	auto* pNewNode = new stuLinkNode;
	pNewNode->_pNodeData = data;
	pNewNode->_pNext = nullptr;

	auto* pCurrentNode = _pHead;
	for (int i = 0; i < pos;i++)
	{
		pCurrentNode = pCurrentNode->_pNext;
	}
	pNewNode->_pNext = pCurrentNode->_pNext;
	pCurrentNode->_pNext = pNewNode;

	++_nSize;
}

void Alog::CLinkList::remove_linkList_pos(int pos)
{
	if (_pHead == nullptr || pos < 0 || pos >= _nSize)
	{
		return;
	}

	auto* pCurrent = _pHead;
	for (int i = 0; i < pos;i++)
	{
		pCurrent = pCurrent->_pNext;
	}

	auto* pRemoveNode = pCurrent->_pNext;
	pCurrent->_pNext = pCurrent->_pNext->_pNext;
	delete pRemoveNode;

	--_nSize;
}

int Alog::CLinkList::get_size(void)
{
	return _nSize;
}

int Alog::CLinkList::find_linkList_pos(void * data)
{
	if (_pHead == nullptr || data == nullptr )
	{
		return -1;
	}

	int pos = 0;
	auto* pCurrent = _pHead;
	while (pCurrent != nullptr)
	{
		if (pCurrent->_pNodeData ==data)
		{
			return pos;
		}

		pCurrent = pCurrent->_pNext;
		pos++;
	}

	return -1;
}

void* Alog::CLinkList::get_frist_linkList_node(void)
{
	return _pHead->_pNext->_pNodeData;
}

void Alog::CLinkList::print_linkList(PRINTLINKNODE print)
{
	if (_pHead == nullptr)
	{
		return;
	}

	auto* pCurrentNode = _pHead->_pNext;
	while (pCurrentNode != nullptr)
	{
		print(pCurrentNode->_pNodeData);
		pCurrentNode = pCurrentNode->_pNext;
	}
	
}

#include <iostream>
#include "CLinkList.h"


using namespace std;
using namespace Alog;

void myPrint(void * data);
void test_02(void);

typedef struct stuPerson
{
	char	_strName[64];
	int		_nAge;
	int		_nSorce;
}Person;

int main() {
	test_02();
	system("pause");
	return 0;
}

void test_02()
{
	// 创建链表
	CLinkList list;

	// 创建数据
	Person p1 = { "aaa", 18, 100 };
	Person p2 = { "bbb", 19, 99 };
	Person p3 = { "ccc", 20, 101 };
	Person p4 = { "ddd", 17, 97 };
	Person p5 = { "eee", 16, 59 };

	// 数据插入链表

	list.insert_linkList(0, &p1);
	list.insert_linkList(0, &p2);
	list.insert_linkList(0, &p3);
	list.insert_linkList(0, &p4);
	list.insert_linkList(0, &p5);

	// 打印
	list.print_linkList(myPrint);

	list.remove_linkList_pos(3);

	// 打印
	std::cout << "----------------------" << std::endl;
	list.print_linkList(myPrint);

	// 返回第一个结点
	std::cout << "---------查找结果-------------" << std::endl;
	auto p = (Person *)list.get_frist_linkList_node();
	std::cout << "Name:" << p->_strName << " Age:" << p->_nAge << " Score:" << p->_nSorce << std::endl;

	// 查找(新增测试)
	std::cout << "----------------------" << std::endl;
	int pos = list.find_linkList_pos(&p3);
	std::cout << "Name:" << p->_strName << " Age:" << p->_nAge << " Score:" << p->_nSorce << std::endl;
	std::cout << "pos: " << pos << std::endl;
	int size = list.get_size();
	std::cout << "size: " << size << std::endl;

	// 自动调用LinkList析构函数 销毁
}

void myPrint(void * data)
{
	auto *p = (Person *)data;
	std::cout << "Name:" << p->_strName << " Age:" << p->_nAge << " Score:" << p->_nSorce << std::endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值