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

C语言结构体队列删除节点时如何获取并显示被删客户的信息

核心问题点

  • 你传入removeCustomer的第二个参数是用来接收被删客户信息的结构体指针,但函数内直接把该指针赋值为队列头节点地址,覆盖了原本指向主函数customerInfo的地址,导致信息根本没有写回主函数的变量。
  • 字符串拷贝逻辑写反,且使用了未初始化的野指针name,原代码strcpy(c->name,name)是非法操作,会触发内存错误。
  • 变量使用混乱:不存在barcodeCopy变量,结构体里存储条码的字段名是barcodeNumber不是barcode。
  • 队列删除逻辑不完整:删除头节点后如果队列为空,没有将tail指针置空,会遗留野指针。

修复后的代码

修改后的removeCustomer函数

int removeCustomer(EventQueue *qPtr, Customer *c)
{
    if(qPtr == NULL || c == NULL)
        return INVALID_INPUT_PARAMETER;

    if(qPtr->head == NULL)
        return INVALID_QUEUE_OPERATION;

    // 先把要删除的头节点的信息拷贝到传入的c指向的结构体中
    Customer *toDelete = qPtr->head;
    strcpy(c->name, toDelete->name);
    c->barcodeNumber = toDelete->barcodeNumber;

    // 执行头节点删除逻辑
    qPtr->head = qPtr->head->next;
    // 如果删除后队列为空,tail也要置空
    if(qPtr->head == NULL)
        qPtr->tail = NULL;
    
    free(toDelete);

    return SUCCESS;
}

主函数可选优化(避免编译警告)

// 标准C要求main返回int,不是void
int main()
{
    // 提前定义返回值变量,需保证pQueue已经完成初始化
    int result;
    EventQueue *pQueue = /* 你的队列初始化逻辑 */;

    printf("\nAttempting to remove customer from queue..");

    Customer customerInfo;
    result = removeCustomer(pQueue, &customerInfo);

    if (result != SUCCESS)
    {
        printf("ERROR: Unable to remove customer from queue.\n");
    }
    else
    {
        printf("..customer removed successfully!\n");
        printf("The customer removed was %s who was barcode number %.0lf.\n", customerInfo.name, customerInfo.barcodeNumber);
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者Casper Josh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:18:00