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

  1. #1
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 414
    Points : 23 871
    Points
    23 871
    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
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 414
    Points : 23 871
    Points
    23 871
    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
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 414
    Points : 23 871
    Points
    23 871
    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).

  7. #7
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    Je l'ai fait mais ça ne gère toujours pas le premier élément au pire des cas ça supprime la 1ère position

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 414
    Points : 23 871
    Points
    23 871
    Par défaut
    Citation Envoyé par Shonita Voir le message
    Je l'ai fait mais ça ne gère tjrs pas le premier élément au pire des cas ça supprime la 1ère position
    C'est que tu l'as mal fait. Ou que tu n'as pas compris ce que j'explique ci-dessus.
    Ne te lance pas d'emblée dans ce que j'ai écrit entre parenthèses. Ce n'est pas compliqué mais cela implique une subtilité qu'il faut être sûr d'avoir bien saisie, sinon ton programme va planter encore plus qu'avant.

    Si tu as modifié ton code par rapport à ce que tu nous as présenté, montre-le nous à nouveau ici.

  9. #9
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    Par défaut
    je m'excuse du retard j'ai été malade donc je l'ai modifié ainsi
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    void permutation(Liste *liste, int pos1, int pos2) {
        if(liste == NULL) {
            exit(EXIT_FAILURE);
        }
     
        //cas particulier
        if(pos1 == 1) {
            //Première cellule
            Element *tmpA = liste->premier;
     
            //Deuxième cellule
            Element *tmpB = liste->premier;
            Element *tmpB_precedent;
            int cpt = 1;
            int 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;
            liste->premier = tmpB;
            tmpB_precedent->suivant = tmpA;
            tmp = tmpA->suivant;
            tmpA->suivant = tmpB->suivant;
            tmpB->suivant = tmp;
        }
        else {
            //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;
        }
    }

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/03/2014, 17h25
  2. Changer la position des accolades
    Par T4unt dans le forum NetBeans
    Réponses: 7
    Dernier message: 11/07/2012, 17h48
  3. Problème de pointeur à travers des structures.
    Par sweet live dans le forum Débuter
    Réponses: 8
    Dernier message: 13/02/2012, 21h19
  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, 17h47
  5. communication de deux elements via des threads
    Par alexandre21130 dans le forum C++Builder
    Réponses: 1
    Dernier message: 22/07/2004, 02h25

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