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

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

Marsh Posté le 05-07-2002 à 09:07:22    

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
Reply

Marsh Posté le 05-07-2002 à 09:07:22   

Reply

Marsh Posté le 05-07-2002 à 09:22:24    

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
Reply

Marsh Posté le 05-07-2002 à 09:43:28    

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

Reply

Marsh Posté le 05-07-2002 à 10:00:17    

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
Reply

Marsh Posté le 05-07-2002 à 10:05:49    

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
Reply

Marsh Posté le 05-07-2002 à 10:25:33    

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 !

Reply

Marsh Posté le 05-07-2002 à 10:30:56    

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
Reply

Marsh Posté le 05-07-2002 à 10:39:29    

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

Reply

Marsh Posté le 05-07-2002 à 10:44:05    

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

Reply

Marsh Posté le 05-07-2002 à 10:48:57    

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
Reply

Marsh Posté le 05-07-2002 à 10:48:57   

Reply

Marsh Posté le 05-07-2002 à 11:08:17    

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

Reply

Marsh Posté le 05-07-2002 à 15:54:10    

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed