[c] liste simplement chainé

Résolu
Bonjour,
J'ai un problème avec ceci :
#include<stdio.h>
#include<stdlib.h>

typedef struct liste
{
	int x;
	struct liste* next;
}liste;


void ajouteFin(liste *l,int b) /* ajoute un element en fin de liste*/
{
	
	liste *a;
	a=(liste *)malloc(sizeof(liste));
	a->x=b;
	l->next=a;
}
		


void ajouteDebut(liste *l,int b)/* ajoute element en début de liste*/
{
	
	liste *a;
	
	a=(liste *)malloc(sizeof(liste));
	a->x=b;
	a->next=l;

	l=a;/*pb */
	

}

int main()
{
	
	liste *l=NULL;
	l=(liste *)malloc(sizeof(liste));
	printf("test");
	if(l!=NULL)
	{
		
		l->x=1;
		l->next=NULL;
		ajouteDebut(l,4);
		
		
	}

	free(l);
	return 0;
}


Il ne s'agit que de la manipulation de liste chainé.Le problème ce situe au niveau de l'ajout en début de liste.La procédure ne marche pas ( erreur de segmentation à l'execution) mais je ne comprend pas pourquoi.
Je pense avoir identifié le pb ( au niveau de l'affectation l=a), mais je ne comprend pas pourquoi ça foire.

Si quelqu'un avait la gentillesse de m'aider ....

Pour info, compilé avec gcc 4.1.2 sous ubuntu edgy eft.
Merci d'avance
Configuration: Ubuntu 6.10
Firefox 2.0.0.2

4 réponses

  1. salut je t'ai fait une fonction qui ajoute ,je crois que sa va marcher

    /* insertion au début de la liste */
    int ins_debut_liste (Liste * liste, char *donnee){
    Element *nouveau_element;
    if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
    return -1;
    if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
    == NULL)
    return -1;
    strcpy (nouveau_element->donnee, donnee);

    nouveau_element->suivant = liste->debut;
    liste->debut = nouveau_element;
    liste->taille++;
    return 0;
    }
    1. void ajouteFin(liste *l,int b) /* ajoute un element en fin de liste*/
      {
      	
      	liste *a;
      	a=(liste *)malloc(sizeof(liste));
      	a->x=b;
      	l->next=a;
      }
      

      Attention, tu n'ajoutes pas un élément en fin de liste mais tu chaine *l vers ta nouvelle cellule. Pour ajouter a la fin, il faut donc avoir supposé que *l est le dernier element de ta liste... De plus aucune condition ne semble marquer la fin de liste (a.next pointe sur quoi ?).

      void ajouteDebut(liste *l,int b)/* ajoute element en début de liste*/
      {
      	
      	liste *a;
      	
      	a=(liste *)malloc(sizeof(liste));
      	a->x=b;
      	a->next=l;
      
      	l=a;/*pb */
      	
      
      }
      

      En effet, l=a pose un problème. Déjà en dehors de toute interprétation algorithmique, il ne sert a rien d'affecter l à la fin de cette fonction car sa durée de vie est limitée à cette fonction. Essaie plutôt :
      /**
        * @brief Ajoute un élément en tete de liste.
        * @param *l Liste a modifier.
        * @param b Element a ajouter
        * @return Adresse de la nouvelle tete
        */
      liste* ajouterDebut(liste* l, int b);
      

      A toi de coder la suite ;)

      int main()
      {
      	
      	liste *l=NULL;
      	l=(liste *)malloc(sizeof(liste));
      	printf("test");
      	if(l!=NULL)
      	{
      		
      		l->x=1;
      		l->next=NULL;
      		ajouteDebut(l,4);
      		
      		
      	}
      
      	free(l);
      	return 0;
      }
      

      Il faut aussi liberer la cellule ajoutée !

      Bon code.