[C++] 模板类实现简单链表

[C++] 模板类实现简单链表


听老师的话,首先建了一个头文件置放状态字,如下

ConstHeader.h


#ifndef TRUE
#define TRUE 1
#endif // TRUE

#ifndef FALSE
#define FALSE 0
#endif // FALSE

#ifndef OK
#define OK 1
#endif // OK

#ifndef ERROR
#define ERROR 0
#endif // ERROR

#ifndef INFEASIBLE
#define INFEASIBLE -1
#endif // INFEASIBLE

#ifndef OVERFLOW
#define OVERFLOW -2
#endif // OVERFLOW

typedef int Status;

然后就开始链表的构建了。首先,先明确我们的链表包括那些数据以及操作


数据
  • 存放长度的 length 域
  • 链表节点 LinkNode
链表节点
  • 数据 data 域
  • 指针 next、pre域
操作
  • 初始化一个空链表(也就是个头指针)
  • 初始化一个单元素链表
  • 初始化一个多元素链表
  • 返回头节点
  • 返回尾节点
  • 链表尾追加一个元素
  • 销毁链表
  • 获得某个位置的元素
  • 在某个位置左边插入元素
  • 在某个元素右边插入元素
  • 删除某个位置的元素
  • 获得某个元素的位置
  • 遍历并打印链表


下面是该链表头文件源码:

LinkList_in_cpp.h

#pragma once
#ifndef LINKLIST_IN_CPP_H
#define LINKLIST_IN_CPP_H
#endif // LINKLIST_IN_CPP
#include <iostream>
#include "ConstHeader.h"
using namespace std;

template<class T>
class LinkNode
{
public:
    //用作头指针
    LinkNode();
    //建立一个一般节点
    LinkNode(const T &x);
    //移除该节点后面一个节点,并返回该节点
    LinkNode<T>* removeNextNode();
    //移除该节点后面所有节点,并返回第一个节点
    LinkNode<T>* removeAfterNode();
    T data;
    LinkNode<T> *next, *pre;
};

template<class T>
LinkNode<T>::LinkNode()
{
    next = NULL;
    pre = NULL;
}

template<class T>
LinkNode<T>::LinkNode(const T& x)
{
    data = x;
    next = NULL;
    pre = NULL;
}

template<class T>
LinkNode<T>* LinkNode<T>::removeNextNode()
{
    LinkNode<T>* temp = next;
    next = temp.next;
    return temp;
}

template<class T>
LinkNode<T>* LinkNode<T>::removeAfterNode()
{
    LinkNode<T>* temp = next;
    next = NULL;
    return temp;
}

template<class T>
class LinkList
{
public:
    //
    LinkList() {
        head = new LinkNode<T>();
        tail = head;
    };
    //
    LinkList(const T &x) {
        head = new LinkNode<T>();
        LinkNode<T>* t = new LinkNode<T>(x);
        head->next = t;
        t->pre = head;
        tail = t;
    };
    //
    LinkList(T a[], int n) {
        LinkNode<T>* p = head, t;
        for (int i = 0; i < n; i++)
        {
            t = new LinkNode<T>(a[i]);
            p->next = t;
            t->pre = p;
            p = t;
        }
        length = n;
        tail = p;
    };
    //
    ~LinkList() { Destroy(); };
    //
    LinkNode<T>* getHead();
    //
    LinkNode<T>* getTail();
    //
    Status Append(const T &x);
    //
    Status elemGet(int n, T &data);
    //
    Status elemLInsert(int n, const T &x);
    //
    Status elemRInsert(int n, const T &x);
    //
    Status elemDelete(int n, T &data);
    //
    int elemLocate(const T &x);
    //
    Status Destroy();
    //
    void Print();
private:
    LinkNode<T>* head, *tail;
    int length = 0;
};

template<class T>
LinkNode<T>* LinkList<T>::getHead()
{
    return head;
}

template<class T>
LinkNode<T>* LinkList<T>::getTail()
{
    return tail;
}

template<class T>
Status LinkList<T>::elemGet(int n, T &data)
{
    LinkNode<T>* p = head;
    for (int i = 0; i < n; i++)
    {
        if (!(p = p->next))
            return ERROR;
    }
    if (p) data = p->data;
    return OK;
}

template<class T>
Status LinkList<T>::elemLInsert(int n, const T &x)
{
    LinkNode<T>* p = head;
    for (int i = 0; i < n; i++)
    {
        if (!(p = p->next))
            return ERROR;
    }
    LinkNode<T>* t = new LinkNode<T>(x);
    if (p->pre)
    {
        t->next = p;
        t->pre = p->pre;
        p->pre->next = t;
        p->pre = t;
    }
    else
    {
        t->pre = NULL;
        t->next = p;
        p->pre = t;
        head = t;
    }
    length++;
    return OK;
}

template<class T>
Status LinkList<T>::elemRInsert(int n, const T &x)
{
    LinkNode<T>* p = head;
    for (int i = 0; i < n; i++)
    {
        if (!(p = p->next))
            return ERROR;
    }
    LinkNode<T>* t = new LinkNode<T>(x);
    if (p->next)
    {
        t->pre = p;
        t->next = p->next->next;
        p->next = t;
        t->next->pre = t;
    }
    else
    {
        t->pre = p;
        t->next = NULL;
        p->next = t;
        tail = t;
    }
    length++;
    return OK;
}

template<class T>
Status LinkList<T>::elemDelete(int n, T &data)
{
    LinkNode<T>* p = head;
    for (int i = 0; i < n; i++)
    {
        if (!(p = p->next))
            return ERROR;
    }
    if (p->next)
    {
        p->pre->next = p->next;
        p->next->pre = p->pre;
        data = p->data;
    }
    else
    {
        p->pre->next = NULL;
        data = p->data;
        tail = p->pre;
    }
    delete(p);
    length--;
    return OK;
}

template<class T>
int LinkList<T>::elemLocate(const T &x)
{
    LinkNode<T>* p = head;
    for (int i = 0; p != NULL; i++)
    {
        if (p->data == x)
        {
            return i;
        }
    }
    return -1;
}

template<class T>
Status LinkList<T>::Append(const T &x)
{
    LinkNode<T> *p = new LinkNode<T>(x);
    if (!p)return ERROR;
    p->pre = tail;
    p->next = NULL;
    tail = p;
    length++;
    return OK;
}

template<class T>
Status LinkList<T>::Destroy()
{
    LinkNode<T> *p1 = head,*p2 = head->next;
    if (!p1)return ERROR;
    while (p2 != NULL)
    {
        p1->pre = NULL;
        p1->next = NULL;
        delete(p1);
        p1 = p2;
        p2 = p2->next;
    }
    p1->pre = NULL;
    p1->next = NULL;
    delete(p1);
    delete(p2);
    length = 0;
    return OK;
}

template<class T>
void LinkList<T>::Print() {
    LinkNode<T>* p = head->next;
    while (p != NULL)
    {
        cout << p->data << endl;
        p = p->next;
    }
}
  • 0
    点赞
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值