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 :

Toujours les listes chainées


Sujet :

C

  1. #1
    Membre confirmé 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
    Points : 477
    Points
    477
    Par défaut Toujours les listes chainées
    Toujours le même exemple que toute a l'heure. J'ai écrit une fonction qui trie ma liste chainée, mais il y a des choses que j'ai toujours du mal a comprendre. Dans la fonction Tri j'ai mis trie = min en commentaire. Je ne comprends pas pourquoi avec cette instruction j'ai des chaines vides pour le nom (ca marche en utilisant ,comme j'ai finalement fait, strncpy) pour les deux premiers éléments de la liste triée.
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    #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 afficheEmploye(Employe* e)
    {
    	if (e)
    		printf("%s\t%d\n",e->nom,e->salaire);
    	else
    		printf("mauvaise allocation\n");
    }
     
    void afficheListe(Liste L)
    {
    	while (L)
    	{
    		afficheEmploye(L);
    		L=L->suivant;
    	}
    }
     
    void ajouteEmploye(Liste *L,int salaire,char nom[MAX])
    {
    	//ajoute un employe en tete de liste
    	Liste tmp = (Liste)malloc(sizeof(Employe));
    	if (!tmp) return;
    	tmp->salaire = salaire;
    	strncpy(tmp->nom,nom,MAX-1);
    	tmp->nom[MAX]='\0';
    	tmp->suivant = *L;
     
    	*L = tmp;
    }
     
    void SoustraitEmploye(Liste *L,char nom[])
    {
    	if (strcmp((*L)->nom,nom)==0)
    	{
    		*L=(*L)->suivant;
    	}
     
    	else
    	{
    		Liste tmp2,tmp = *L;
    		while (strcmp(tmp->nom,nom)!=0)
    		{
    			tmp2 = tmp;
    			tmp=tmp->suivant;
    		}
    		tmp2->suivant=tmp->suivant;
    		free(tmp);
    	}
    }
     
    Liste Tri(Liste* L)
    {
    	Liste trie = malloc(sizeof(Employe));
    	Liste min = *L;
    	Liste tmp = *L;
     
    	if (!(*L)->suivant)
    	{
    		return *L;		
    	}
     
    	while (tmp)
    	{
    		if (tmp->salaire < min->salaire)
    		{
    			min = tmp;
    		}
    		tmp = tmp->suivant;
    	}
    	//trie = min;
    	strncpy(trie->nom,min->nom,MAX);
    	trie->salaire=min->salaire;
    	SoustraitEmploye(L,min->nom);
    	trie->suivant= Tri(L);
    	return trie;
    }
     
     
    int main()
    {
    	char nom[5]="jean";
    	Liste L = NULL;
    	ajouteEmploye(&L,89,nom);
    	ajouteEmploye(&L,780,"fred");
    	ajouteEmploye(&L,678,"pierre");
    	ajouteEmploye(&L,567,"alain");
    	ajouteEmploye(&L,134,"nicolas");
    	afficheListe(L);
    	Liste trie=L;
    	trie=Tri(&trie);
    	free(L);
    	afficheListe(trie);
    	return 0;
    }
    Et de la meme facon j'aimerais savoir pourquoi j'ai aussi une chaine vide pour le nom pour le dernier élément de la liste triée si je remplace dans le main trie=Tri(&trie) par trie=Tri(&L). Mystérieux effets de bord, enfin mystérieux pour le débutant que je suis. Qq'un peut m'éclairer?
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  2. #2
    Membre éprouvé

    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
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par KindPlayer
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // [...]
    	Liste trie = malloc(sizeof(Employe));
    // [...]
    [...]
    Où est le free() ?
    Et le test de la valeur de retour de malloc() ? (cf. Bien utiliser malloc())
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Dans le cas ou tu fais trie = min, il faut revoir les allocations. Notamment :
    - trie = malloc(...) ne sert plus.
    - free(L) est faux, puisque tu utilises (potentiellement) le pointeur juste apres dans afficheListe()
    - enfin, il faut bien prendre conscience que free(L) ne libere que la tete de ta liste.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/11/2007, 18h59
  2. les listes chaines en c++ builder
    Par touf213 dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/07/2007, 18h06
  3. des questions sur les listes chainées
    Par hunter99 dans le forum C
    Réponses: 13
    Dernier message: 05/12/2006, 22h51
  4. les listes chaineés(structures)
    Par snakemetalgear dans le forum C
    Réponses: 18
    Dernier message: 14/11/2006, 18h09
  5. les listes chainées
    Par najwWa dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2006, 19h09

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