Bonjour,
J'ai fait un fichier à la base permettant de gérer une seule liste, j'ai essayé de faire en sorte de pouvoir utiliser plusieurs listes mais j'ai un problème :
Fichier.h :
fichier.c :
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 #ifndef meoliste_H #define meoliste_H #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <assert.h> #include <ctype.h> typedef struct {int nb_occ; int valeur;} t_doublet; typedef struct element {t_doublet doublet; struct element *pred; struct element *succ;} t_element; typedef struct {t_element *drapeau; t_element* ec;} t_liste; void init_liste(t_liste* p); int liste_vide(t_liste* p); int hors_liste(t_liste* p); void en_tete(t_liste* p); void en_queue(t_liste* p); void precedent(t_liste* p); void suivant(t_liste* p); void valeur_elt(t_liste* p, t_doublet* e); void modif_elt(t_liste* p, t_doublet v); void oter_elt(t_liste* p); void ajout_droit(t_liste* p, t_doublet e); void ajout_gauche(t_liste* p, t_doublet e); #endif
Merci d'avance, lorsque j'initialise la liste avec :
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 /* Mise en oeuvre contigue d'une liste d'entiers */ #include "meoliste.h" void init_liste(t_liste* p) { t_element* drapeau; t_element* ec; p->drapeau = drapeau; p->ec = ec; p->drapeau=(t_element*)malloc(sizeof(t_element)); p->drapeau->pred=p->drapeau; p->drapeau->succ=p->drapeau; p->ec = p->drapeau; } int liste_vide(t_liste* p) { return (p->drapeau->succ==p->drapeau||p->drapeau->pred==p->drapeau); } int hors_liste(t_liste* p) { return(p->ec==p->drapeau); } void en_tete(t_liste* p) { if(!liste_vide(p)) { p->ec = p->drapeau->succ; } } void en_queue(t_liste* p) { if(!liste_vide(p)) p->ec = p->drapeau->pred; } void precedent(t_liste* p) { if(!hors_liste(p)) p->ec = p->ec->pred; } void suivant(t_liste* p) { if(!hors_liste(p)) p->ec = p->ec->succ; } void valeur_elt(t_liste* p, t_doublet *e) { if(!hors_liste(p)) *e = p->ec->doublet; } void modif_elt(t_liste* p, t_doublet v) { if(!hors_liste(p)) p->ec->doublet=v; } void oter_elt(t_liste* p) { if(!hors_liste(p)) { t_element *temp; temp=p->ec; p->ec->succ->pred=p->ec->pred; p->ec->pred->succ=p->ec->succ; p->ec=p->ec->pred; free(temp); } } void ajout_droit(t_liste* p, t_doublet e) { if(liste_vide(p)||!hors_liste(p)) { t_element *nouv; nouv=(t_element*)malloc(sizeof(t_element)); nouv->doublet=e; nouv->succ=p->ec->succ; nouv->pred=p->ec; p->ec->succ->pred=nouv; p->ec->succ=nouv; p->ec=nouv; } } void ajout_gauche(t_liste* p, t_doublet e) { if(liste_vide(p)||!hors_liste(p)) { t_element *nouv; nouv=(t_element*)malloc(sizeof(t_element)); nouv->doublet=e; nouv->pred=p->ec->pred; nouv->succ=p->ec; p->ec->pred->succ=nouv; p->ec->pred=nouv; p->ec=nouv; } }
t_liste *p;
init_liste(p)
J'ai un core dumped (erreur de segmentation) à la clé lors de l'exécution du programme.
Je met quand même le fichier me permettant de tester tout ça :
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 #define vrai 1 #define faux 0 #include "meoliste.h" void afficher(t_liste* p) { t_doublet elt; int i; en_tete(p); while(!hors_liste(p)){ valeur_elt(p,&elt); for(i=0;i<elt.nb_occ;i++){ printf("%i ",elt.valeur); } suivant(p); } printf("\n"); } void ajout(t_liste* p) { t_doublet elt; int age=-1; printf("Entrez un age entre 0 et 100\n"); while(age<0||age>100){ scanf("%i",&age); } en_tete(p); valeur_elt(p,&elt); while(!hors_liste(p)){ if(elt.valeur<age){ suivant(p); valeur_elt(p,&elt); } else if(elt.valeur==age){ elt.nb_occ++; modif_elt(p,elt); break; } else { elt.nb_occ=1; elt.valeur=age; ajout_gauche(p,elt); break; } } if(hors_liste(p)){ en_queue(p); elt.nb_occ=1; elt.valeur=age; ajout_droit(p,elt); } } void moyenne(t_liste* p) { t_doublet elt; int i; int moyenne=0; int nombre_elt=0; en_tete(p); while(!hors_liste(p)){ valeur_elt(p,&elt); for(i=0;i<elt.nb_occ;i++){ moyenne+=elt.valeur; } nombre_elt+=elt.nb_occ; suivant(p); } printf("Total : %i, nombre d'element : %i, moyenne : %i\n",moyenne,nombre_elt,moyenne/nombre_elt); } void rang_n(t_liste* p) { t_doublet elt; int i; int nombre_elt=0; en_tete(p); valeur_elt(p,&elt); int age=-1; printf("Entrez un age entre 0 et 100 pour avoir son rang\n"); while(age<0||age>100){ scanf("%i",&age); } while(!hors_liste(p)){ valeur_elt(p,&elt); nombre_elt++; if(elt.valeur==age) { printf("La valeur %i se trouve au rang %i \n",age,nombre_elt); break; } suivant(p); } if(hors_liste(p)) printf("La valeur entree ne se trouve pas dans la liste\n"); } void vider(t_liste* p) { en_queue(p); while(!hors_liste(p)){ oter_elt(p); } } /* Programme principal */ int main(void) { int choix; t_liste* p; // Initialisation de la liste init_liste(p); // Affichage du menu et saisie du choix do { printf("\nMenu :\n"); printf(" 1 - Ajouter une valeur\n"); printf(" 2 - Calculer la moyenne\n"); printf(" 3 - Valeur de rang n\n"); printf(" 4 - Vider la liste\n"); printf(" 5 - Quitter\n"); printf("Votre choix : "); scanf("%d",&choix); // Traitement du choix de l'utilisateur switch(choix) { case 1: ajout(p); afficher(p); break; case 2: moyenne(p); afficher(p); break; case 3: rang_n(p); afficher(p); break; case 4: vider(p); afficher(p); break; case 5: break; default: printf("Erreur: votre choix doit être compris entre 1 et 5\n"); } } while(choix!=5); printf("Au revoir !\n"); return 0; }
Partager