Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

链表数据结构的C++实现:类模板实现线性表的链式存储

本文介绍了如何使用C++模板创建一个LinkedList类,包括结构体定义、内存管理(new和delete)、成员函数get_length(), get_data(), insert(), delete()和clear()的实现。重点讲解了链表节点的动态分配和操作原理。
摘要由CSDN通过智能技术生成

类的定义

在类的内部包含一个结构体,结构体包含一个指向下一结点的指针,以及一个数据域,用于存储插入链表的用户数据。

#pragma once
#include <iostream>
using namespace std;

template<typename MyType>
class LinkedList
{
public:
	LinkedList();
	~LinkedList();
public:
	int get_length();
	MyType get_data(int pos);
	int insert(MyType& node, int pos);
	MyType delet(int pos);
	void clear();
public:
	typedef struct ListNode
	{
		struct ListNode* next;
		MyType data;
	}ListNode;
private:
	int length;
	ListNode* head;
};

成员函数的实现

template<typename MyType>
LinkedList<MyType>::LinkedList()
{
	this->head = new ListNode;
	this->head->next = NULL;
	this->length = 0;
}

template<typename MyType>
LinkedList<MyType>::~LinkedList()
{
	ListNode* pCurrent = this->head;
	while (pCurrent != NULL)
	{
		ListNode* pTemp = pCurrent;
		pCurrent = pCurrent->next;
		delete pTemp;
	}
	this->length = 0;
}

template<typename MyType>
int LinkedList<MyType>::get_length()
{
	return this->length;
}

template<typename MyType>
MyType LinkedList<MyType>::get_data(int pos)
{
	ListNode* pCurrent = this->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	return pCurrent->next->data;
}

template<typename MyType>
int LinkedList<MyType>::insert(MyType& node, int pos)
{
	ListNode* pCurrent = this->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	ListNode* pNode = new ListNode;
	pNode->data = node;
	pNode->next = pCurrent->next;
	pCurrent->next = pNode;
	this->length++;
	return 0;
}

template<typename MyType>
MyType LinkedList<MyType>::delet(int pos) 
{
	ListNode* pCurrent = this->head;
	for (int i = 0; i < pos; i++)
	{
		pCurrent = pCurrent->next;
	}
	MyType temp_data = pCurrent->next->data;
	ListNode* pTemp = pCurrent->next;
	pCurrent->next = pCurrent->next->next;
	delete pTemp;
	this->length--;
	return temp_data;
}

template<typename MyType>
void LinkedList<MyType>::clear()
{
	ListNode* pCurrent = this->head;
	while (pCurrent != NULL)
	{
		ListNode* pTemp = pCurrent;
		pCurrent = pCurrent->next;
		delete pTemp;
	}
	this->head = new ListNode;
	this->head->next = NULL;
	this->length = 0;
}

因为链表的结点是动态分配的,插入一个数据,就用动态构造一个结点,并把要插入的数据存到结点的数据域。所以,在插入元素和删除元素的时候需要使用new和delete来管理内存。

C语言实现链表请参考文章

【数据结构】线性表的链式存储(链表)API及实现icon-default.png?t=M276https://blog.csdn.net/qq_43471489/article/details/123771559另外,代码资源已经上传,可在我的资源免费下载。

面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mindtechnist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值