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 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
/* -ed-
- reindentation
- reduction de la portee des variables...
*/
#include<stdio.h>
#include<stdlib.h>
/* -ed- pour clean()... */
#include<string.h>
/* -ed-
typedef struct maillon *ptr;
ne pas masquer les pointeurs, c'est pas clair...
*/
struct maillon
{
int val;
struct maillon *lien;
};
/* -ed- pour des saisies stables et propres. */
static void clean (char *s, FILE *fp)
{
/* search ... */
char *p = strchr (s, '\n');
if (p != NULL)
{
/* ... and kill */
*p = 0;
}
else
{
/* purge */
int c;
while ((c = fgetc(fp)) != '\n' && c != EOF)
{
}
}
}
int main(void)
{
char c;
struct maillon *preced;
/* tete de la liste */
struct maillon *l = NULL;
/* -ed-
*/
int i = 1; /* initialisation du compteur d'elements liste */
printf("voulez vous introduire une valeur o/n \n");
/* -ed- instable...
scanf("%c", &c);
remplace par du code eprouve...
*/
{
char line[4];
fgets(line, sizeof line, stdin);
clean(line, stdin);
c = line[0];
}
while (c == 'o')
{
/* -ed-
p = (ptr)malloc(sizeof(struct maillon));
cast inutile
ecriture inutilement complexe...
malloc() peut echouer manque le test
*/
struct maillon *p = malloc(sizeof * p);
if (p != NULL)
{
int x;
printf("la valeur du maillon %d\n", i);
/* -ed- instable...
scanf("%d", &x);
remplace par du code eprouve...
*/
{
char line[8];
fgets(line, sizeof line, stdin);
clean(line, stdin);
x = strtol(line, NULL, 10);
}
/* -ed- codage abscon. Le C dispose d'une syntaxe plus humaine...
(*p).val = x;
*/
p->val = x;
p->lien = NULL;
/* -ed- cette methode ne m'inspire pas...
En principe, on teste le pointeur de tete
(ici, 'l', si j'ai bien compris)
Nota. Un nom clair comme tete, ou p_tete n'aurait pas nuit...
*/
if (i == 1)
{
l = p;
preced = p;
}
else
{
preced->lien = p;
preced = p;
}
/* -ed- ce 'preced' est en fait le pointeur sur le dernier element de la liste
Habituellement, on gere une liste simple avec 2 pointeurs
- p_head : debut
- p_tail : fin (ou dernier)
le tout regroupe dans une structure liste :
struct list
{
struct node *p_head;
struct node *p_tail;
};
C'est tout de suite beaucoup plus clair...
*/
printf("voulez vous introduire une valeur o/n \n");
{
char line[4];
fgets(line, sizeof line, stdin);
clean(line, stdin);
c = line[0];
}
i++;
}
else
{
printf ("memory error\n");
break;
}
}
/* -ed-
printf("hfhfg");
debug, je suppose. Manque \n...
*/
printf("OK at line %d\n", __LINE__);
i = 1;
{
struct maillon *p = l;
printf("le contenu de la liste\n");
while (p != NULL)
{
printf("le maillon %d son adresse %x sa valeur=%d son lien=%x\n", i, p, p->val, p->lien);
p = p->lien;
i++;
}
}
/* -ed- penser a liberer la memoire. */
} |
Partager