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

基于指针的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:31:05