链表模板

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

//#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/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券