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
相关产品推荐
相关产品推荐

