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 :

Liste chaînée , exercice simple et perte d'élément


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Points : 10
    Points
    10
    Par défaut Liste chaînée , exercice simple et perte d'élément
    Bonsoir, je sollicite une fois encore de votre aide pour un problème de chaînage sur une liste moins classique.

    Je vous expose mon problème:
    j'ai une simple liste chaîné initialisée le plus simplement possible,
    une fonction d'ajout et une fonction d'affichage.

    cette liste ce différencie sur l'insertion, je m'explique:
    en effet au lieu d'ajouter un l'élément a la fin, au début ou au « next » j'insère à la place de l'élément courant.(je prend l'élément courant je le met au next de l'élément a inserer et je remplace le courant par l'élément a insérer)

    lors ce que j'ajoute des l'élément dans un ordre trié (a croissant) il n'y a pas de problème, mais lors ce que j'ajoute en désordre je perd tous les l'élément précédent l'élément ajouté.

    je pense que ça vient du *p ) *p->next qui efface les l'élément précédent, mais je ne trouve pas de solution, je vous remercie d'avance

    mon code
    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
    81
     
     
    #include<stdio.h>
    #include<stdlib.h>
     
    typedef struct list
    {
           struct list *next;
           int a;
           int b;
    }list;
    typedef list s_list;
     
    void inserer(s_list **l,int a,int b)
    {
    	if(*l==NULL)
    	{
    		s_list *s = malloc(sizeof(s_list));
    		s->next = NULL;
    		s->a = a;
    		s->b = b;
    		*l = s;
    	}
    	else
    	{
    		while(*l != NULL)
    		{
    			if((*l)->a == a)
    			{
    				((*l)->b += b);break;
    			}
    			if((*l)->a > a && (*l)->next == NULL)
    			{
    				s_list *s = malloc(sizeof(s_list));
    				s->next = NULL;
    				s->a = a;
    				s->b =b;
    				(*l)->next = s;break;
    			}
    			if((*l)->a < a)
    			{
    				s_list *s = malloc(sizeof(s_list));
    				s->next = *l;
    				s->a = a;
    				s->b =b;
    				*l = s;break;
    			}
    			else
    			{
    				*l = (*l)->next;
    			}
    		}
    	}
    }
     
     
     
    void afficher(s_list *l)
    {
    	while(l)
    	{
    		printf("%dX^%d\n",l->b, l->a);
    		l = l->next;
    	}
    }
    int main(int argc, char *argv[])
    {
           s_list *l= NULL;
           int a = 0;
           int b = 0;
     
     
           while(1)
           {
                   printf("un poly ?\n");
                   scanf("%d %d",&b,&a);
                   inserer(&l,a,b);
                   afficher(l);
           }
     
    }
    petite précision j'ai pas mal passé de temps sur gdd...
    mais c'est mes connaissances qui montrent leurs limites

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Alternative451 Voir le message
    Bonsoir, je sollicite une fois encore de votre aide pour un problème de chaînage sur une liste moins classique.

    Je vous expose mon problème:
    j'ai une simple liste chaîné initialisée le plus simplement possible,
    une fonction d'ajout et une fonction d'affichage.

    cette liste ce différencie sur l'insertion, je m'explique:
    en effet au lieu d'ajouter un l'élément a la fin, au début ou au « next » j'insère à la place de l'élément courant.(je prend l'élément courant je le met au next de l'élément a inserer et je remplace le courant par l'élément a insérer)

    lors ce que j'ajoute des l'élément dans un ordre trié (a croissant) il n'y a pas de problème, mais lors ce que j'ajoute en désordre je perd tous les l'élément précédent l'élément ajouté.

    je pense que ça vient du *p ) *p->next qui efface les l'élément précédent, mais je ne trouve pas de solution, je vous remercie d'avance
    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
     
    void inserer(s_list **l,int a,int b)
    {
     
    			if((*l)->a < a)
    			{
    				s_list *s = malloc(sizeof(s_list));
    				s->next = *l;
    				s->a = a;
    				s->b =b;
    				*l = s;break;
    			}
    			else
    			{
    				*l = (*l)->next;
    			}
    Il ne faut pas modifier inconsidérément le pointeur de tête !

    Ceci corrige le problème principal (usage d'un pointeur local qui laisse le pointeur initial intact).
    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
     
     
    #include<stdio.h>
    #include<stdlib.h>
     
    typedef struct list
    {
       struct list *next;
       int a;
       int b;
    }
    list;
    typedef list s_list;
     
    s_list *create_node (int a, int b)
    {
       s_list *this = malloc (sizeof (s_list));
       if (this != NULL)
       {
          this->next = NULL;
          this->a = a;
          this->b = b;
       }
       return this;
    }
     
    void inserer (s_list ** lst, int a, int b)
    {
       s_list *new = create_node (a, b);
       if (new != NULL)
       {
          if (*lst == NULL)
          {
             /* en tete */
             *lst = new;
          }
          else
          {
             s_list *p = *lst;
     
             while (p->next != NULL)
             {
                p = p->next;
             }
             p->next = new;
          }
       }
    }
     
    void afficher (s_list * lst)
    {
       while (lst != NULL)
       {
          printf ("%dX^%d\n", lst->b, lst->a);
          lst = lst->next;
       }
    }
    int main (void)
    {
       s_list *lst = NULL;
       int a = 0;
       int b = 0;
     
       while (1)
       {
          printf ("un poly ?\n");
          scanf ("%d %d", &b, &a);
          inserer (&lst, a, b);
          afficher (lst);
       }
     
    }
    Je te laisse rajouter le code bizarre auquel je n'ai rien compris (tri par insertion ? sur quel critère ?).
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. [TPW] Erreur lors de l'ajout d'un élément dans une liste chaînée triée
    Par sangimed dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 18/01/2013, 21h37
  2. [Turbo Pascal] Suppression d'éléments d'une liste chaînée simple
    Par gigimino dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 22/07/2011, 14h28
  3. [Free Pascal] Insertion d'éléments dans une liste chaînée
    Par Pacorabanix dans le forum Free Pascal
    Réponses: 4
    Dernier message: 20/04/2010, 00h42
  4. Exercice en listes chaînées?
    Par afterthenext dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 02/06/2009, 23h46
  5. Récupérer le Nième élément d'une liste chaînée
    Par decoy Octopus dans le forum Pascal
    Réponses: 3
    Dernier message: 03/11/2006, 18h03

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