IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

enregistrement ou liste chainée ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut enregistrement ou liste chainée ?
    Bonjour,

    je voulais savoir si j'utilise une liste chainée ou enregistrement ?
    Pour moi je veux bien utiliser les enregistrements mais ils m'ont dis d'utiliser les listes chainées donc si c'est possible je peux votre avis sur ça.

    Merci.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si tu te poses la question, c'est qu'il n'y a pas de réponse universelle.
    Il nous faut donc un contexte, pourrais-tu nous exposer le tien?

    Au passage, qu'appelles-tu un enregistrement?

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    Citation Envoyé par leternel Voir le message
    Si tu te poses la question, c'est qu'il n'y a pas de réponse universelle.
    Il nous faut donc un contexte, pourrais-tu nous exposer le tien?

    Au passage, qu'appelles-tu un enregistrement?
    Un enregistrelent est une structure de données. la declaration comme la declaration d'une liste chainée mais pas de pointeur.
    en fait, moi je veux stocker dans un tableau des position et chaque position a ses proriétés (par exemple).
    donc le TABLEAU sera composé de deux colonnes (index, position) et dans la colonne position j'ai plusieurs valeurs: [pos1,num1],[pos2,num2],...
    donc pour une ligne de mon tableau j'ai index1, [pos1,num1],[pos2,num2],... donx ici je voulais savoir est pour [pos1,num1],[pos2,num2] est j'utilise une liste chainée ou une structure sans pointer sur l'élément suivant?
    je voulais avoir des avis des experts.
    Merci

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Ben ça dépend de ce que tu en fais.
    • Si tu fais de la lecture pure avec besoin de recherche rapide (recherche dichotomique etc.) tu utilises un tableau.
    • Si tu fais un truc qui est modifié de nombreuses fois durant l'exécution du code, une liste chaînée sera plus appropriée.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Le tableau et la liste chainée sont deux techniques pour répondre à un besoin commun: disposer d'une séquence de choses.
    Il y a plusieurs différences entre ces deux techniques, et l'une d'elle est fondamentale:
    un tableau est de taille constante, une liste chainée est de taille variable.

    Il y a deux variantes principales de chainage: le chainage externe et le chainage dit intrusif.
    supposons que je veuille une séquence de points.

    avec un chainage intrusif (le plus classiquement utilisé en C), on aurait quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct point {
        int x, y;
        struct point* suivant;
    };
    Avec un chainage externe, par contre, on aurait deux structure: une chaine, et un point
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct point {
        int x, y;
    };
     
    struct chainon_point {
        struct point *p;
        struct chainon_point *suivant;
    };
    L'intéret de seconde solution est de pouvoir placer le même point dans plusieurs chaines.

    Dans ton cas, si tu sais combien tu auras d'éléments à lister, préfère le tableau. Si tu connais un maximum tu peux aussi tenter le tableau.
    Si ta séquence n'est pas vraiment bornée, tu n'as d'autre choix que la liste chainée

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    Citation Envoyé par leternel Voir le message
    Le tableau et la liste chainée sont deux techniques pour répondre à un besoin commun: disposer d'une séquence de choses.
    Il y a plusieurs différences entre ces deux techniques, et l'une d'elle est fondamentale:
    un tableau est de taille constante, une liste chainée est de taille variable.

    Il y a deux variantes principales de chainage: le chainage externe et le chainage dit intrusif.
    supposons que je veuille une séquence de points.

    avec un chainage intrusif (le plus classiquement utilisé en C), on aurait quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct point {
        int x, y;
        struct point* suivant;
    };
    Avec un chainage externe, par contre, on aurait deux structure: une chaine, et un point
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct point {
        int x, y;
    };
     
    struct chainon_point {
        struct point *p;
        struct chainon_point *suivant;
    };
    L'intéret de seconde solution est de pouvoir placer le même point dans plusieurs chaines.

    Dans ton cas, si tu sais combien tu auras d'éléments à lister, préfère le tableau. Si tu connais un maximum tu peux aussi tenter le tableau.
    Si ta séquence n'est pas vraiment bornée, tu n'as d'autre choix que la liste chainée
    merci pour ta reponse.
    pour moi je ne connais pas la longueur de mon tableau mais je connais sa plus longue taille mais je pense les listes chainées permettent de gangner en mémoire parceque si j'utilise les enregistrements et je fixe une taille MAX peut etre que je perds en mémoire puisque je ne vais pas remplir toutes les cases à MAX.
    qu'est ce que vous pensez?

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    merci pour ta reponse.
    pour moi je ne connais pas la longueur de mon tableau mais je connais sa plus longue taille mais je pense les listes chainées permettent de gangner en mémoire parceque si j'utilise les enregistrements et je fixe une taille MAX peut etre que je perds en mémoire puisque je ne vais pas remplir toutes les cases à MAX.
    qu'est ce que vous pensez?
    Bonjour

    Encore une fois ça dépend du contexte. Si MAX est de l'ordre de 100, ou 1000, ou 10000, ou même 100000 ça n'a pas d'importance (encore que ça dépende aussi de la taille de ta structure). Si MAX est de l'ordre du million ou milliard, ça peut jouer. Mais même si MAX était à 1 milliard mais que tu stockes effectivement 999 999 999 éléments ben alors ça ne jouerait plus (parce qu'avec un tableau ou une liste chainée ça reste 999 999 999 et que perdre "1" avec un tableau ne compte pas).

    Ceci dit, leternel a écrit qu'un tableau était de taille constante mais il a oublié de préciser qu'il pouvait être aussi alloué dynamiquement (malloc) puis agrandi par la suite (realloc). Tu peux alors très bien définir un MAX à 1000 et allouer donc 1000 éléments d'un coup, puis dès que tu arrives au 1001° élément tu réalloues 1000 de plus. Et etc.
    Ca peut se faire très facilement dans un algo de ce type

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #define MAX         (1000)
    typedef struct {
    	struct s_ton_element *tab;
    	struct s_ton_element *tmp;
    	size_t nb;
    	size_t max;
    } t_alloc;
     
    t_alloc data;
    data.tab=NULL;
    data.tmp=NULL;
    data.nb=0;
    data.max=0;
     
    while (je lis un élément à stocker)
    {
    	// Si on a atteint le max éléments stockés (ce qui arrivera aussi la première fois vu que nb et max sont égaux à 0)
    	if (data.nb == data.max)
    	{
    		// On réalloue MAX de plus - Dans le cas où le pointeur à réallouer est NULL, realloc se comporte comme malloc
    		data.max+=MAX;
    		data.tmp=realloc(data.tab, data.max * sizeof(struct s_ton_element));
     
    		// Vérification allocation échouée
    		if (data.tmp == NULL)
    		{
    			// Dans ce cas, on ne peut plus rien faire - On nettoie donc ce qui avait été éventuellement alloué précédemment et on quitte
    			free(data.tab);
    			return valeur_specifique_indiquant_echec;
    		}
     
    		// L'allocation/réallocation a réussie, on la recopie dans la bonne zone
    		data.tab=data.tmp;
    	}
     
    	// Quoi qu'il arrive, ici on a forcément la place de stocker notre élément
    	data.tab[data.nb]=element_a_stocker;
     
    	// On a stocké un élément de plus
    	data.nb++;  // on peut regrouper les deux lignes en data.tab[data.nb++]=element_a_stocker;
    }

    Tu peux le dérouler dans tous les sens, tu auras toujours la place pour stocker tout ce que tu lis. Et sur un ordi avec beaucoup de mémoire tu peux tailler MAX en très large, mais si tu es restreint tu le tailles à 1.

    Bien entendu ça a un inconvénient (toute solution possède toujours des avantages et des inconvénients) c'est que contrairement à la liste (où l'allocation est facile car tu alloues à chaque fois un élément qui sera alloué n'importe où il y a de la place pour un élément), le malloc/realloc doit toujours allouer la zone demandée en un seul bloc contigû (pour qu'on puisse l'utiliser comme un tableau) et que s'il n'a plus de place là où il se trouve pour répondre à la demande, il devra déplacer tout ce qui a déjà été alloué dans une zone plus large. Ce qui peut alors prendre du temps.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/04/2006, 09h33
  2. enregistrer une liste chainée dans un fichier?
    Par ALF-Teams dans le forum C
    Réponses: 7
    Dernier message: 08/03/2006, 18h42
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo