实现链表模板

之前经常写单链表,更是在课设写学生管理系统的时候,代码重复太多而无聊让我感到十分苦恼,于是有一天晚上突发奇想写一个链表模板,以后用到链表的时候就不用再写了,知道把之前写好的链表模板头文件包含进来就可以使用了,十分方便,希望对你们有用。未经同意,不得转载,谢谢合作!!!

 

//#include<list.h>

#pragma once

 


#include<iostream>
using namespace std;
template <class T>
struct node
{
T data; //数据域
node* next;//指针域
friend ostream&operator<<(ostream&os, node<T>&other)//重载输出
{
os << other.data;
return os;
}
};


template<class T>
class list
{
private:
node<T>* head;//头指针
public:
list();
~list();
void addNode(T data);
void deleteNode(T& p);
node<T>* fineNodePre(T& data); //找到这个数据的前面那个节点  返回前面那个节点的首地址
node<T>* fineNode(T& data);
void changeNode(T& data, T& newData);//先找到 data的位置 去修改
bool& operator==(T& data);//重载==
void reverse(void);//链表倒序      
//   head->A->B->C-nullptr  head->C->B->A-nullptr
void print(void)
{


node<T>*p=head;
while(p->next != nullptr)
{
cout << p->next->data << '\t';
p = p->next;
}
}


};


template<class T>
list<T>::list()//无参构造
{
head = new node<T>;//申请一个节点
head->next = nullptr;//结尾赋空
}


template<class T>
list<T>::~list()
{
node<T>* p; //临时指针
while (head != nullptr)
{
p = head;
head = head->next;
free(p); //释放结点
}
}


template<class T>
void list<T>::addNode(T data)
{ //头插法
node<T>*p = new node<T>;
p->data = data;
p->next = head->next;
head->next = p;
}


template<class T>
node<T>* list<T>::fineNodePre(T& data)
{
node<T>*p = head;
while (p->next != nullptr)
{
if (p->next->data == data)
{
return p;


}
p = p->next;
}
return p;
}


template<class T>
node<T>* list<T>::fineNode(T& data)
{
node<T>*p = head->next;
while (p != nullptr)
{
if (p->data == data)
{
return p;


}
p = p->next;
}
return p;
}
template<class T>
bool& list<T>::operator==(T& data)
{
return this->fineNode()->
== data;
}
template<class T>
void list<T>::changeNode(T& data, T& newData)
{
node<T>*p = head->next;
while (p != nullptr)
{
if (p->data == data)//data要重载
{
p->data = newData;
return;
}
p = p->next;
}
return;
}


template<class T>
void list<T>::reverse(void)  //链表倒序  
{
node<T>*p, *q;
p = head->next;
head->next = nullptr;


//一边头删 一边头插
while (p != nullptr)
{
q = p;
p = p->next;//头删


q->next = head->next;//头插
head->next = q;
}


}


template<class T>
void list<T>::deleteNode(T& data)//特定结点
{
node<T>*p = head->next;
while (p != nullptr)
{
if (p->data == data)
{
delete p;
return;
}
p = p->next;
}
return;
}

 

 

 

 

 

//.cpp,主函数部分

#include "list.h"
int main(void)
{
    list<int> lis;
for (int i = 0; i < 10; ++i)
{
lis.addNode(i);//循环插入数据
}
cout << "链表元素是:" << endl;
lis.print();
//现在反转
lis.reverse();
cout << "\n链表元素是:" << endl;
lis.print();
list < node<int>> arr;
arr.addNode({ 3, nullptr });//插入节点
//+++++++++++++++++打印数据
cout << "\n新增数据是" << endl;
arr.print();


//引用定义的格式
int x;
int& y = x;//定义的时候  &叫做引用  是一种类型


cin.get();
return 0;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
面向对象程序设计课程作业 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
发出的红包

打赏作者

淮城一只猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值