IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

probleme liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut probleme liste chainée
    Bonjour j'ai créé une liste chainée permettant de gérer des employés, mais j'ai un problème avec les pointeurs sur les chaines de caractere. J'ai un erreur de segmentation mais je ne vois pas quelle allocation j'ai ratée.Pouvez vous m'aider?
    Sinon quelle est la balise pour afficher du code? J'ai essayé <code> </code> en majuscule et minuscule mais ca marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <stdlib.h>
    #include <stddef.h>
    #include <stdio.h>
    #include <string.h>
     
    #define MAX 30
    typedef struct Employe
    {
    	char nom[MAX];
    	int salaire;
    	struct Employe* suivant;
    }Employe;
     
    typedef Employe* Liste;
     
    void ajouteEmploye(Liste *L,Employe *e)
    {
    	//ajoute un employe en tete de liste
    	Liste tmp = malloc(sizeof(Employe));
    	tmp->nom = (char*)malloc((strlen(e->nom)+1)*sizeof(char));
    	strcpy(tmp->nom,e->nom);
    	tmp->salaire = e->salaire;
    	tmp->suivant = *L;
     
    	*L = tmp;
    }
     
    void afficheEmploye(Employe* e)
    {
    	if (e)
    		printf("%s\t%d\n",e->nom,e->salaire);
    }
     
    void afficheListe(Liste L)
    {
    	while (L)
    	{
    		afficheEmploye(L);
    		L=L->suivant;
    	}
    }
     
    int main()
    {
    	char * nom;
    	int salaire;
    	Employe * e = malloc(sizeof(Employe));
    	printf("entrez le nom d'un employe et son salaire\n");
    	scanf("%s",nom);
    	scanf("%d",&salaire);
    	e->nom = malloc((strlen(nom)+1)*sizeof(char));
    	strcpy(e->nom,nom);
    	e->salaire = salaire;
    	Liste L = NULL;
    	ajouteEmploye(&L,e);
    	afficheListe(L);
    	return 0;
    }

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par KindPlayer
    Bonjour j'ai créé une liste chainée permettant de gérer des employés, mais j'ai un problème avec les pointeurs sur les chaines de caractere. J'ai un erreur de segmentation mais je ne vois pas quelle allocation j'ai ratée.Pouvez vous m'aider?
    Deux choses, dans ta structure tu déclare nom comme tableau statique avec une valeure fixée à la compilation ... si tu veux allouer ta chaîne tu oublie ca, il te faut un pointeur sur char soit ta structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct Employe
    {
       char * nom;
       int salaire;
       struct Employe* suivant;
    }Employe;
    Puis ton allocation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp->nom = malloc (strlen (e->nom) + 1);
    Les cast sont inutiles en C et le sizeof (char) est également inutile car par définition, un char vaut 1 !

    Citation Envoyé par KindPlayer
    Sinon quelle est la balise pour afficher du code? J'ai essayé <code> </code> en majuscule et minuscule mais ca marche pas
    Pourquoi les faire à la main alors qu'il y'a des boutons au-dessus de la zone d'édition de texte. C'est le bouton avec le #. Si tu tiens tant que ca à les écrire à la main, c'est en majuscule mais entre crochets
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre chevronné Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Par défaut ah merde ptite erreur de copier coller
    J'avais bien definie la chaine par char * nom et nom char nom[MAX], j'avais entretemps changé pour la solution statique qui fonctionne bien. Donc dans un premier temps javais bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct Employe
    {
       char * nom;
       int salaire;
       struct Employe* suivant;
    }Employe;
    Mais jai une erreur de segmentation

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Moi je n'est pas d'erreur de segmentation:
    entrez le nom d'un employe et son salaire
    Franck
    1500
    Franck 1500

    Press ENTER to continue.
    D'ailleurs un conseil en passant... Les listes sont généralement séparées en deux structures bien distinctes soit:
    • 1 Structure pour un noeud de la liste
    • 1 Structure représentant la liste elle même


    Voir les structures de données sur cette page: http://nicolasj.developpez.com/#LI
    Prend également l'habitude de tester les retours de malloc !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Franck.H
    [...] c'est en majuscule mais entre crochets [...]
    Cela fonctionne aussi en minuscules.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    programmer :)
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : programmer :)
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut
    Salut;
    je suis entreint d'ajouter une fonction qui ajout un emplyé a la fin de la liste, mais j'obtient des erreurs
    Pouvez vous m'aider SVP
    voila le code de la focntio:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Liste ajout_fin(Liste L,Employe *e)
     {
        Liste nouvel_emp = malloc(sizeof(Employe));
    	nouvel_emp->code = e->code;
    	strcpy(nouvel_emp->nom,e->nom);
    	nouvel_emp->salaire = e->salaire;
    	nouvel_emp->suivant = NULL;
    	if(L==NULL)
    	{
    	    return nouvel_emp;
    	}
    	else
    	{
    	    Liste *courant=L;
     
    	    while(courant->suivant!=NULL)
    	    {
    	        courant=courant->suivant;
    	    }
    	    courant->suivant=nouvel_emp;
    	    return L;
    	}
     }

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1. Quel genre d'erreur?
    2. On peut voir la structure Employe telle qu'elle est définie dans ce code?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Probleme liste chainée
    Par hugo1787 dans le forum Débuter
    Réponses: 9
    Dernier message: 20/02/2008, 00h02
  2. Probleme liste chainée
    Par Raton dans le forum C++
    Réponses: 8
    Dernier message: 15/11/2005, 19h25
  3. Probleme arbre/liste chainée en template
    Par Raton dans le forum Langage
    Réponses: 1
    Dernier message: 07/11/2005, 16h09
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. Réponses: 11
    Dernier message: 02/05/2005, 19h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo