C++ 您能检查一下为什么在此代码中从链表中删除项目不起作用吗?
一位朋友请我帮他做一个练习,基本上想法如下 Car number = fr50000 Car owner = AlexNelson Parking time = 3.5 hours.C++ 您能检查一下为什么在此代码中从链表中删除项目不起作用吗?,c++,data-structures,linked-list,singly-linked-list,C++,Data Structures,Linked List,Singly Linked List,一位朋友请我帮他做一个练习,基本上想法如下 Car number = fr50000 Car owner = AlexNelson Parking time = 3.5 hours. p=p->link您正在修改局部变量p的值,而不是列表。您需要修改上一个节点的链接字段。您的remove()函数实际上没有从列表中删除(或销毁)节点。您需要更新列表中上一个节点的链接,以指向列表中的下一个节点。如果删除列表中的第一个节点,您还需要更新头 请尝试以下方法: void remov
p=p->link代码>您正在修改局部变量p的值,而不是列表。您需要修改上一个节点的链接
字段。您的remove()
函数实际上没有从列表中删除(或销毁)节点。您需要更新列表中上一个节点的链接
,以指向列表中的下一个节点。如果删除列表中的第一个节点,您还需要更新头
请尝试以下方法:
void remove()
{
if (isempty())
{
cout << "List is empty\n";
return;
}
char carnumber[15];
cout << "Enter car number to remove: ";
cin >> carnumber;
node *p = head;
node *prev = NULL;
while (p != NULL)
{
if (strcmp(p->carNumber, carnumber) == 0)
{
if (p == head)
head = p->link;
if (prev)
prev->link = p->link;
delete p;
cout << "Car removed\n";
return;
}
prev = p;
p = p->link;
}
cout << "Car was not found, check the number\n";
}
void remove()
{
if(isempty())
{
库特卡诺;
节点*p=头部;
node*prev=NULL;
while(p!=NULL)
{
如果(strcmp(p->carNumber,carNumber)==0)
{
如果(p==水头)
head=p->link;
如果(上一个)
上一个->链接=p->链接;
删除p;
cout-link;
}
库特卡号,卡号)=0)
{
节点*n=*p;
*p=(*p)->链接;
删除n;
cout-link);
}
cout在remove的循环中,当p
指向要删除的节点时,您正在执行p=p->link
,但实际上需要更新指向p
的节点的link
字段
下面是一个简单的方法:
node **p = &head;
while(*p)
if (strcmp((*p)->carNumber, carnumber) == 0)
break;
else p = &(*p)->link;
if (*p)
{
cout<<"Car removed\n";
delete std::exchange(*p, (*p)->link);
}
else cout << "Car was not found, check the number\n";
此练习是否要求您编写链表代码?否则可以更容易地实现。您的remove
函数不会对列表进行任何更改。请参阅。请特别注意使用指向Pointer@cigien是的,它被要求使用链表。@user4581301谢谢你能推荐一个小的吗为了理解您的意思,请编写代码或解释更多内容?我无法理解。非常感谢!!!非常感谢,希望您过得愉快,先生!如果OP的朋友不允许使用诸如std::string
和std::getline()
,他们肯定不会被允许使用std::exchange()
。@Remylebou哦,这被添加到问题中。羞耻,这更优雅:p“这更优雅”-使用std::(前进)列表
将是一个更加优雅的解决方案。但这项练习似乎并不需要优雅;-)cigien@RemyLebeau是对的,我也没有听说过它,仍然在学习指针,正如你所看到的,我犯了一个我应该意识到的巨大错误,非常感谢你们两位的努力。祝你愉快@AliGx“仍然学习指针”——在所有的现代C++代码中,尽量避免使用原始指针和<代码>新< /代码>。它们有各自的用途,它们也有错误的错误。使用的原始指针越少,代码就越容易出错。
void remove()
{
if (isempty())
{
cout << "List is empty\n";
return;
}
char carnumber[15];
cout << "Enter car number to remove: ";
cin >> carnumber;
node **p = &head;
while (*p != NULL)
{
if (strcmp((*p)->carNumber, carnumber) == 0)
{
node *n = *p;
*p = (*p)->link;
delete n;
cout << "Car removed\n";
return;
}
p = &(p->link);
}
cout << "Car was not found, check the number\n";
}
node **p = &head;
while(*p)
if (strcmp((*p)->carNumber, carnumber) == 0)
break;
else p = &(*p)->link;
if (*p)
{
cout<<"Car removed\n";
delete std::exchange(*p, (*p)->link);
}
else cout << "Car was not found, check the number\n";
auto h = *p;
*p = (*p)->link);
delete h;