[C] Les listes chainées

Les listes chainées [C] - C++ - Programmation

Marsh Posté le 25-04-2003 à 15:20:38    

Bonjour,
 
j'ai fait une petite recherche, mais j'ai rien trouvé de bien concernant les listes
http://forum.hardware.fr/forum1.ph [...] subcat=386
 
Car, J'ai lu dans deux de mes livres, mais ce n'est pas tres bien expliqué, du moins j'ai rien compris.
 
Je sais que pour une liste, on utlise une strucutre dans laquelle se trouve un pointeur.
 
Je voudrais bien savoir comment creer une liste, comment la paroucrir, y inserer un element à la fin.
 
Je ne comprends pas comment faire :(
 
merci


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 15:20:38   

Reply

Marsh Posté le 25-04-2003 à 15:21:59    

c un pb des plus bateaux, doit avoir 258745 exemples sur le net
Si t'as du code qui merde ben poste le la qu'o voye ca de plus pres
 
edit : si t en C++ la STL contient des list deja toute faite


Message édité par chrisbk le 25-04-2003 à 15:22:18
Reply

Marsh Posté le 25-04-2003 à 15:27:33    

Je dois creer une fonction
 
creerAnnonce qui recoit un element de type DEPART en entrée et qui me retourne un pointeur de AnnonceDeListe.
 
Je lis dans un fichier des elements de la structure DEPART, par une boucle et des tests, j'ai defini si les elements que je lis m'interesse ou pas.
 
Si la ligne que je viens de lire dans le fichier m'interesser, je dois l'inserer ds une liste, et ainsi de suite, a chaque fois qu'une elements de la structure DEPART m'interesse, je dois le mettre dans la liste, enfin de celle ci


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 15:29:03    

Le Veilleur a écrit :

Je dois creer une fonction
 
creerAnnonce qui recoit un element de type DEPART en entrée et qui me retourne un pointeur de AnnonceDeListe.
 
Je lis dans un fichier des elements de la structure DEPART, par une boucle et des tests, j'ai defini si les elements que je lis m'interesse ou pas.
 
Si la ligne que je viens de lire dans le fichier m'interesser, je dois l'inserer ds une liste, et ainsi de suite, a chaque fois qu'une elements de la structure DEPART m'interesse, je dois le mettre dans la liste, enfin de celle ci


ca ressemble fortement à un exo de cours ca...Essaie de commencer tout seul au moins!

Reply

Marsh Posté le 25-04-2003 à 15:30:05    

Ma structure depart
 

Code :
  1. typedef struct
  2. {
  3. int  numeroTrain;
  4. char destination[24];
  5. int  typeLiaison;
  6. int  plagesActivite;
  7. int  joursSemActiv;
  8. int  numeroVoie;
  9. int  heureDepart;
  10. }DEPART;


Donc cela correspond a ce que je lis dans mon fichier, et qd ca m'interesse (les conditions sont deja faites ;) )
Je dois inserer ceci dans une liste de type
 

Code :
  1. /* Liste */
  2. typedef struct
  3. {
  4.     int  heureDepart;
  5.     char  destination[24];
  6.     int   typeLiaison;
  7.     int   numeroVoie;
  8.     int   retard;
  9.     /*non affichables*/
  10.     bool  estEnRetard;
  11.     bool  estSupprime;
  12. }annonceAfficheur;
  13. struct annonceDeListe
  14. {
  15.     int   numeroTrain;
  16.     annonceAfficheur affichage;
  17.     struct annonceDeListe *suivant;
  18. };
  19. struct LISTE
  20. {
  21.     struct annonceDeListe *premier;
  22. };


 
ET là je suis perdu :(
Faut inserer les elements en fin de liste.
 
Dans l'ennoncé, on me dit

Citation :

! Crée un élément d'annonce en mémoire à l'adresse pAnnonce !
 
pAnnonce  pointeur d'allocation de la mémoire de la taille de AnnonceDeListe  
Remplir les champs de l'annonce créée à partir des champs de depart.
! numeroTrain, heureDepart, destination, typeLiaison, numeroVoie !
Initialiser champs de gestion de l'annonce
! retard={00,00}, estEnRetard=faux, estSupprime=faux !
Initialiser le champ pointeur d'accès "suivant" à NULL


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 15:30:59    

skeye a écrit :


ca ressemble fortement à un exo de cours ca...Essaie de commencer tout seul au moins!


C'est un projet de cours, il est déjà bien commencé, si tu veux l'ennoncé
http://home.tiscali.be/pmatsos/lc2003c2.html
 
Je me trouve dans les parties uc32 (les afficheurs)


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 15:48:51    

Code :
  1. /********************************************************************/
  2. /* Definitions de la fonction creerAnnonce()               */
  3. /********************************************************************/
  4. void creerAnnonce(struct LISTE liste, DEPART depart)
  5. {
  6. struct annonceDeListe *p;
  7. //p=liste.premier;
  8.    p=malloc(sizeof(struct annonceDeListe));
  9. return ;
  10. }


Jusque là, c'est a dire nulle part, y a rien, maintenant je dois inserer l'element depart à la fin de la liste, ainsi que de mettre retard={00,00}, estEnRetard à false, et estSupprime à false egalement...
 
Mais je ne vois pas comment faire :(
 


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 16:12:00    

Le Veilleur a écrit :

Code :
  1. /********************************************************************/
  2. /* Definitions de la fonction creerAnnonce()               */
  3. /********************************************************************/
  4. void creerAnnonce(struct LISTE liste, DEPART depart)
  5. {
  6. struct annonceDeListe *p;
  7. //p=liste.premier;
  8.    p=malloc(sizeof(struct annonceDeListe));
  9. return ;
  10. }


Jusque là, c'est a dire nulle part, y a rien, maintenant je dois inserer l'element depart à la fin de la liste, ainsi que de mettre retard={00,00}, estEnRetard à false, et estSupprime à false egalement...
 
Mais je ne vois pas comment faire :(
 
 


2) Faire les initialisations que tu cites.

Code :
  1. p->retard=0;
  2. p->estEnRetard=false;
  3. p->estSuprime=false;
  4. p->suivant=depart;


2)Ajouter ton element dans la liste:

Code :
  1. struct annonceDeListe *temp=liste->premier;
  2. //Si la liste est vide, on insère au début
  3. if(temp==null)
  4. liste->premier=p;
  5. else
  6. {
  7. //sinon, on va à la fin
  8. while(temp->suivant != null)
  9.    temp = temp->suivant;
  10. //et on insère
  11. temp->suivant = p;
  12. }


 
Voilà, avec ça tu devrais comprendre le fonctionnement d'une liste normalement...Et remarquer que pour faire une liste tu n'as besoin que de ta structure annonceDeListe (tout ce que fait ta structure LISTE c'est contenir un pointeur vers l'autre...).


Message édité par skeye le 25-04-2003 à 16:13:06
Reply

Marsh Posté le 25-04-2003 à 16:34:45    

un grand merci, je vais regarde ca avec attention
 
pour le moment, je suis parti comme ca
 

Code :
  1. void creerAnnonce(struct LISTE *liste, DEPART depart)
  2. {
  3. struct annonceDeListe *p;
  4. struct annonceDeListe *pDer;
  5. p=NULL;
  6.     p=malloc(sizeof(struct annonceDeListe));
  7. p->numeroTrain=depart.numeroTrain;
  8. p->affichage.heureDepart=depart.heureDepart;
  9. p->affichage.destination=depart.destination;
  10. p->affichage.typeLiaison=depart.typeLiaison;
  11. p->affichage.......
  12. p->suivant=NULL;
  13. return ;
  14. }


C'est pas fini, je suis en cours d'ecriture..


Message édité par Le Veilleur le 25-04-2003 à 16:35:11

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 16:54:54    

Que pensez vous de ca ?
 

Code :
  1. /********************************************************************/
  2. /* Definitions de la fonction creerAnnonce()               */
  3. /********************************************************************/
  4. void creerAnnonce(struct LISTE *liste, DEPART depart)
  5. {
  6. struct annonceDeListe *p;
  7. struct annonceDeListe *pDer,*test;
  8. int i;
  9. p=NULL;
  10.     p=malloc(sizeof(struct annonceDeListe));
  11. /*élément a inserer dans la liste*/
  12. p->numeroTrain=depart.numeroTrain;
  13. p->affichage.heureDepart=depart.heureDepart;
  14. for(i=0;i<24;i++)
  15.    p->affichage.destination[i]=depart.destination[i];
  16. p->affichage.typeLiaison=depart.typeLiaison;
  17. p->affichage.numeroVoie=depart.numeroVoie;
  18. p->affichage.retard=0;
  19. p->affichage.estEnRetard=false;
  20.     p->affichage.estSupprime=false;
  21. p->suivant=NULL;
  22. pDer=liste->premier;
  23. if(pDer!=NULL)
  24.  {
  25.    while(pDer->suivant=NULL)
  26.        {
  27.      pDer=pDer->suivant;
  28.     }
  29.    pDer->suivant=p;
  30.  }
  31. /*si la liste est vide*/
  32.  else liste->premier=p;
  33. //Test d'affichage
  34. test=liste->premier;
  35.     while(test!=NULL)
  36.         {
  37.             printf(" valeur : %d \n",test->numeroTrain);
  38.             test=test->suivant;
  39.         }
  40. return ;
  41. }


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 16:54:54   

Reply

Marsh Posté le 25-04-2003 à 16:55:22    

Qd je veux inserer une valeur ds la liste, j'ai le programme qui plante sous windows :(
 
Ca plante dans cette partie, mais pq
 

Code :
  1. while(pDer->suivant!=NULL)
  2.        {
  3.      pDer=pDer->suivant;
  4.   printf("bouh\n" );
  5.     }
  6.    pDer->suivant=p;


Message édité par Le Veilleur le 25-04-2003 à 17:04:19

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 25-04-2003 à 17:31:23    

après avoir déclaré ta liste, t'as initialisé liste->premier à NULL ?
 
A+

Reply

Marsh Posté le 25-04-2003 à 17:33:32    

Le Veilleur a écrit :

Qd je veux inserer une valeur ds la liste, j'ai le programme qui plante sous windows :(
 
Ca plante dans cette partie, mais pq
 

Code :
  1. while(pDer->suivant!=NULL)
  2.        {
  3.      pDer=pDer->suivant;
  4.   printf("bouh\n" );
  5.     }
  6.    pDer->suivant=p;




tu testes pDer->suivant != NULL, avant?

Reply

Marsh Posté le 25-04-2003 à 17:36:28    

Babouchka a écrit :

après avoir déclaré ta liste, t'as initialisé liste->premier à NULL ?
 
A+


très bonne remarque...

Reply

Marsh Posté le 25-04-2003 à 17:41:50    

une autre horreur (mais on se fait tjrs avoir)
 
pô bieng !
 

Code :
  1. while(pDer->suivant=NULL)

 
 
 
bieng !
 

Code :
  1. while(pDer->suivant==NULL)


 
 
encore mieux

Code :
  1. while(!pDer->suivant)


 
 
 
A+


Message édité par Babouchka le 25-04-2003 à 17:44:53
Reply

Marsh Posté le 25-04-2003 à 19:01:46    

MErci, vous etes les meilleurs,
c'est le  

Code :
  1. liste->premier=NULL;


Que je n'avais pas mis, ca à l'air de marcher :love:  :jap:  :jap:


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 09:57:18    

J'ai encore un autre probleme.
 
Ma liste à l'air de fonctionner, Ma fonction creerAnnonce doit retourner pAnnonce qui est un pointer d'allocation de la mémoire de la taille de AnnonceDeLIste.
 
Ca correspond à quoi ca ?
le pointeur "p" ?


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 11:25:13    

je pense effectivement que c'est p qu'il faut retourner
par contre il faut tester p après le malloc dans la fonction creerAnnonce.
si le malloc échoue (plus de mémoire dispo ou un truc dans le genre) il vaudra null et dès que tu t'en servira => plouf seg fault.

Reply

Marsh Posté le 26-04-2003 à 11:37:32    

oki merci,
 
Donc l'entete de ma fonction ou je crée la liste et la rempli

Code :
  1. struct annonceDeListe creerAnnonce(struct LISTE *liste, DEPART depart)


 
Vu que je dois retourner p je mets

Code :
  1. return *p;


 
Ceci ce trouve donc dans ma fonction creerAnnonce, maintenant j'aimerais acceder à ma liste par la fonction creerListeAnnonces.
C'est la fonction ou j'appele la fonction creerAnnonce, dans creerAnnonce, ma liste se rempli bien, je sais la lire, nickel.
 
Donc pour l'appel je fais ca dans creerListeAnnonces

Code :
  1. pAnnonce=creerAnnonce(&liste,depart);


 
Et c'est là que je doute, vu que je dois recuperer p, est que mon pAnnonce est correcte ?Ca doit etre un pointeur, vu qu'il doit prendre la valeur de p?
Comment est ce que je dois le definir ?
 
Et comment pouvoir acceder à ma liste à partir de ma fonction creerListeAnnonce ?
 
En résumé, comment puis je faire pour recuperer p dans la fonction creerListeAnnonce et comment acceder à ma liste (la lire par exemple) dans cette même fonction.
 merci :jap:  
 
pour le test du malloc, je dois donc aussi refaire dans creerListeAnnonce merci


Message édité par Le Veilleur le 26-04-2003 à 11:38:37

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 11:47:35    

Le Veilleur a écrit :

oki merci,
 
Donc l'entete de ma fonction ou je crée la liste et la rempli

Code :
  1. struct annonceDeListe creerAnnonce(struct LISTE *liste, DEPART depart)


 
Vu que je dois retourner p je mets

Code :
  1. return *p;


 


 
tu dois retourner p et pas la variable pointée par p.
donc :

Code :
  1. struct annonceDeListe * creerAnnonce(struct LISTE *liste, DEPART depart)


 

Code :
  1. return p;


 
 

Le Veilleur a écrit :


Et comment pouvoir acceder à ma liste à partir de ma fonction creerListeAnnonce ?  


 
pourquoi dois tu accéder à ta liste depuis creerListeAnnonce ?


Message édité par SquiZZ le 26-04-2003 à 11:50:57
Reply

Marsh Posté le 26-04-2003 à 11:52:32    

merci :) Ca marche, maintenant je voudrais bien lire ma liste dans la fonction
 

Code :
  1. pAnnonce=creerAnnonce(&liste,depart);


donc pAnnonce contient en fait p
 
Maintenant, je voudrais relire la totalité de ma liste

Code :
  1. while(pAnnonce!=NULL)
  2.         {
  3.             printf("valeur2 numero train : %d \n",pAnnonce->numeroTrain);
  4.             pAnnonce=pAnnonce->suivant;
  5.         }


 
Le probleme c'est qu'il me donne que la derniere valeur de ma liste, faudrait que j'arrive à revenir au debut de celle ci
 
J'ai tenté avec  

Code :
  1. pAnnonce=liste->premier;


Juste au dessus de ma phase de lecture, mais il me sort

Citation :

Wedit output window build: Sat Apr 26 11:52:45 2003
Error "d:\mes documents\projetc2\uc32-33\uc32-33.c": 395  left operand of -> has incompatible type `struct LISTE'
Error "d:\mes documents\projetc2\uc32-33\uc32-33.c": 395  operands of = have illegal types `pointer to struct annonceDeListe' and `struct LISTE'
Compilation + link time:0.0 sec, Return code: 1


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 11:54:06    

Enfait je ne dois pas acceder a ma liste depuis creerlisteAnnonce, c'est juste un test pour voir comment ca marche, car je devrais y acceder a partir d'une autre fonction Afficher, que je n'ai pas encore fait. Ca me sert de debug et de comprehension.
 
merci


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 11:58:59    

Le Veilleur a écrit :


J'ai tenté avec  

Code :
  1. pAnnonce=liste->premier;




 
je pense qu'il faut faire :

Code :
  1. pAnnonce=liste.premier;


[/citation]

Reply

Marsh Posté le 26-04-2003 à 12:04:35    

Non, ca me fait la meme erreur :(
 
Un copain me dit que c'est peut etre parce que je renvoie l'adresse du dernier elements.
 
Ca serait qd je renvoie p? Que je renverrais la derniere valeur?


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 12:14:05    

et si tu fas ca pour parcourrir ta liste dans creerlisteannonce :
 

Code :
  1. struct annonceDeListe *pParcourt;
  2. pParcourt=liste.premier;
  3.    while(pParcourt->suivant=NULL)
  4.    {
  5.      //afficher ce que tu veux
  6.      //...
  7.      // passer à l'élément suivant
  8.      pParcourt=pParcourt->suivant;
  9.    }


 
ca donne quoi ?


Message édité par SquiZZ le 26-04-2003 à 12:14:49
Reply

Marsh Posté le 26-04-2003 à 12:17:52    

Code :
  1. pParcourt=liste.premier;


 
ne passe pas, il en veut :D
 
Qd je fais ce que tu m'as donné, le prog plante sous win, il a effectué une

Citation :

AppName: uc32-33.exe  AppVer: 0.0.0.0  ModName: uc32-33.exe
ModVer: 0.0.0.0  Offset: 000019cc


Citation :

uc32-33.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru.


 :(


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 12:21:32    

oups, je me suis planté dans le test du while :

Code :
  1. while(pParcourt->suivant=NULL)


 
devrait être :

Code :
  1. while(pParcourt)

Reply

Marsh Posté le 26-04-2003 à 12:29:05    

Mai c'est que je comprends avec ce que tu me montres, c'est ou est ce que j'utilise le pAnnonce qui est le retour de ma fonction creerAnnonce?
 
Ca ne marche pas non plus, il plante sous windows, J'ai l'impression que le probleme se situe sur le fait qu'il ne voudrait pas revenir au debut de liste. On dirait que je n'arrive pas a me rendre au debut de la liste...
 
Si tu veux le code source, je peux te l'envoyer.
 
merci


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 12:48:48    

Le Veilleur a écrit :

Mai c'est que je comprends avec ce que tu me montres, c'est ou est ce que j'utilise le pAnnonce qui est le retour de ma fonction creerAnnonce?


justement, on ne l(utilise pas.
tu peux le tester pour voir si l'insertion dans ta liste s'est bien passée.
 

Le Veilleur a écrit :


Ca ne marche pas non plus, il plante sous windows, J'ai l'impression que le probleme se situe sur le fait qu'il ne voudrait pas revenir au debut de liste. On dirait que je n'arrive pas a me rendre au debut de la liste...


avec une liste simplement chainée on ne peut pas 'revenir' au début de la liste a partir d'un élément de la liste.
la liste est définie par son début et c'est tout.
 

Le Veilleur a écrit :


Si tu veux le code source, je peux te l'envoyer.


est ce que tu as déja utilisé les listes chainées avant ?
sinon je te conseille de commencer par en faire une simple à part de ton projet.
par exemple une liste d'entiers et de coder les opérations de base :
- insertion en tête
- insertion en queue
- insertion dans une liste ordonnée
- suppression en tête
- suppression en queue
- suppression d'un élément quelconque
 
et après, uniquement quand tu aura compris comment ca fonctionne, commmencer à vraiment t'en servir dans ton projet.

Reply

Marsh Posté le 26-04-2003 à 12:58:26    

SquiZz a écrit :


justement, on ne l(utilise pas.
tu peux le tester pour voir si l'insertion dans ta liste s'est bien passée.
 
 
avec une liste simplement chainée on ne peut pas 'revenir' au début de la liste a partir d'un élément de la liste.
la liste est définie par son début et c'est tout.
 
 
est ce que tu as déja utilisé les listes chainées avant ?
sinon je te conseille de commencer par en faire une simple à part de ton projet.
par exemple une liste d'entiers et de coder les opérations de base :
- insertion en tête
- insertion en queue
- insertion dans une liste ordonnée
- suppression en tête
- suppression en queue
- suppression d'un élément quelconque

et après, uniquement quand tu aura compris comment ca fonctionne, commmencer à vraiment t'en servir dans ton projet.
 


J'ai utilisé les listes mais y a plus d'un an, mais je ne comprends tjs pas trop, c'est donc une tres bonne idée que tu as :jap:, je commence tout de suite avec une liste d'entier de 5 nombres


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 13:06:05    

Le Veilleur a écrit :


J'ai utilisé les listes mais y a plus d'un an, mais je ne comprends tjs pas trop, c'est donc une tres bonne idée que tu as :jap:, je commence tout de suite avec une liste d'entier de 5 nombres


 
:pfff: on s'en fout un peu qu'elle contienne 5 nombre ta liste, vu que l'avantage des listes chainées est d'être dynamiques et de pouvoir contenir un nombre variable d'éléments.
 
commence par la définition de ta liste, l'insertion en tête et l'impression du contenu de la liste (et aussi le vidage de la liste) et poste le code si ca marche pas ou si t'as un problème quelconque.

Reply

Marsh Posté le 26-04-2003 à 13:15:05    

Voilà, j'essaye d'inserer des elements en fin de listes

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct element{
  4. int valeur;
  5. struct element *suivant;
  6. struct element *precedent;
  7. };
  8. struct Liste{
  9. struct element *premier;
  10. };
  11. /*******************************************/
  12. void ajoutFin(struct Liste *,int);
  13. void lire(struct Liste *);
  14. /*******************************************/
  15. int main(void)
  16. {
  17. struct Liste   liste;
  18. struct element el;
  19. int val;
  20. liste.premier=NULL;
  21. printf("*****Les listes*****\n" );
  22. ajoutFin(&liste,5);
  23. ajoutFin(&liste,1);
  24.     ajoutFin(&liste,2);
  25.     ajoutFin(&liste,7);
  26. return 0;
  27. }
  28. /************************************************/
  29. void ajoutFin(struct Liste *liste,int val)
  30. {
  31.    struct element *p;
  32.    struct element *pDer;
  33.    /*élément a inserer dans la liste*/
  34.    p=NULL;
  35.    p=malloc(sizeof(struct element));
  36.    p->valeur=val;
  37.    p->suivant=NULL;
  38.    /*insertion*/
  39.    pDer=liste->premier;
  40.    if (pDer !=NULL)
  41.    {
  42.        while (pDer->suivant!= NULL)
  43.        {
  44.           pDer=pDer->suivant;
  45.        }
  46.        pDer->suivant=p;
  47.    }
  48.    else
  49.       /*si la liste est vide*/
  50.      liste->premier=p;
  51. return;
  52. }
  53. /**************************************************/
  54. void lire(struct Liste *liste)
  55. {
  56. struct element *test;
  57. test=liste.premier;
  58. while(test!=NULL)
  59.         {
  60.             printf(" valeur : %d \n",test->valeur);
  61.             test=test->suivant;
  62.         }
  63. return;
  64. }
  65. /***************************************************/


mais il rouspete ici

Code :
  1. test=liste.premier;


:(

Citation :

Error "d:\mes documents\projetc2\liste\liste.c": 81  left operand of . has incompatible type `pointer to struct Liste'
Warning "d:\mes documents\projetc2\liste\liste.c": 81  assignment of pointer to struct element to pointer to struct Liste


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 13:17:18    

J'ai trouvé ;)
Maintenant, faudrait savoir supprimer un element, mais là je ne vois aps comment  :(


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 26-04-2003 à 13:24:05    

pourquoi tu définis la structure 'Liste' qui contient un seul membre ?
ca te rajoute du code pour rien.
 
Perso je préfère définir ma liste directement
struct element *liste;
 
ca fait toujours une indirection de gagné.
 
tu as défini une liste doublement chainée, commence déjà par une liste simplement chainée.
 
struct element{
int valeur;
struct element *suivant;
};

Reply

Marsh Posté le 26-04-2003 à 13:29:15    

dans la structure liste, c'est sympa d'avoir un pointeur sur le dernier élément, ça évite d'avoir à se taper le parcours de toute la liste pour ajouter un élément en fin de liste
 
A+

Reply

Marsh Posté le 26-04-2003 à 13:29:43    



liste
    |
    v
  elmt1  ~~>  elmt2  ~~> NULL


 
pour la suppression en tête, il faut commencer par sauvegarger la position en mémoire de elmt2 (sauvegarder liste->suivant)
ensuite libérer la mémoire utilisée par elmt1 (free(liste)
puis dire que le début de la liste est maintenant elmt2 (liste = sauvegarde pos elmt2)

Reply

Marsh Posté le 26-04-2003 à 13:53:13    

Babouchka a écrit :

dans la structure liste, c'est sympa d'avoir un pointeur sur le dernier élément, ça évite d'avoir à se taper le parcours de toute la liste pour ajouter un élément en fin de liste
 
A+


 
ouep, mais la c'est juste un petit exemple didactique pour comprendre comment fonctionne une liste chainée, je trouve plus interressant (ie formateur) de se refaire un parcours de liste pour une insertion en queue que de maintenir un pointeur sur le dernier élément.  
et comme le veilleur a un peu de mal avec les  '.' ou les '->' autant éviter d'en rajouter.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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