Liste chainée

Résolu
mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022 - 22 juin 2006 à 21:39
mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022 - 22 juin 2006 à 23:41
Bonjour,


Je souhaite faire une liste chainée d'utilisateurs et pouvoir mettre à blanc, ajouter, supprimer, lister et trier cette liste.

En faite quand je veux ajouter et visualiser ma liste, j'ai un "Segmentation fault" !


Quelqu'un a une idée de l'erreur ?


#include<stdio.h>

#include<malloc.h>


#define Faux 0

#define Vrai 1


typedef struct listelogin{

               char val;

               struct listelogin *next;

        }listelogin;


int estVide(listelogin* L){

         if(L == NULL){

                 return Vrai;

              }

         else{

                 return Faux;

             
}            


     }

void InitListe(listelogin **L){

        if(!estVide(*L)){

             InitListe(&((*L)->next));

             *L = NULL;

         }     

     }            

  

void Ajouter(listelogin **L, char v){

       listelogin *tmp = *L;

       listelogin *nouveau = (listelogin*)malloc(sizeof(listelogin));

       if(nouveau == NULL){

                  exit(1);

             }

       nouveau->val = v;

       nouveau->next = NULL;

       if(estVide(*L)){

            *L =
nouveau;          

       }

       else{

            tmp = *L;

            while(tmp->next != NULL){

                
tmp = tmp->next;  

            }

            tmp->next = nouveau;

       }

     }


 void Trier(listelogin **L){

       listelogin *tmp1, *tmp2;

       listelogin *Min;

       char t;

       tmp1 = *L;

       while(tmp1 != NULL){

             Min = tmp1;

             tmp2 = tmp1;

             while(tmp2 != NULL){

                
if(Min->val > tmp2->val) Min = tmp2;

                
tmp2 = tmp2->next;      

             }

             t = tmp1->val;

             tmp1->val = Min->val;

             Min->val = t;

            

             tmp1=tmp1->next;    

       }

  }    

 void Supprimer(listelogin **L, char v){

      listelogin *tmp;

      int d;

      if(!estVide(*L)){

          tmp = *L;

          d = 0;

          if(tmp->val == v){

            
*L = (*L)->next;       

          }

          else{

             while( d == 0 && tmp->next != NULL){

                  
if(tmp->next->val v) d 1;

                  
else  tmp =
tmp->next;               


             }

             if(d 1)  tmp->next tmp->next->next;

            
else        
printf("             
!cette valeur n'est pas trouvable!\n");     

         
}                 


      }

      else{

          
printf("               
!La liste est vide. Impossible de faire la suppression!\n");

      }

 } 

 

 int Longueur(listelogin *L){

     int l=0;

     listelogin *tmp = L;

     while(tmp != NULL){

         l++;

         tmp = tmp->next;   

     }

     return l;

 }

 void Afficher(listelogin *L){

         listelogin *tmp;

         if(estVide(L)){

            
printf("!la liste est
vide!\n");          

         }

         else{

           tmp = L;

           while(tmp != NULL){

                printf("%s ",tmp->val);

               
tmp = tmp->next;   

           } 

         }

      }

    

         

int main(){


  listelogin *L = NULL;

  int choix;

  char *fichier;

  char v;

 

  do{

      printf("1-Nouvelle Liste.\n");

      printf("2-Ajouter login.\n");

      printf("3-Supprimer login.\n");

      printf("4-Trier la Liste.\n");

      printf("5-Afficher.\n");

      printf("0-Quitter.\n");

     

      printf("   -->choix(0-5):");scanf("%d",&choix);

     

      switch(choix){

         case   1:InitListe(&L);

                break;

         case   2:printf(" - Entrer une valeur : "); scanf("%s",&v);

                  Ajouter(&L, v);

                break;

         case   3:printf(" - Entrer une valeur : "); scanf("%s",&v);

                  Supprimer(&L,v);

                break;

         case   4:Trier(&L);

                break;

         case   5:Afficher(L);

                break;

      }

 

  }while(choix != 0);


 return 0;




Merci

3 réponses

rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
22 juin 2006 à 23:16
Moi je peux ajouter et visualiser mais j'ai changer le printf("%s") en %c car sinon il cherche un  \0 ...
3
24Karas Messages postés 233 Date d'inscription jeudi 4 juillet 2002 Statut Membre Dernière intervention 5 juillet 2008
22 juin 2006 à 23:25
tu stock 1 caracter (char) dans la structrure et tu veux stocker une chaine (char *)
faut allouer pour stocker des chaines.
puis pour trier utiliser memcmp, ...

      char val; // != de char *

++
0
mayapour Messages postés 17 Date d'inscription mercredi 24 novembre 2004 Statut Membre Dernière intervention 12 janvier 2022
22 juin 2006 à 23:41
Merci ça fonctionne :-D
0
Rejoignez-nous