/* Programme de recherche dans une liste chaînée de blocs de tailles diverses de toutes les entrées d'un nombre d'ID spécifié et retourne la moyenne de toutes ces entrées. Chaque bloc peut contenir un certain nombre d'entrées de données, stockées sous la forme de deux tableaux séparés, le premier pour le nombre d'ID et le second pour les valeurs. */ #include #ifdef __TURBOC__ #include #else #include #endif void main(void); void exit(int); extern unsigned int FindIDAverage2(unsigned int,struct BlockHeader *); /* Structure de départ de chaque bloc de tailles diverses */ struct BlockHeader { struct BlockHeader *NextBlock; /* pointeur sur le prochain bloc, ou NULL si c'est le dernier bloc dans la liste chaînée */ unsigned int BlockCount; /* nombre d'entrées DataElement dans le bloc */ }; void main(void) { int i,j; unsigned int IDToFind; struct BlockHeader *BaseArrayBlockPointer,*WorkingBlockPointer; int *WorkingDataPointer; struct BlockHeader **LastBlockPointer; printf("numéro d'ID dont vous voulez trouver la moyenne: "); scanf("%d",&IDToFind); /* Construit un tableau sur 5 blocs, pour tester*/ /* Fixe la liste chaînée à BaseArrayBlockPointer */ LastBlockPointer = &BaseArrayBlockPointer; /* Crée 5 blocs de tailles diverses*/ for (i = 1; i < 6; i++) { /* Essaie de récupérer de la mémoire pour le prochain bloc */ if ((WorkingBlockPointer = (struct BlockHeader *) malloc(sizeof(struct BlockHeader) + sizeof(int) * 2 * i * 10)) == NULL) { exit(1); } /* Détermine le nombre d'éléments de données dans le bloc */ WorkingBlockPointer->BlockCount = i * 10; /* Relie le nouveau bloc à la chaîne */ *LastBlockPointer = WorkingBlockPointer; /* Pointe sur le premier champ de données */ WorkingDataPointer = (int *) ((char *)WorkingBlockPointer + sizeof(struct BlockHeader)); /* Remplit le champ avec le nombre d'ID et les valeurs */ for (j = 0; j < (i * 10); j++, WorkingDataPointer++) { *WorkingDataPointer = j; *(WorkingDataPointer + i * 10) = i * 1000 + j; } /* Mémorise le lien entre ce bloc et le suivant */ LastBlockPointer = &WorkingBlockPointer->NextBlock; } /* Positionne le pointeur sur le prochain bloc du précédent à NULL pour indiquer qu'il n'y a plus de bloc */ WorkingBlockPointer->NextBlock = NULL; printf("Moyenne de tous les éléments avec ID %d: %u\n", IDToFind, FindIDAverage2(IDToFind, BaseArrayBlockPointer)); exit(0); }