Comment faire pour ...

 

Créer un tableau dont la taille est inconnue au départ (mémoire dynamique)

Des listes chaînées (mémoire dynamique)

 

Créer un tableau dont la taille est inconnue au départ (mémoire dynamique) :

Plutôt que d'affecter une valeur énorme pour être sûr que les données vont rentrer vous pouvez vous inspirer de l'exemple suivant :

#include <stdio.h>
#include <stdlib.h>

int *tab;         // Il faut considérer le tableau comme un pointeur pour utiliser cette méthode !
                     // Dans cet exemple le tableau est fait d'entiers
int main()
{
    int taille;
    taille=9999;   // J'ai mis taille = 9999 c'est cela que l'on suppose inconnu au début j'aurais aussi pu demander de saisir la taille
    tab=(int (*)) malloc(taille*sizeof (int));   // Il y a int car le tableau est fait d'entiers dans cet exemple 
    tab[5432]=43;                                     // Ensuite on peut utiliser le tableau normalement !
    printf("%d",tab[5432]);
    getch();
}

 

Des listes chaînées (mémoire dynamique) :

#include <stdio.h>
#include <stdlib.h>

typedef struct sliste
{
    int a;                     // Elément de la liste ici un entier
    struct sliste *succ; // Pointeur sur le successeur
}liste;


int main()
{
    liste *Nouveau;
    liste *Courant;    // Là où on en est dans la liste (= dernier de la liste lors de la création)
    liste *Tete;         // Pointeur sur le début du tableau
    int i;

    // insertion de 10000 éléments (0 à 9999) dans un tableau avec pointeurs

    for (i=0;i<=9999;i++)
    {
        Nouveau=(liste *)malloc(sizeof(liste));  // Création de l'élément
        if (i==0)                                              // Insertion du premier élément
        {
            Tete=Nouveau;                              // Affectation de la tête
            Nouveau->a=i;                              // Affectation de l'élément
            Courant=Nouveau;
        }
        else
        {
            Courant->succ=Nouveau;              // Chaînage
            Nouveau->a=i;                              // Affectation de l'élément
            Courant=Nouveau;
        }
    }

    // relecture

    Courant=Tete;
    while (Courant->succ!=NULL)              // Le dernier élément de la liste n'a pas de successeur
    {
        printf ("%d\n",Courant->a);
        Courant=Courant->succ;                   // On parcourt grâce au chaînage
    }
    // Affichage du dernier
    printf ("%d",Courant->a);

    getch();
}