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?