-2
votes

J'ai fait une pile à l'aide d'une liste liée (sans tableau), mais ma fonction POP ne fonctionne pas

Dans ma fonction Pop, je stocke l'adresse de la tête dans Temp , puis à l'avenir. Lorsque je reçois une impasse dans Temp , je le supprime en attribuant null à celui-ci. Quand j'imprime la pile cependant, il ne retire pas la dernière poussée.

J'ai essayé d'utiliser Temp-> suivant = null . Ce n'est qu'alors que cela fonctionne, mais si temp-> suivent = null fonctionne. Ne devrait pas temp = null fonctionne aussi? xxx


xxx

Le résultat attendu devrait être: xxx

mais les résultats réels sont xxx


9 commentaires

J'imagine que la fonction pop pour renvoyer quelque chose .... BTW, vous vraiment devrait corriger votre formatage de votre code.


@Hasibur Rahman Shovon Veuillez formater le code pour le rendre lisible.


@Aconcagua non, il a une pile. Il ajoute de nouveaux nœuds à la fin et les apparaît de la fin. :)


Je me suis permis d'ajuster le formatage. Un peu d'espace aide à améliorer la lisibilité, plus important encore, est une indentation constante et cohérente - on peut voir immédiatement lorsque les blocs de code commencent et se terminent sans avoir à rechercher explicitement pour les accolades. Vous pourriez avoir un coup d'oeil différent styles de codage , je vous recommande personnellement à Allman Style (qui est Ce que j'ai formaté votre code).


@Vladfrommosw oh, [@ * # + $!], Négligé que ... alors l'inverse de l'autre côté: une pile utilisant une liste liée est beaucoup plus simple manipulée (et beaucoup plus efficace) si poussant et apparaissant à partir de ...


@Aconcagua je suis d'accord. :)


@Vladfrommoscow '[...] beaucoup plus simple [...]' - cette partie était destinée à Hasibur ...


Vous ne libérez pas les nœuds que vous créez, ce qui entraîne une fuite de mémoire. Habituez-vous à dès le départ: chaque MALLOC doit être accompagné d'un correspondant , donc chaque fois que vous faites le premier, ayez-le en même temps!


L'algorithme ici est un non-sens. Une pile est censée être facile parce qu'on mettez simplement une nouvelle plaque sur le dessus et prenez la plaque la plus haute en fonction des besoins, mais vous mettez la dernière assiette sous la pile ... I.e. Même après les correctifs proposés ici c'est des ordures.


3 Réponses :


1
votes

La fonction change la variable locale TEMP au lieu de changer l'élément de données suivant du nœud avant le dernier nœud de la liste.

Il peut regarder ce qui suit manière xxx

maintenant la variable TEMP Points exactement à l'élément de données suivant du nœud avant le dernier nœud. C'est la liste elle-même modifiée.

N'oubliez pas de libérer le dernier nœud.


0 commentaires

-1
votes

Votre droit que la pop ne fonctionnerait pas. Tout ce que vous êtes, vous définissez le pointeur Temp sur NULL lorsque vous avez trouvé l'élément de fin. Ce que vous devez faire est de libérer l'élément à Temp d'abord, puis définissez le pointeur qui le pointe de l'élément précédent à NULL.

void pop()
{
    if(head==NULL){
       printf("\n no element to pop\n");
}
else
{
   struct student* temp=head;
    struct student* previous=head;
    while(temp->next!=null){
        previous=temp;
        temp=temp->next;
    }
    if(previous!=next) //if there was more than one
    {
      previous->next=NULL;
    }
    else
    {
     head=NULL;
    }

    free(temp);


}

}


0 commentaires

0
votes

Le code temp = null définit la variable TEMP sur null, pas le champ suivant de TEMP . Avec ce dernier, il ne retire pas le nœud.


0 commentaires