[c] liste simplement chainé

Résolu
castorgris Messages postés 2 Date d'inscription   Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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. ekra Messages postés 1873 Statut Membre 342
     
    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.
    0
  2. wipiwapi
     
    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;
    }
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    tu peux regaarder aussi dans la FAQ CCM liste simplement chainee
    0