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

