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:
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?