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