C++ 您能检查一下为什么在此代码中从链表中删除项目不起作用吗?

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

一位朋友请我帮他做一个练习,基本上想法如下

Car number = fr50000 Car owner = AlexNelson Parking time = 3.5 hours.
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;