Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
5110 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C] Listes génériques ? [c'est OK !]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Listes génériques ? [c'est OK !]

n°171593
bb138
La vie est belle ...
Posté le 05-07-2002 à 09:07:22  profilanswer
 

Est-ce possible en C ???
En C++, il existe les template mais en C...


Message édité par bb138 le 05-07-2002 à 16:00:40
mood
Publicité
Posté le 05-07-2002 à 09:07:22  profilanswer
 

n°171598
darkoli
Le Petit Dinosaure Bleu
Posté le 05-07-2002 à 09:22:24  profilanswer
 

BB138 a écrit a écrit :

Est-ce possible en C ???
En C++, il existe les template mais en C...




 
Une liste d'objets en fait ?
 
Ben Tu peux faire ça :
 

Code :
  1. typedef struct toto
  2. {
  3. void*         donnees;
  4. struct toto*  suivant;
  5. } TOTOTOTO;


 
Pis tu fais les fonction de gestion de ta liste.
Pis pour les donnees tu peux palcer ce que tu veux : entie, chaîne, tableau, strcuture, ...


Message édité par darkoli le 05-07-2002 à 09:26:16

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°171613
bb138
La vie est belle ...
Posté le 05-07-2002 à 09:43:28  profilanswer
 

Oui un truc comme ça me paraît assez sympa.
Mais alors il faudra que je (caste) à tour de bras... non ?

n°171629
Jar Jar
Intaigriste
Posté le 05-07-2002 à 10:00:17  profilanswer
 

Les listes chaînées, ce n'est pas conseillé dans toutes les conditions. Si tu veux juste pouvoir accéder aux éléments séquentiellement dans un sens ou dans l'autre, c'est pas mal. Si tu veux pouvoir accéder à n'importe quel élément rapidement, c'est supra pourri.
 
Pour ma part, j'utilise beaucoup les tableaux dynamiques.
 

float *montableau;
int longueur_tab=16;
int remplissage_tab=0;
 
montableau=malloc(longueur_tab*sizeof(float));


Puis quand tu veux rajouter une valeur :

if(remplissage_tab>=longueur_tab)
    {
       longueur_tab*=2;
       montableau=realloc(montableau,longueur_tab*sizeof(float));
    }
montableau[longueur_tab++]=blah/blih;


 
Sans oublier le free(montableau) quand tu as fini.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°171638
darkoli
Le Petit Dinosaure Bleu
Posté le 05-07-2002 à 10:05:49  profilanswer
 

BB138 a écrit a écrit :

Oui un truc comme ça me paraît assez sympa.
Mais alors il faudra que je (caste) à tour de bras... non ?




 
Ben non.

Code :
  1. TOTO* ajout_element(TOTO* liste, void* donnees)
  2. {
  3. TOTO* element=NULL;
  4. element=(TOTO*)malloc(sizeof(TOTO));
  5. if (element == NULL)
  6.   {
  7.    fprintf(stdout, "Oups !!!\n" );
  8.    return NULL;
  9.   }
  10. element->donnees=donnees;
  11. element->suivant=NULL;
  12. if (liste == NULL) return element;
  13. while (liste->suivant != NULL) liste=liste->suivant;
  14. liste->suivant=element;
  15. return liste;
  16. }


 
Voilà, il faut que les donnees que tu ajoutes soient allouees dynamiquement. Pour l'effacement tu crées une fonction qui parcours la liste et efface tout les element et pour les donnees tu lui passes en parametre un pointeur sur une fonction qui s'en charge specifiquement : free en général si malloc.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°171654
bb138
La vie est belle ...
Posté le 05-07-2002 à 10:25:33  profilanswer
 

Mais quand je veux récupérer :
element->donnees
il faudra bien que je fasse un truc du style :

Code :
  1. recup = (mon_type) element->donnees;


ou alors éclaire ma lanterne...
 
>Jar Jar: il n'y a pas de problème, ce n'est que du séquentiel !

