顺序表类模板

记录一下自己写的一个顺序表类模板,运算符只重写了[],由于函数中直接用了==运算符,如果模板类的类型是复杂数据类型的话,需要在类中重写==等运算符。

链表类模板

#pragma once

#include <iostream>
using namespace std;

template <typename T>
class List
{
public:
    List(unsigned int size);
    ~List();
    void ClearList();                               //清空表
    bool ListEmpty();                               //判空
    int ListLength();                               //求表长
    bool GetElem(unsigned int i, T *e);             //得到i位置元素
    int LocateElem(T *e);                           //定位
    bool PriorElem(T *currentElem, T *preElem);     //获得指定元素前驱
    bool NextElem(T *currentElem, T *nextElem);     //获得指定元素后继
    void ListTraverse();                            //遍历
    bool ListInsert(unsigned int i, T *e);          //定位插入
    bool ListDelete(unsigned int i, T *e);          //定位删除
public:
    T& operator[](int index);

private:
    T *m_pList;
    unsigned int m_iSize;
    unsigned int m_iLength;
};

template <typename T>
List<T>::List(unsigned int size)
{
    m_iSize = size;
    m_pList = new T[m_iSize];
    m_iLength = 0;
}

template <typename T>
List<T>::~List()
{
    delete[] m_pList;
    m_pList = NULL;
}

template <typename T>
void List<T>::ClearList()
{
    m_iLength = 0;
}

template <typename T>
bool List<T>::ListEmpty()
{
    return 0 == m_iLength;
}

template <typename T>
int List<T>::ListLength()
{
    return m_iLength;
}

template <typename T>
bool List<T>::GetElem(unsigned int i, T *e)
{
    if (i < 0 || m_iSize <= i)
    {
        return false;
    }
    else
    {
        *e = m_pList[i];
        return true;
    }
}

template <typename T>
int List<T>::LocateElem(T *e)
{
    for (unsigned int i = 0; i < m_iLength; ++i)
    {
        if (*e == m_pList[i])
        {
            return i;
        }
    }
    return -1;
}

template <typename T>
bool List<T>::PriorElem(T *currentElem, T *preElem)
{
    int temp = LocateElem(currentElem);
    if (temp == -1)
        return false;
    else
    {
        if (temp == 0)
            return false;
        else
        {
            *preElem = m_pList[temp - 1];
            return true;
        }
    }
}

template <typename T>
bool List<T>::NextElem(T *currentElem, T *nextElem)
{
    unsigned int temp = LocateElem(currentElem);
    if (temp == -1)
        return false;
    else
    {
        if (temp + 1 >= m_iLength)
            return false;
        else
        {
            *nextElem = m_pList[temp + 1];
            return true;
        }
    }
}

template <typename T>
void List<T>::ListTraverse()
{
    for (unsigned int i = 0; i < m_iLength; ++i)
    {
        cout << m_pList[i] << endl;
    }
}

template <typename T>
bool List<T>::ListInsert(unsigned int i, T *e)
{
    if (i < 0 || i > m_iLength)
    {
        return false;
    }
    if (m_iLength >= m_iSize)
    {
        return false;
    }

    for (unsigned int k = m_iLength - 1; m_iLength != 0 && k >= i; k--)
    {
        m_pList[k + 1] = m_pList[k];
    }

    m_pList[i] = *e;
    m_iLength++;
    return true;
}

template <typename T>
bool List<T>::ListDelete(unsigned int i, T *e)
{
    if (i < 0 || i >= m_iLength)
    {
        return false;
    }

    *e = m_pList[i];
    for (unsigned int k = i; k < m_iLength - 1; ++k)
    {
        m_pList[k] = m_pList[k + 1];
    }
    m_iLength--;
    return true;
}


template <typename T>
T& List<T>::operator[](int index)
{
    return *(m_pList + index);
}

模板类型

这里放一个模板的实例,此处还实现了几个运算符的重载。

Person.h

#pragma once

#include <string>
#include <iostream>
using namespace std;

class Person
{
    friend ostream &operator<<(ostream &out, Person &person);
public:
    string name;
    string phone;
    Person& operator =(Person &person);
    bool operator == (Person &person);
};

Person.cpp

#include "Person.h"


ostream &operator<<(ostream &out, Person &person)
{
    out << person.name << "----------" << person.phone << endl;
    return out;
}


Person& Person::operator =(Person &person)
{
    this->name = person.name;
    this->phone = person.phone;
    return *this;
}

bool Person::operator == (Person &person)
{
    return (this->name == person.name && this->phone == person.phone);
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值