Liste chaînée en C - Changer un élément.
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Liste chaînée en C - Changer un élément.



  1. #1
    invite61ab3646

    Liste chaînée en C - Changer un élément.


    ------

    Bonsoir à tous.

    J'aimerai implémenter un algorithme qui, étant donnés une liste chaînée L et deux entiers a et n, retourne une liste chaînée identique à L mis à part le n-ème élément qui est remplacé par la valeur a.

    J'utilise la structure suivante :

    Code:
    struct cellule
    {
      int valeur;
      struct cellule *suivant;
    };
    typedef struct cellule *liste;


    A priori, il faut utiliser un pointeur qui parcours la liste chaînée jusqu'à l'élément souhaité pour le modifier. J'ai écris quelque chose comme ça pour le moment mais, j'ai quelques soucis avec les pointeurs. Je ne vois pas comment régler mon problème.

    Code:
    liste changer(liste L,int n,int a)
    {
    
        int *p=&L->valeur;
    
        liste P=L;
    
        int i;
    
        for (i=0;i<n-1;i++)
        {
            *p=P->suivant->valeur;
        }
    
        *p=a;
    
        return P;
    }


    Pourriez-vous me donner un coup de main, s'il vous plait ?

    En vous remerciant d'avance

    -----
    Dernière modification par JPL ; 03/11/2010 à 16h26. Motif: Ajout de la balise Code

  2. #2
    invite2d7144a7

    Re : Liste chaînée en C - Changer un élément.

    Bonjour,

    Pour commencer, petite remarque : on ne parcourt pas une liste chaînée avec une boucle for sur le nombre d'éléments, mais tant que le lien suivant n'est pas NULL.

    Pour savoir ce qu'il faut faire, petit retour au papier/crayon : un petit dessin de ta liste (quelques cases pour les données, liées par de flèches représentant les pointeurs), et tu regardes bien ce qui se passe avec les différents liens quand tu veux insérer une donnée là où tu le veux.
    Si tu as bien observé et noté, tu sais faire ton insertion.

  3. #3
    Jack
    Modérateur

    Re : Liste chaînée en C - Changer un élément.

    et prière pour la suite d'utiliser les balises code pour que le code soit plus lisible.

    Merci.

  4. #4
    invite61ab3646

    Re : Liste chaînée en C - Changer un élément.

    Mais, si je fais une boucle tant que le lien suivant n'est pas NULL, je vais parcourir toute ma liste chaînée, sans m'arrêter au bon élément, non ?

    Ca fait quelques heures que je bute là-dessus, avec les petits dessins comme tu l'as suggéré, mais rien y fait. Je n'arrive pas utiliser le pointeur comme il le faut.

    Ne peux-tu pas m'aider ?

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Liste chaînée en C - Changer un élément.

    Il suffit de tester dans ta boucle for si tu es arrivé en fin de liste ou pas. Dans ce cas, il faut sortir de la boucle.
    Je ne sais pas ce que doit renvoyer la fonction si l'élément cherché n'est pas trouvé, mais le plus simple serait de renvoyer NULL.

    Dans ce cas, si tu détectes la fin de liste dans le for, fais un
    Code:
        return NULL;
    A+

  7. #6
    invite61ab3646

    Re : Liste chaînée en C - Changer un élément.

    Je ne cherche aucun élément dans la liste.

    Je veux juste remplacer l'élément qui est en n-ème position par un autre élément a. Du coup, je ne vois pas comment me servir de la boucle.

  8. #7
    invite2d7144a7

    Re : Liste chaînée en C - Changer un élément.

    Bonjour,

    Ce n-ème élément, il a bien fallu que tu le trouves...

    Mais tu me sembles mal parti pour gérer ta liste, et je te conseille de reprendre à zéro, en utilisant les solutions classiques.
    Il n'est pas difficile de trouver des explications et des algorithmes expliquant tout ça en détails, ça fait partie des connaissances basiques pour un programmeur.

  9. #8
    Jack
    Modérateur

    Re : Liste chaînée en C - Changer un élément.

    Citation Envoyé par Adrien-San Voir le message
    Je ne cherche aucun élément dans la liste.

    Je veux juste remplacer l'élément qui est en n-ème position par un autre élément a. Du coup, je ne vois pas comment me servir de la boucle.
    puisque ça te perturbe, je réécrit mon précédent message:

    Il suffit de tester dans ta boucle for si tu es arrivé en fin de liste ou pas. Dans ce cas, il faut sortir de la boucle.
    Je ne sais pas ce que doit renvoyer la fonction si le n-ième élément n'est pas trouvé, mais le plus simple serait de renvoyer NULL.

    Dans ce cas, si tu détectes la fin de liste dans le for, fais un


    Code:
    return NULL;
    A+

  10. #9
    polo974

    Re : Liste chaînée en C - Changer un élément.

    pour te balader dans une liste, il faut utiliser le ->suivant en partant du début (L)
    si la liste est bien construite, le dernier->suivant == NULL, ça permet de ne pas exploser la mémoire...

    en pseudo code:
    Code:
    struct cellule *c;
     
    c=L;
    i=1;
     
    début de boucle
     
        si i==n positionner c->valeur et return L 
        si c->suivant == NULL return NULL pour indiquer erreur
     
        c=c->suivant
        i++
     
    fin de boucle
    en C, les boucles sont assez cool:
    for( faire les init (ou non); le test de continuation (ou non, car rien donne vrai); opération(s) de passage à l'étape suivant (ou non)

    for est donc un contrôle de boucle très puissant.

    mais on peut très bien s'en servir sans condition de continuation et en sortir sur break ou return (attention toutefois aux return parsemés dans une longue fonction...)
    Jusqu'ici tout va bien...

Discussions similaires

  1. Creer une liste chainée en JAVA
    Par inviteeecca5b6 dans le forum Logiciel - Software - Open Source
    Réponses: 8
    Dernier message: 31/05/2012, 19h30
  2. Changer de jour sans changer d'heure ?
    Par invite81ee397f dans le forum Physique
    Réponses: 2
    Dernier message: 19/06/2009, 11h07
  3. Eclairage et RT "élément par élément"
    Par invite2abb2eb0 dans le forum Électronique
    Réponses: 0
    Dernier message: 20/04/2009, 15h41
  4. élément
    Par invite8218219c dans le forum Physique
    Réponses: 1
    Dernier message: 27/11/2006, 13h37