前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链表模板

链表模板

作者头像
对弈
发布2019-09-04 15:58:48
5870
发布2019-09-04 15:58:48
举报

之前经常写单链表,更是在课设写项目的时候,代码重复太多而无聊让我感到十分苦恼,于是有一天晚上突发奇想写一个链表模板,以后用到链表的时候就不用再写了,知道把之前写好的链表模板头文件包含进来就可以使用了,十分方便.

代码语言:javascript
复制
//#include<list.h>

<strong>#pragma once</strong>

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

声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/c%e5%ae%9e%e7%8e%b0%e9%9b%b7%e9%9c%86%e6%88%98%e6%9c%ba-6/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 之前经常写单链表,更是在课设写项目的时候,代码重复太多而无聊让我感到十分苦恼,于是有一天晚上突发奇想写一个链表模板,以后用到链表的时候就不用再写了,知道把之前写好的链表模板头文件包含进来就可以使用了,十分方便.
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档