使用链表实现列表和Vector(C++)

源码内容:基于链表的列表(使用链表实现 Verctor::push_back 以及 Verctor::pop_back)

参考:数据结构之“链表的基本分析(代码+注释)”

· 基于链表的列表 ·

template <typename T>
class linkedList
{
public:
    linkedList();                                                         //初始化链表
    bool empty() const;                                                   //判空
    int size() const;                                                     //输入实际大小
    void push_back(const T &item);                                        //输入链表,添加此节点
    void pop_back();                                                      //删除最后一个节点
    void insert(T item, int pos);                                         //添加到指定位置的值
    void erase(int pos);                                                  //删除指定位置的值
    friend ostream &operator<<(ostream &out, const linkedList<T> &aList); //重载
private:
    node<T> *header; //头结点
    int lsize;       //输入实际大小
};
template <typename T>
linkedList<T>::linkedList() : header(NULL), lsize(0)
{
} //初始化定义首地址为空,大小为0

template <typename T>
bool linkedList<T>::empty() const //判空,大小为0为false
{
    return (lsize == 0);
}

template <typename T>
int linkedList<T>::size() const //输入实际大小
{
    return lsize;
}
template <typename T>
void linkedList<T>::insert(T item, int pos) // 在第几个位置前插入值item
{
    node<T> *newNode = new node<T>(item); //新建节点
    node<T> *temp = header;               //首地址

    if ((newNode == NULL) && (pos < 0) && (pos > lsize))
    {
        throw memoryAllocationError("Error");
    }                   //如果新建节点不成功抛出错误
    if (header == NULL) //首地址为空,新建的节点就是首节点
    {
        header = newNode; //新节点给首地址
    }
    else if (pos == 1) //不为空但是放在第一个前边
    {
        newNode->next = temp; //新节点下一个指向原来的首地址
        header = newNode;     //首地址就由新节点代替
    }
    else //不是第一个前边的
    {
        int bpos = 1;      //作为一个比较大小的数值
        node<T> *prev;     //新定义一个节点
        while (bpos < pos) //知道找到要插入的位置
        {
            prev = temp;
            temp = temp->next; //节点后移方便查找
            bpos++;            //当是pos前的一个时是prev是pos前一个 temp已经是pos了
        }
        newNode->next = temp; //放到该位置前边(可以由此改)
        prev->next = newNode; //此时prev是pos前边的一个
    }
}
template <typename T>
void linkedList<T>::erase(int pos) // 删除节点的位置为pos
{
    node<T> *tmp = header, tmpptr;                      //新建节点
    if ((header == NULL) && (pos < 0) && (pos > lsize)) //没有节点或者位置出错抛出错误
    {
        throw memoryAllocationError("Error");
    }
    if (pos == 1) //删除第一个位置
    {
        header = header->next; //头地址直接指向下一个
    }
    else
    {
        int bpos = 1;
        node<T> *prev;
        while (bpos < lsize) //同样是比较大小查找相应数值
        {
            prev = tmp;
            tmp = tmp->next;
            bpos++;
        }
        prev->next = tmp->next; //tmp的前一个直接指向tmp的后一个,删除tmp
    }
}
template <typename T>
void linkedList<T>::push_back(const T &item) //添加进链表最后边一个值
{
    node<T> *newNode = new node<T>(item); //新建节点
    node<T> *tmp = header;                //首地址保存
    if (newNode == NULL)                  //建立节点出错抛错
        throw memoryAllocationError("linkedQueue: memory allocation failure");
    if (header == NULL) //原链表为空,新节点为首节点
    {
        header = newNode;
    }
    else //否则不为空
    {
        while (tmp->next != NULL)
            tmp = tmp->next; //找到链表内最后一个数值
        tmp->next = newNode; //最后一个指向新节点
    }
    lsize++; //实际大小加1
}
template <typename T>
void linkedList<T>::pop_back() //删除最后一个数据
{
    node<T> *tmp = header, last, tmpptr; //设置新节点
    if (header == NULL)                  //如果链表不存在就无法删除
    {
        exit(0);
    }
    else //链表存在
    {
        if (tmp->next == NULL)
        {
            tmpptr = header;
            delete tmpptr;
            header = NULL;
        }    //首地址指向空,说明只有一个结点
        else //多个节点
        {
            while (tmp->next->next != NULL)
                tmp = tmp->next; //找到倒数第二个
            last = tmp->next;    //last是最后一个
            delete last;         //删除最后一个
            tmp->next = NULL;    //最后一个为空
        }
    }
    lsize++;
}
template <typename T>
ostream &operator<<(ostream &out, const linkedList<T> &aList) //重载
{
    node<T> *temp;
    temp = aList.header;
    while (temp != NULL)
    {
        out << temp->nodeValue;
        temp = temp->next;
        out << "  ";
    }
    return out;
}
void main() //调用实验实现
{
    linkedList<int> A;
    A.push_back(43);
    A.push_back(21);
    A.push_back(33);
    cout << A;
    cout << endl;
    A.insert(99, 1);
    cout << A;
    cout << endl;
    A.erase(1);
    cout << A;
    cout << endl;
    system("pause");
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值