rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[c] liste simplement chainé

Posté par castorgris, le vendredi 16 mars 2007 à 22:31:55
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
Répondre à castorgris  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
ekra, le samedi 17 mars 2007 à 03:21: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. GPG Key ID = 5518CFC7
Répondre à ekra

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
castorgris, le lundi 19 mars 2007 à 07:28:29
Merci pour l'aide.

puis sinon j'ai trouvé ce site pour ceux qui ont un pb similaire
http://www.siteduzero.com/tuto-3-9440-1-les-listes-chainees.­html#ss_part_3
Répondre à castorgris

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
wipiwapi, le mercredi 21 novembre 2007 à 21:32:49
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;
}
Répondre à wipiwapi

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 lami20j, le mercredi 21 novembre 2007 à 22:03:10
Salut,

tu peux regaarder aussi dans la FAQ CCM liste simplement chainee
lami20j
Répondre à lami20j
Logiciels pertinents trouvés dans les téléchargements
Télécharger FastStone Capture 5.9FastStone Capture - Ce logiciel de capture est léger, efficace et simple à utiliser. Vous pouvez capturer l'écran complet, une fenêtre, une...Catégorie: Capture
Licence: Shareware
Télécharger CCleaner 2.09.600CCleaner - CCleaner (Crap Cleaner) est un utilitaire de nettoyage gratuit permettant de garantir un respect de la vie privée en...Catégorie: Anonymat/Confidentialité
Licence: Freeware/gratuit
Télécharger Conjugaison 2.0Conjugaison - Ce petit logiciel totalement gratuit peut s'avérer très pratique lors de la saisie d'un texte sur un logiciel de traitement...Catégorie: Grammaire/Orthographe
Licence: Freeware/gratuit
Télécharger Cartoonist 1.2Cartoonist - Cartoonist est un petit logiciel de morphing gratuit, permettant de faire des caricatures de vos amis et cela très...Catégorie: Trucage photo
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « [c] liste simplement chainé »