IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Échanger deux positions à travers des pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut Échanger deux positions à travers des pointeurs
    Bonjour je suis nouvelle ici et j'ai besoin de votre aide sur un tp si possible. ça concerne une liste d'entiers simplement chaînée qui échange les positions des nœuds donnés par deux pointeurs g et d. Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 499
    Par défaut
    Bonjour et bienvenue,

    Nous pouvons t'aider mais nous ne ferons pas ton travail à ta place. Montre-nous ce que tu as écrit jusqu'ici (avec les balises [CODE] et [/CODE]) et nous tâcherons de t'orienter.

    Bon courage.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Bonjour et bienvenue,

    Nous pouvons t'aider mais nous ne ferons pas ton travail à ta place. Montre-nous ce que tu as écrit jusqu'ici (avec les balises [CODE] et [/CODE]) et nous tâcherons de t'orienter.

    Bon courage.
    Merci En fait je veux échanger les positions des nœuds donnés par deux pointeurs A et B sur une liste d'entiers chaînée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    typedef struct Element Element;
    struct Element {
        int val;
        Element *suivant;
    };
     
    typedef struct Liste Liste;
    struct Liste {
        Element *premier;
    };
     
    void (Liste *liste, int pos1, int pos2){
    //Première cellule
            Element *tmpA = liste->premier;
            Element *tmpA_precedent;
            int cpt = 1;
            int trouve = 0;
     
            while(tmpA->suivant != NULL && trouve == 0) {
                if(cpt == pos1) {
                    trouve = 1;
                }
                else {
                    tmpA_precedent = tmpA;
                    tmpA = tmpA->suivant;
                    cpt++;
                }
            }
     
            //Deuxième cellule
            Element *tmpB = liste->premier;
            Element *tmpB_precedent;
            cpt = 1;
            trouve = 0;
     
            while(tmpB->suivant != NULL && trouve == 0) {
                if(cpt == pos2) {
                    trouve = 1;
                }
                else {
                    tmpB_precedent = tmpB;
                    tmpB = tmpB->suivant;
                    cpt++;
                }
            }
     
            //On permute
            Element *tmp;
            tmpA_precedent->suivant = tmpB;
            tmpB_precedent->suivant = tmpA;
            tmp = tmpA->suivant;
            tmpA->suivant = tmpB->suivant;
            tmpB->suivant = tmp;
        }
    }
    Mais ça ne marche pas

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 499
    Par défaut
    Pourtant, c'est du bon travail.

    • À la ligne 13, tu as oublié le nom de ta fonction (entre void et « ( ») ;
    • Tout en bas, ligne 56, il y a une accolade en trop (défaut d'indentation).


    Une fois ces deux détails réglés, j'ai collé ton code au sein d'un programme de test et le résultat est bien celui attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        affiche (&l);
        permute (&l,4,7);
        affiche (&l);
    101 -> 102 -> 103 -> 104 -> 105 -> 106 -> 107 -> 108 -> 109 -> 110
    101 -> 102 -> 103 -> 107 -> 105 -> 106 -> 104 -> 108 -> 109 -> 110
    Par contre, ton programme souffre encore d'un tout petit défaut : il risque de planter si tu essaies de permuter le premier élément avec un autre…

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut
    C'est ça mon problème le 1er élément je ne sais pas pourquoi ça ne le considère pas

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 499
    Par défaut
    Citation Envoyé par Shonita Voir le message
    C'est ça mon problème le 1er élément je ne sais pas pourquoi ça ne le considère pas
    Parce que si c'est le premier élément, alors par définition, il n'y a pas encore d'éléments précédents. Tes deux pointeurs tmpA_precedent et tmpB_precedent ne pointent donc rien de valide à ce stade. Et comme tu ne les initialises pas en les déclarant, ils peuvent pointer n'importe quoi en mémoire.

    Il faut les initialiser à NULL au départ et vérifier ensuite si leur valeur a bien changé avant d'y affecter quelque chose aux lignes 50 à 53. De plus, puisque c'est le premier élément de la chaîne qui change, il faudra aussi mettre à jour la valeur de « liste->premier ».

    (Mon petit doigt me dit que tu dois pouvoir faire d'une pierre deux coups en faisant initialement pointer tes tmpX_precedent directement sur l'adresse de ->premier au démarrage, mais chut).

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/03/2014, 16h25
  2. Changer la position des accolades
    Par T4unt dans le forum NetBeans
    Réponses: 7
    Dernier message: 11/07/2012, 16h48
  3. Problème de pointeur à travers des structures.
    Par sweet live dans le forum Débuter
    Réponses: 8
    Dernier message: 13/02/2012, 20h19
  4. [VBA-E] : somme de deux lignes ayant des positions variables
    Par johnmakina dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/01/2007, 16h47
  5. communication de deux elements via des threads
    Par alexandre21130 dans le forum C++Builder
    Réponses: 1
    Dernier message: 22/07/2004, 01h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo