You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++模板类双向链表插入与显示功能未定义错误排查求助

问题分析

你遇到的编译和运行问题主要由以下几类错误导致:

  • 编译层面的未定义错误:DoubleNode的默认构造函数、带参构造函数仅声明未实现,编译器无法找到函数定义
  • 基础方法逻辑颠倒:DoubleNode的setPrevious和setNext实现写反,给错误的指针成员赋值
  • 链表类成员未初始化:DoublyLinkedList的默认构造函数被注释,headPtr_、itemCount_都是未初始化的野值
  • 插入逻辑混乱:inserts方法分情况判断逻辑错误、局部变量遮挡成员变量、额外申请冗余内存
  • 输出逻辑失效:display方法的打印语句全部被注释,且错误尝试访问节点私有成员
  • 调用参数错误:空链表首次插入最大仅支持位置1,直接插入位置3会直接返回插入失败
修正后的完整可运行代码
#include <iostream>
template <class ItemType>
class DoubleNode
{
public:
    // 实现默认构造函数
    DoubleNode() : next_(nullptr), prev_(nullptr) {}
    // 实现带参构造函数
    DoubleNode(const ItemType &anItem, DoubleNode<ItemType> *nextNodePtr = nullptr, DoubleNode<ItemType> *previousNodePtr = nullptr)
        : item_(anItem), next_(nextNodePtr), prev_(previousNodePtr) {}

    void setItem(const ItemType &anItem)
    {
        item_ = anItem;
    }
    // 修正setPrevious赋值对象
    void setPrevious(DoubleNode<ItemType> *previousNodePtr)
    {
        prev_ = previousNodePtr;
    }
    // 修正setNext赋值对象
    void setNext(DoubleNode<ItemType> *nextNodePtr)
    {
        next_ = nextNodePtr;
    }

    ItemType getItem() const
    {
        return item_;
    }

    DoubleNode<ItemType> *getNext() const
    {
        return next_;
    }

    DoubleNode<ItemType> *getPrevious() const
    {
        return prev_;
    }

private:
    ItemType item_;
    DoubleNode<ItemType> *next_;
    DoubleNode<ItemType> *prev_;
};

template <class ItemType>
class DoublyLinkedList
{
public:
    // 实现默认构造函数,初始化成员变量
    DoublyLinkedList() : headPtr_(nullptr), itemCount_(0) {}

    int getSize()
    {
        return itemCount_;
    }

    DoubleNode<ItemType> *getAtPos(const int &pos) const
    {
        if (pos < 1 || pos > itemCount_) return nullptr;
        DoubleNode<ItemType> *curPtr = headPtr_;
        for (int skip = 1; skip < pos; skip++)
            curPtr = curPtr->getNext();
        return curPtr;
    }

    DoubleNode<ItemType> *getHeadPtr() const
    {
        return headPtr_;
    }

    // 重写inserts方法,修正逻辑
    bool inserts(const ItemType &item, const int &position = 1)
    {
        bool ableToInsert = (position >= 1) && (position <= itemCount_ + 1);
        if (!ableToInsert) return false;

        DoubleNode<ItemType> *newNodePtr = new DoubleNode<ItemType>(item);
        if (position == 1) {
            // 插入头部
            if (headPtr_ != nullptr) {
                newNodePtr->setNext(headPtr_);
                headPtr_->setPrevious(newNodePtr);
            }
            headPtr_ = newNodePtr;
        } else if (position == itemCount_ + 1) {
            // 插入尾部
            DoubleNode<ItemType> *lastPtr = getAtPos(itemCount_);
            lastPtr->setNext(newNodePtr);
            newNodePtr->setPrevious(lastPtr);
        } else {
            // 插入中间
            DoubleNode<ItemType> *prevPtr = getAtPos(position - 1);
            DoubleNode<ItemType> *nextPtr = prevPtr->getNext();
            newNodePtr->setPrevious(prevPtr);
            newNodePtr->setNext(nextPtr);
            prevPtr->setNext(newNodePtr);
            nextPtr->setPrevious(newNodePtr);
        }
        itemCount_++;
        return true;
    }

    // 修正display方法
    void display() const
    {
        DoubleNode<ItemType> *curPtr = getHeadPtr();
        if (curPtr == nullptr)
        {
            std::cout << "链表为空" << std::endl;
            return;
        }
        std::cout << "链表内容:";
        while (curPtr != nullptr)
        {
            std::cout << curPtr->getItem() << " ";
            curPtr = curPtr->getNext();
        }
        std::cout << std::endl;
    }

private:
    DoubleNode<ItemType> *headPtr_;
    int itemCount_;
};

int main()
{
    DoublyLinkedList<int> dl;
    // 修正插入位置,先插入到合法位置
    dl.inserts(4, 1);
    dl.inserts(5, 2);
    dl.inserts(6, 2); // 中间插入
    dl.display();
    return 0;
}
运行结果
链表内容:4 6 5 

内容的提问来源于stack exchange,提问作者Mir Rahat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:45:05