下面是LinkList.h文件,包含链表的基本函数
#include<iostream>
#include"malloc.h"
#include"Node.h"
#include <exception>
#include <cstdlib>
using namespace std;
template < class T>
class LinkList
{
friend ostream& operator<< <T>(ostream &out, LinkList<T> &list);//操作符重载,输出单链表的所有元素
public:
LinkList(); //构造函数
LinkList(T value[], int n); //创建链表(利用数组进行创建)
~LinkList() { delete head; } //析构函数
Node<T>*head; //头指针,指向单链表的头结点
Node<T>*InsertNode(int i, int d);//指定位置插入节点
int GetLength(); //链表长度
T DeleteNode(int i); //删除指定位置节点,返回删除的元素
void DeleteAllNode(); //删除整个链表
};
template < class T>
ostream& operator<<(ostream &out, LinkList<T> &list)
{
if (list.head == NULL)
{
cout << "链表为空!" << endl;
return out;
}
for (Node<T> *p = list.head->Next; p!= NULL; p = p->Next)
{
cout << p->data << " ";
}
return out;
}
template<class T>
LinkList<T>::LinkList()//创建空链表
{
this->head = new Node<T>();
}
template < class T>
LinkList<T>::LinkList(T value[], int n)
{
if (n <= 0)
{
cout << "链表个数不合理,请重新设定!" << endl;
}
this->head = new Node<T>();
Node<T> *Temp = this->head;
for (int i = 0; i < n; i++)
{
Temp->Next = new Node<T>();
Temp->Next->data = value[i];
Temp = Temp->Next;
}
Temp->Next = NULL;
}
template < class T>
Node<T>* LinkList<T>::InsertNode(int i, int d)
{
Node<T>*p = this->head;
int j = 0;
while (p && j < i - 1)
{
p = p->Next;
j++;
}
if (!p || j>i - 1)
{
throw out_of_range("指针为空或者i的取值不合法!");
}
Node<T>*s = new Node<T>();
s->data = d;
s->Next = p->Next;
p->Next = s;
return 0;
}
template <class T>
int LinkList<T>::GetLength()
{
Node<T>*p = new Node<T>();
p = this->head;
int n = 0;
while (p->Next != NULL)
{
n += 1;
p = p->Next;
}
return n;
}
template <class T>
T LinkList<T>::DeleteNode(int i)
{
Node<T>*p = new Node<T>();
p = this->head;
int j = 0; T e;
while (p && j < i-1)
{
p = p->Next;
j++;
}
if (!p || j>i-1)
{
throw out_of_range("该位置指针为空或者输入位置不合法!");
}
Node<T>*s = new Node<T>();
e = p->data;
s = p->Next;
p->Next = s->Next;
free(s);
return e;
}
template <class T>
void LinkList<T>::DeleteAllNode()
{
while (this->head != nullptr)
{
head = head->Next;
}
}
在上面文件中,Node.h中是结点类的实现,代码如下:
template < class T>
class Node
{
public:
T data;
Node<T> *Next;
Node()
{
this->Next = NULL;
}
Node(T data, Node<T>*Next = NULL)
{
this->data = data;
this->Next = Next;
}
};
下面是LinkList.cpp文件,包含主函数
#include<iostream>
#include"LinkList.h"
using namespace std;
int main()
{
int a[5] = { 1, 4, 3, 6, 7 };
//生成链表测试
LinkList<int> list(a, 5);
cout <<"生成的链表为:"<< list << endl;
cout << "生成链表的长度为:" << list.GetLength() << endl;;
//插入某位置元素测试
list.InsertNode(3, 10);
cout << "在第3个位置上插入数字10之后的新链表为:" << list << endl;
//删除某位置元素测试
list.DeleteNode(5);
cout << "删除第5个位置的结点后的新链表为:" << list << endl;
//删除所有元素测试
list.DeleteAllNode();
cout << "将元素全部删除!" << list << endl;
return 0;
}
测试结果如下所示:
生成的链表为:1 4 3 6 7
生成链表的长度为:5
在第3个位置上插入数字10之后的新链表为:1 4 10 3 6 7
删除第5个位置的结点后的新链表为:1 4 10 3 7
将元素全部删除!链表为空!
请按任意键继续. . .