n°171658
LetoII
Le dormeur doit se réveiller
Posté le 05-07-2002 à 10:30:56  profilanswer
 

tu peux aussi le faire avec des macro:
 

Code :
  1. #define TAB(TYPE) \
  2. typedef TYPE* TYPE##TAB;


 
un petit exemple toout con.
## sert à concaténer, après tu peux compliquer un peu.
J'ai fais une implémentation de pile générique comme ça il me semble.
C'est l'équivalent du template en C


Message édité par LetoII le 05-07-2002 à 10:31:25

---------------
Le Tyran
n°171663
bb138
La vie est belle ...
Posté le 05-07-2002 à 10:39:29  profilanswer
 

Merci beaucoup !
Je sens que je vais bien m'amuser  :wahoo:

n°171666
LeGreg
Posté le 05-07-2002 à 10:44:05  profilanswer
 

Jar Jar a écrit a écrit :

Les listes chaînées, ce n'est pas conseillé dans toutes les conditions. Si tu veux juste pouvoir accéder aux éléments séquentiellement dans un sens ou dans l'autre, c'est pas mal.  




 
Pour un accés sequentiel, un tableau ou un vector
c'est mieux (données contigues).  
L'intérêt des listes c'est l'insertion en temps constant
et aussi le fait que tu l'ajout d'elements est sans limite et  
que tu n'invalides pas tes pointeurs en cas de redimensionnement.
(contrairement au vector<> de la STL)
 
LeGreg

n°171671
darkoli
Le Petit Dinosaure Bleu
Posté le 05-07-2002 à 10:48:57  profilanswer
 

BB138 a écrit a écrit :

Mais quand je veux récupérer :
element->donnees
il faudra bien que je fasse un truc du style :

Code :
  1. recup = (mon_type) element->donnees;


ou alors éclaire ma lanterne...
 
>Jar Jar: il n'y a pas de problème, ce n'est que du séquentiel !




 
Ben je ne sais pas (j'ai un doute).
Compile ton code et s'il te fait un erreur ou warning ben ajoute un cast !!!


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
mood
Publicité
Posté le 05-07-2002 à 10:48:57  profilanswer
 

n°171709
bb138
La vie est belle ...
Posté le 05-07-2002 à 11:08:17  profilanswer
 

Merci encore et on verra bien...
Je vous dirai tout ça quand j'aurai quelque chose de fonctionnel...

n°172019
bb138
La vie est belle ...
Posté le 05-07-2002 à 15:54:10  profilanswer
 

Voilà finalement ce que j'ai fait :

Code :
  1. typedef struct _element elem;
  2. typedef struct _list list;
  3. struct _element {
  4. void *data; /* pointer to what you want. */
  5. elem *next; /* pointer to the next element. */
  6. };
  7. struct _list {
  8. elem   *current;
  9. elem   *header;
  10. unsigned int nb_el;  /* number of elements (not indispensable) */
  11. };


 
Il ne faut pas oublier la bonne fonction d'initialisation qui va bien !
Peut-être que je mettrai d'autres éléments (un tail par exemple histoire de rajouter des éléments a la fin plutôt qu'au début et plus peut-être).
Rq: le nb_el n'est pas indispensable pour une petite liste plus légère...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C] Listes génériques ? [c'est OK !]

 

Sujets relatifs
[C] - Listes et pointeurs - comprenez-vous cet énoncé???apres les listes chainées , c'est auour des FICHIERS ....
[C] Comment ca marche un systeme de listes et pointeurs?[C] Systeme de listes et pointeurs
Ces p....... de listescomment forcer les listes deroulantes a resté sous un calque
[Visualc++] Quantité mémoire maximum pour des listes chaînées[C - listes chainées] Votre avis sur ce code...
afficher des images dans une listes en VC++[PERL] Les listes chainees
Plus de sujets relatifs à : [C] Listes génériques ? [c'est OK !]


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)