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

  FORUM HardWare.fr
  Programmation
  C++

  [C] Les listes chainées

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Les listes chainées

n°371974
Le Veilleu​r
Posté le 25-04-2003 à 15:20:38  profilanswer
 

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
mood
Publicité
Posté le 25-04-2003 à 15:20:38  profilanswer
 

n°371975
chrisbk
-
Posté le 25-04-2003 à 15:21:59  profilanswer
 

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
n°371990
Le Veilleu​r
Posté le 25-04-2003 à 15:27:33  profilanswer
 

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
n°371995
skeye
Posté le 25-04-2003 à 15:29:03  profilanswer
 

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!

n°371999
Le Veilleu​r
Posté le 25-04-2003 à 15:30:05  profilanswer
 

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
n°372001
Le Veilleu​r
Posté le 25-04-2003 à 15:30:59  profilanswer
 

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
n°372041
Le Veilleu​r
Posté le 25-04-2003 à 15:48:51  profilanswer
 

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
n°372066
skeye
Posté le 25-04-2003 à 16:12:00  profilanswer
 

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
n°372094
Le Veilleu​r
Posté le 25-04-2003 à 16:34:45  profilanswer
 

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
n°372111
Le Veilleu​r
Posté le 25-04-2003 à 16:54:54  profilanswer
 

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
mood
Publicité
Posté le 25-04-2003 à 16:54:54  profilanswer
 

n°372114
Le Veilleu​r
Posté le 25-04-2003 à 16:55:22  profilanswer
 

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
n°372173
Babouchka
You're no fun anymore
Posté le 25-04-2003 à 17:31:23  profilanswer
 

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

n°372176
skeye
Posté le 25-04-2003 à 17:33:32  profilanswer
 

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?

n°372182
skeye
Posté le 25-04-2003 à 17:36:28  profilanswer
 

Babouchka a écrit :

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


très bonne remarque...

n°372187
Babouchka
You're no fun anymore
Posté le 25-04-2003 à 17:41:50  profilanswer
 

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
n°372242
Le Veilleu​r
Posté le 25-04-2003 à 19:01:46  profilanswer
 

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
n°372482
Le Veilleu​r
Posté le 26-04-2003 à 09:57:18  profilanswer
 

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
n°372499
SquiZZ
Posté le 26-04-2003 à 11:25:13  profilanswer
 

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.

n°372505
Le Veilleu​r
Posté le 26-04-2003 à 11:37:32  profilanswer
 

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
n°372507
SquiZZ
Posté le 26-04-2003 à 11:47:35  profilanswer
 

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
n°372508
Le Veilleu​r
Posté le 26-04-2003 à 11:52:32  profilanswer
 

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
n°372510
Le Veilleu​r
Posté le 26-04-2003 à 11:54:06  profilanswer
 

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
n°372512
SquiZZ
Posté le 26-04-2003 à 11:58:59  profilanswer
 

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]

n°372515
Le Veilleu​r
Posté le 26-04-2003 à 12:04:35  profilanswer
 

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
n°372516
SquiZZ
Posté le 26-04-2003 à 12:14:05  profilanswer
 

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
n°372517
Le Veilleu​r
Posté le 26-04-2003 à 12:17:52  profilanswer
 

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
n°372519
SquiZZ
Posté le 26-04-2003 à 12:21:32  profilanswer
 

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

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


 
devrait être :

Code :
  1. while(pParcourt)

n°372522
Le Veilleu​r
Posté le 26-04-2003 à 12:29:05  profilanswer
 

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
n°372525
SquiZZ
Posté le 26-04-2003 à 12:48:48  profilanswer
 

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.

n°372526
Le Veilleu​r
Posté le 26-04-2003 à 12:58:26  profilanswer
 

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
n°372528
SquiZZ
Posté le 26-04-2003 à 13:06:05  profilanswer
 

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.

n°372530
Le Veilleu​r
Posté le 26-04-2003 à 13:15:05  profilanswer
 

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
n°372533
Le Veilleu​r
Posté le 26-04-2003 à 13:17:18  profilanswer
 

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
n°372536
SquiZZ
Posté le 26-04-2003 à 13:24:05  profilanswer
 

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;
};

n°372539
Babouchka
You're no fun anymore
Posté le 26-04-2003 à 13:29:15  profilanswer
 

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+

n°372540
SquiZZ
Posté le 26-04-2003 à 13:29:43  profilanswer
 



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)

n°372555
SquiZZ
Posté le 26-04-2003 à 13:53:13  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


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

  [C] Les listes chainées

 

Sujets relatifs
ListBox et listes de + de 32767 entrées[C] seg fault : please help [file avec des listes]
petite question d'un débutant à propo des listes[Php/mySql+JavaScript] Listes à sélection dépendantes entre elles
Fusion de 2 listes chainees[OPEN GL] question sur les listes d'objets...
[C] quelqu'un aurais un cours sur les listes ?[ACCESS] Listes déroulantes
[C] Listes chainées et allocation mémoire 
Plus de sujets relatifs à : [C] Les listes chainées


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