[c] liste simplement chainé

Résolu/Fermé
castorgris Messages postés 2 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 19 mars 2007 - 16 mars 2007 à 22:31
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 21 nov. 2007 à 22:03
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
A voir également:

4 réponses

ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
17 mars 2007 à 03:21
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
castorgris Messages postés 2 Date d'inscription vendredi 16 mars 2007 Statut Membre Dernière intervention 19 mars 2007
19 mars 2007 à 07:28
Merci pour l'aide.

puis sinon j'ai trouvé ce site pour ceux qui ont un pb similaire
https://openclassrooms.com/fr/courses#ss_part_3
0
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 nov. 2007 à 22:03
Salut,

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