[c] liste simplement chainé
Résolu
castorgris
Messages postés
2
Statut
Membre
-
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
Bonjour,
J'ai un problème avec ceci :
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
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:
- [c] liste simplement chainé
- Liste déroulante excel - Guide
- Chaine tnt gratuite sur mobile - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Chaine radio - Télécharger - Médias et Actualité
4 réponses
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.
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
puis sinon j'ai trouvé ce site pour ceux qui ont un pb similaire
https://openclassrooms.com/fr/courses#ss_part_3
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;
}
/* 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;
}