-1
votes

Pouvez-vous vérifier pourquoi la suppression d'un article d'une liste liée ne fonctionne pas dans ce code?

On m'a demandé un ami de l'aider avec un exercice, fondamentalement, l'idée est comme ci-dessous. XXX

Il a été dit de ne pas utiliser de choses comme String ou getline , c'est donc une application simple pour apprendre l'idée de travailler avec des listes liées.

donc j'ai fait ce programme. Lorsque j'appelle la fonction Supprimer () la première fois, il est indiqué que la liste est vide au début (comme cela devrait le faire). Mais la deuxième et la troisième fois, il dit que la voiture est supprimée, mais lorsque j'appelle la fonction afficheur () , la voiture est toujours là (elle n'a pas supprimé de la liste)

Pouvez-vous me dire ce qui ne va pas avec mon code? xxx


6 commentaires

Cet exercice nécessite-t-il pour écrire le code de liste liée? Il peut être mis en œuvre beaucoup plus facilement autrement.


Votre fonction Supprimer ne fait rien pour changer la liste.


Voir Comment puis-je supprimer correctement des nœuds de liste liée en C ++ . Portez une attention particulière à l'alternative à l'aide du pointeur au pointeur


@Cigien Oui Il est demandé d'utiliser la liste liée.


@ user4581301 merci beaucoup


@interjay je l'ai eu merci mate


3 Réponses :


0
votes

p = p-> lien; Vous modifiez la valeur de la variable locale P, pas la liste. Vous devez modifier le champ LINK DU NODE PRÉCIALE.


1 commentaires

Pouvez-vous suggérer un petit code ou l'expliquer plus à comprendre ce que vous voulez dire s'il vous plaît? Je ne pouvais pas l'obtenir.



0
votes

Votre Supprimer () code> La fonction ne supprime pas (ou détruire) un nœud de la liste. Vous devez mettre à jour le lien code> du nœud Précédent em> dans la liste pour pointer sur le nœud Suivant em> dans la liste. Et vous devez mettre à jour aussi la tête code> aussi, si vous retirez le 1er noeud de la liste.

Essayez cela à la place: P>

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";
}


1 commentaires

Merci beaucoup !!! Vraiment apprécié, j'espère que vous passez une bonne journée monsieur!



0
votes

dans la boucle Enlever, vous faites p = p-> link code>, lorsque p code> pointe sur le nœud que vous souhaitez supprimer. Mais vous devez réellement mettre à jour le champ code> lien code> du nœud qui pointe vers p code>.

Voici un moyen simple de faire cela: p>

auto h = *p;
*p = (*p)->link);
delete h;


7 commentaires

Si l'ami de l'OP n'est pas autorisé à utiliser des choses comme std :: string et std :: getline () , ils ne seront certainement pas autorisés à utiliser std :: échange () , soit.


@RemyleBeau Oh, qui a été ajouté à la question. Honte, c'est beaucoup plus élégant: p


" Ceci est beaucoup plus élégant " - en utilisant std: :( ​​wwward_) liste serait une solution encore plus élégante. Mais il semble que l'exercice ne veut pas l'élégance ;-)


Cigien @RemyleBeau a raison et TBH Je n'ai pas entendu parler de cela aussi, d'apprendre encore sur des pointeurs que vous voyez, j'ai fait une énorme erreur que j'aurais dû être au courant de, merci un million pour vos efforts de vos gars. Passez une bonne journée <3


@Aligx Eh bien, c'est une bonne occasion d'apprendre :)


@Aligx " Encornez toujours sur les pointeurs " - dans tous honnêtement, le code moderne C ++ devrait s'efforcer de rester rester à l'écart d'utiliser cru Pointeurs et Nouveau autant que possible. Ils ont leur part d'utilisation, et ils ont également leur part d'erreurs sujettes à l'erreur. Les mineurs RAW Les pointeurs que vous utilisez, moins votre code sera présenté par erreur.


@RemyleBeau Exactement, c'était ma première question pour l'OP. Mais s'ils doivent écrire une liste liée, ils doivent l'écrire. Abandonner une abstraction ne signifie pas qu'ils doivent tous abandonner tous :)