基于指针的C++队列链表实现报错求助
指针实现C++链表队列的错误排查与修复建议
嘿,我看你在尝试用指针实现基于链表的C++队列时碰到问题了,先帮你捋捋现有代码里的明显错误,再给你一个能正常运行的完整实现思路~
首先先把你提供的代码贴出来:
#include <iostream> #include <stdlib.h> #include <ctype.h> #include <string> using namespace std; struct node{ int age; string firstname; string lastname; node *next; }; typedef node* pqueue; struct queue{ pqueue head; pqueue tail; }; // 初始化队列 void init(queue &q){ (q->head) = (q->tail)=NULL; } // 从尾部插入数据 void insert(queue &q,int x,string fn,string ln){ if((q-&...
核心错误分析
- 成员访问语法错误:在
init函数里你用了q->head,但q是queue类型的引用,不是指针!引用直接用.访问成员变量,正确写法应该是q.head = q.tail = nullptr;(这里推荐用C++的nullptr代替C风格的NULL,类型更安全)。 - 插入函数代码截断:你的
insert函数写到一半就断了,但从q-&...能看出来,你大概率还是犯了和初始化函数一样的错误——把引用当成指针来用了,应该用q.head、q.tail而不是q->head、q->tail。
修复后的完整实现代码
我给你补全并修复了所有问题,还加了出队、打印队列的功能,方便你测试:
#include <iostream> #include <string> using namespace std; struct node{ int age; string firstname; string lastname; node *next; // 给node加构造函数,创建节点更方便 node(int a, string fn, string ln) : age(a), firstname(fn), lastname(ln), next(nullptr) {} }; typedef node* pqueue; struct queue{ pqueue head; pqueue tail; }; // 初始化队列 void init(queue &q){ q.head = q.tail = nullptr; } // 入队:从尾部插入数据 bool enqueue(queue &q, int x, string fn, string ln){ // 用nothrow避免内存分配失败时抛出异常 node* newNode = new (nothrow) node(x, fn, ln); if (!newNode) { cerr << "内存分配失败!" << endl; return false; } // 队列为空时,头尾都指向新节点 if (q.head == nullptr) { q.head = q.tail = newNode; } else { // 队列非空时,把新节点挂到尾部,更新tail指针 q.tail->next = newNode; q.tail = newNode; } return true; } // 出队:从头部删除数据 bool dequeue(queue &q){ if (q.head == nullptr) { cerr << "队列为空,无法执行出队操作!" << endl; return false; } node* temp = q.head; q.head = q.head->next; // 如果出队后队列变空,tail也要置空 if (q.head == nullptr) { q.tail = nullptr; } delete temp; return true; } // 打印队列所有元素 void printQueue(const queue &q){ node* current = q.head; cout << "当前队列内容:" << endl; while (current != nullptr) { cout << "姓名:" << current->firstname << " " << current->lastname << ",年龄:" << current->age << endl; current = current->next; } } // 测试主函数 int main(){ queue myQueue; init(myQueue); // 插入几个测试数据 enqueue(myQueue, 25, "Alice", "Smith"); enqueue(myQueue, 30, "Bob", "Johnson"); enqueue(myQueue, 22, "Charlie", "Brown"); printQueue(myQueue); // 出队一次后再打印 dequeue(myQueue); cout << "\n出队一次后的队列:" << endl; printQueue(myQueue); return 0; }
额外优化小贴士
- 尽量别用
using namespace std:在大型项目里,这个写法容易引发命名冲突,建议改成std::cout、std::string这样的显式调用。 - 优先用
nullptr:nullptr是C11引入的空指针常量,比C风格的NULL类型更安全,更符合C的语法规范。 - 加内存分配检查:用
new (nothrow)创建节点,内存分配失败时会返回nullptr,而不是直接抛出异常,更便于我们处理错误情况。 - 用构造函数简化节点创建:给
node结构体加构造函数,不用手动给每个成员变量赋值,代码更简洁。
内容的提问来源于stack exchange,提问作者Gismail
相关产品推荐
相关产品推荐

