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
|
#include<stdio.h>
#include <stdlib.h>
struct elem
{ /* ma structure liste chainée*/
int val;
struct elem *lien ;
};
/* -ed- Attention, les commentaires '//' sont C99 uniquement. */
/* fonction qui renvoit l'adresse de la première valeur supérieure ou égale à u */
struct elem *premier_elem_sup_ou_egal(int u)
{
struct elem *p;
struct elem *L;
/* l'équivalent du c(p) <- c(L) */
p = L;
/* -ed- OUCH! 'L' n'est pas initialise.
Mettre une valeur non initialisee dans une variable invoque
un comportement indefini. Lire une telle valeur aussi...
*/
while (p != NULL && p->val < u)
{
p = p->lien;
}
return p;
}
/*
-ed-
main()
En C99, le type retourne doit etre explicite.
*/
int main(void)
{
struct elem *L;
struct elem *P;
/* -ed-
L = (elem*)malloc(sizeof(struct elem));
Une facon compliquee d'ecrire
*/
L = malloc(sizeof*L);
/* -ed- attention, malloc() peut echouer. Tester si non NULL */
/* -ed-
free(L);
What the hell!
*/
L->val = 10;
/* -ed-
L->lien = (elem*)malloc(sizeof(struct elem));
'elem' n'existe pas. C'est 'struct elem'.
De toutes facon, on en a pas besoin.
*/
L->lien = malloc(sizeof*L->lien);
/* -ed-
(L->lien)->val = 11;
parentheses inutiles.
*/
L->lien->val = 11;
L->lien->lien = malloc(sizeof(struct elem));
L->lien->lien->val = 12;
L->lien->lien->lien = malloc(sizeof(struct elem));
L->lien->lien->lien->val = 13;
L->lien->lien->lien->lien = NULL;
/* -ed- c'est une methode barbare pour creer une liste chainee...
En principe, on utilise une fonction d'ajoute (en tete, en queue...)
de creation...
*/
/* -ed-
p = premier_element_sup_ou_egal(14);
'p' : variable non definie...
'P' est defini. attention, le C est sensible a la casse...
*/
/* -ed-
P = premier_element_sup_ou_egal(14);
fonction indefinie. La fonction que tu as definie est
'premier_elem_sup_ou_egal'. C'est pas pareil...
*/
P = premier_elem_sup_ou_egal(14);
if(P != NULL)
{
/* -ed-
printf("%d",p->val);
manque un '\n' pour terminer la ligne...
*/
printf("%d\n",P->val);
}
else
{
printf("L'element recherche n'existe pas\n");
}
/* -ed- la memoire allouee n'est jamais liberee.
SYSALLOC Err: Not-matched list:
SYSALLOC Bloc 003D2470 (8 bytes) malloc'ed at line 48 of 'main.c' not freed
SYSALLOC Bloc 003D2460 (8 bytes) malloc'ed at line 65 of 'main.c' not freed
SYSALLOC Bloc 003D24E0 (8 bytes) malloc'ed at line 74 of 'main.c' not freed
SYSALLOC Bloc 003D24F0 (8 bytes) malloc'ed at line 76 of 'main.c' not freed
*/
/* -ed- en C90, il est obligatoire de preciser ce qu'on retourne de main(). */
return 0;
} |
Partager