2011-03-11 3 views
0

Je me demandais si vous pouviez créer une liste d'entiers.C: Créer une collection de structures/créer une liste d'entiers

Comme vous connaissez la plupart des autres langues, vous pouvez avoir une liste infinie de nombres. Mais je ne sais pas si vous pouvez le faire avec C.

en C vous pouvez faire

entiers int [20]; Mais je ne veux pas en déclarer une taille, mais je veux une liste qui continue indéfiniment.

et en plus, j'ai une structure

typedef struct someStruct 
{ 
    char data; 
    chat data2; 
}STRUCT_REC,*SR; 

afin de faire une liste des structures que nous venons de faire liste STRUCT_REC; droite?

Répondre

2

Vous avez deux options:

  1. Utilisez un tableau alloué dynamiquement. Vous allouez la quantité d'espace dont vous avez besoin en utilisant malloc(). Vous pouvez ensuite allouer plus d'espace en utilisant realloc(). Les inconvénients de cette approche sont que vous allouerez généralement plus d'espace que nécessaire, et lorsque vous réallouez de l'espace, le programme devra peut-être déplacer tous vos éléments vers un nouvel emplacement en mémoire, ce qui peut être coûteux.

  2. Utilisez un linked list. Les listes liées vous permettent d'allouer dynamiquement de l'espace pour un seul élément à tout moment et de l'ajouter à la fin de la liste. Pour ce faire, une liste chaînée est composée de nœuds, chacun contenant une donnée et un pointeur vers le nœud suivant. L'inconvénient de cette approche est que vous perdez l'accès aléatoire rapide (c'est-à-dire si vous voulez l'article # 100, vous devez d'abord regarder les articles 1-99), et vous avez des frais supplémentaires à partir des pointeurs supplémentaires.

0

Vous devez regarder malloc et les amis (calloc, realloc, free).

La façon de l'utiliser est la même quel que soit le type que vous utilisez.

Voici un exemple très simple avec double:

#include <stdlib.h> 
int main(void) { 
    double *arr; 
    arr = malloc(1 * sizeof *arr); /* size for 1 element */ 
    if (arr) { 
     double *tmp; 
     tmp = realloc(arr, 100 * sizeof *tmp); /* attempt to resize for 100 elements */ 
     if (tmp) { 
      arr = tmp; /* resize 'worked' */ 
     } else { 
      /* not enough memory */ 
      free(arr); 
      exit(EXIT_FAILURE); 
     } 
     /* use arr */ 
     free(arr); 
    } 
    return 0; 
} 
+0

Je suis vraiment curieux de savoir pourquoi cela a été downvoted. –

+0

Il a été downvoted avant que le code d'exemple a été ajouté dans ... donc la raison n'était pas pour faire le devoir d'OP LOL – pmg

+0

Nice. Considérez que downvote évité. –

0

Avez-vous besoin d'une liste ou avez-vous besoin d'écrire le code pour une liste? Si le premier, je vous suggère de ne pas réinventer la roue mais d'utiliser une bibliothèque testée existante telle que glib.

Questions connexes