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 111 112 113 114 115
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct s_etudiant {
char nom[25];
struct s_etudiant *next;//pointeur vers la structure Etudiant suivante
} t_etudiant;
typedef struct {
t_etudiant *tete;
size_t nb;
} t_liste;
void initListe(t_liste*);
//creation de maillon
t_etudiant *creationMaillon(char[]);
//lire liste
void lireList(t_liste*);
//libère mémoire
void freeList(t_liste*);
//insertion dans l'ordre alphabétique
void ajoutAlpha(t_liste*, t_etudiant*);
// Initialisation de liste
void initListe(t_liste *l) {
l->tete=NULL;
l->nb=0;
}
//creation de maillon et hardcodage du nom
t_etudiant *creationMaillon(char nom[]) {
t_etudiant *maillon = NULL;
maillon = malloc(sizeof(t_etudiant));
if (maillon == NULL) {
printf("Mémoire insuffisante");
return NULL;
}
strcpy(maillon->nom, nom);
maillon->next=NULL;
return maillon;
}
//lire liste
void lireList(t_liste *l) {
printf("Lecture 0x%04x (0x%04x) - nb=%u\n", l, l->tete, l->nb);
t_etudiant *pt;
for (pt=l->tete; pt != NULL; pt=pt->next)
printf("0x%04x, %s (0x%04x)\n", pt, pt->nom, pt->next);
printf("---------------\n");
}
//libère la mémoire
void freeList(t_liste *l) {
t_etudiant *avant;
t_etudiant *apres;
apres=l->tete;
while (apres != NULL) {
avant=apres;
apres=apres->next;
printf("free(0x%04x (%s))\n", avant, avant->nom);
free(avant);
}
initListe(l);
printf("---------------\n");
}
void ajoutAlpha(t_liste *l, t_etudiant *item) {
// On a un élément de plus
l->nb++;
// Si liste vide
if (l->tete == NULL) {
l->tete=item;
return;
}
t_etudiant *avant;
t_etudiant *apres;
// Positionnement pointeurs avant et après
for (avant=NULL, apres=l->tete; apres != NULL && strcmp(apres->nom, item->nom) < 0; avant=apres, apres=apres->next);
// L'item à insérer vient forcément avant le "après"
item->next=apres;
// Si on a un "avant"
if (avant)
// Il vient alors juste avant l'item à insérer
avant->next=item;
else
// On est en début de liste
l->tete=item;
}
int main(int argc, char *argv[]) {
t_liste liste;
initListe(&liste);
char **pt;
for (pt=&argv[1]; *pt; pt++)
ajoutAlpha(&liste, creationMaillon(*pt));
lireList(&liste);
freeList(&liste);
lireList(&liste); // Juste pour le fun (tu remarqueras que "freeList" réinitialise la liste à l'issue)...
return 0;
} |
Partager