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 :

Inversion de deux listes


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Par défaut Inversion de deux listes
    Bonjour à tous,
    J'ai un petit problème avec un projet que je dois faire pour une UV d'info...
    Je suis censé faire dedans une fonction permettant de croiser deux listes de bits, c'est à dire intervertir les éléments de deux listes selon une probabilité donnée (pCroise) pour chaque position dans la liste...
    Avant tout, afin que vous compreniez :

    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
    /* définition de la constante "pCroise", probabilité de croisement */
    #define pCroise 50
     
    /* définition du type "Bit" */
    typedef unsigned char Bit;
     
    /* définition du type "element" */
    typedef struct element
    {
            Bit bit;
            struct element* next;
    }element;
     
    /* définition du type "list" */
    typedef element* list;
     
    /* définition du type "Individu" */
    typedef struct Individu
    {
           list gencode;
           /*(d'autres trucs inutiles ici);*/
    }Individu;
    Donc dans mon programme j'ai deux variables personne1 et personne2 de type "Individu". Leur liste de bits "gencode" a été initialiser aléatoirement avec 0 ou 1. Voici donc comment j'utilise ma fonction "switch" d'inversion :

    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
    Appel de la fonction dans le main :
    switchlist(&personne1.gencode,&personne2.gencode);
     
    Fonction :
    void switchlist (list* l1, list* l2)
    {
         list list1=(*l1),list2=(*l2);
         Bit* temp=NULL;
         if(pCroise!=0)
         {
             while((*l1)!=NULL)
             {
                 if ((int)rand()%(100/pCroise)+1==1)
                 {
                     temp=(Bit*)malloc(sizeof(Bit));
                     (*temp)=(*l1)->bit;
                     (*l1)->bit=(*l2)->bit;
                     (*l2)->bit=(*temp);
                     free(temp);
                 }
                 (*l1)=(*l1)->next;
                 (*l2)=(*l2)->next;
             }
             (*l1)=list1;
             (*l2)=list2;
         }
    }
    Le problème étant qu'après avoir appelé cette fonction, mes deux listes restent les mêmes...
    Merci d'avance pour votre aide

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    rand() donne un résultat entre 0 et RAND_MAX...

    Il faut normaliser avant de pouvoir comparer avec ton pourcentage...

    Ici tu ne passes jamais dans ton test..

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Par défaut
    Je ne crois pas que le problème vienne de là car même lorsque je fais un if(1) cela donne la même chose...

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Cette ligne est FAUSSE et ne marchera qu'exceptionnelement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                 if ((int)rand()%(100/pCroise)+1==1)
    RAND_MAX pouvant valoir ... RAND_MAX (par exemple 32767), la probabilité que ceci multiplié par ton pourcentage soit égal à 0 est... 1/32767....

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Par défaut
    Même réponse

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je ne vois pas pourquoi les listes restent inchangées (j'ai essayé et elles changent) sauf
    - si tu n'entres jamais dans le if ( tu as dit que ce n'est pas le cas)
    - lorsque tu entres dans le if les éléments bit des deux listes ont la même valeur !
    Tu te compliques par ailleurs un peu l'existence. Le même code simplifié :

    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
    void switchlist (list* l1, list* l2)
    {
         list list1=(*l1),list2=(*l2);
         Bit temp;
         if(pCroise!=0)
         {
             while(list1!=NULL)
             {
                 if (rand()%(100/pCroise)+1==1) // attention, la division est entière.Si c'est un pourcentage ...
                 {
                     temp=list1->bit;
                     list1->bit=list2->bit;
                     list2->bit=temp;
                 }
                 list1=list1->next;
                 list2=list2->next;
             }
         }
    }

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Par défaut
    Merci beaucoup
    En réalité j'avais à la base un code similaire au tien mais étant donné que ca ne voulait pas marcher je l'ai un peu compliqué pensant que c'était faux...
    Or il se trouve qu'il n'était même pas faux mais que c'est au niveau du main qu'il y a une erreur...
    En tout cas merci beaucoup pour vos réponses
    [Résolu]
    edit : nan en fait mon code à la base c'était exactement le même héhé...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP-JS] Lier deux listes déroulantes
    Par budiste dans le forum Langage
    Réponses: 6
    Dernier message: 15/11/2005, 16h36
  2. [WD5.5] Lier deux listes déroulantes
    Par grellierj dans le forum WinDev
    Réponses: 7
    Dernier message: 11/10/2005, 18h33
  3. [FLASH MX2004] Drag and drop entre deux List
    Par aldo-tlse dans le forum Flash
    Réponses: 15
    Dernier message: 24/09/2005, 02h10
  4. concatener deux listes
    Par adel25 dans le forum C++
    Réponses: 1
    Dernier message: 22/09/2005, 13h56
  5. [XLS] De deux listes déplacer les nouvelles entrées
    Par Henrique92 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/09/2005, 23h12

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