C++链表(LinkList)链表的创建、插入、删除等基本操作

下面是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
将元素全部删除!链表为空!

请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/qq_36427732/article/details/79901868