Les listes chainées [C] - C++ - Programmation
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
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
Marsh Posté le 25-04-2003 à 15:29:03
Le Veilleur a écrit : Je dois creer une fonction |
ca ressemble fortement à un exo de cours ca...Essaie de commencer tout seul au moins!
Marsh Posté le 25-04-2003 à 15:30:05
Ma structure depart
Code :
|
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 :
|
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 ! |
Marsh Posté le 25-04-2003 à 15:30:59
skeye a écrit : |
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)
Marsh Posté le 25-04-2003 à 15:48:51
Code :
|
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
Marsh Posté le 25-04-2003 à 16:12:00
Le Veilleur a écrit :
|
2) Faire les initialisations que tu cites.
Code :
|
2)Ajouter ton element dans la liste:
Code :
|
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...).
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 :
|
C'est pas fini, je suis en cours d'ecriture..
Marsh Posté le 25-04-2003 à 16:54:54
Que pensez vous de ca ?
Code :
|
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 :
|
Marsh Posté le 25-04-2003 à 17:31:23
après avoir déclaré ta liste, t'as initialisé liste->premier à NULL ?
A+
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
|
tu testes pDer->suivant != NULL, avant?
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 ? |
très bonne remarque...
Marsh Posté le 25-04-2003 à 17:41:50
une autre horreur (mais on se fait tjrs avoir)
pô bieng !
Code :
|
bieng !
Code :
|
encore mieux
Code :
|
A+
Marsh Posté le 25-04-2003 à 19:01:46
MErci, vous etes les meilleurs,
c'est le
Code :
|
Que je n'avais pas mis, ca à l'air de marcher
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" ?
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.
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 :
|
Vu que je dois retourner p je mets
Code :
|
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 :
|
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
pour le test du malloc, je dois donc aussi refaire dans creerListeAnnonce merci
Marsh Posté le 26-04-2003 à 11:47:35
Le Veilleur a écrit : oki merci,
|
tu dois retourner p et pas la variable pointée par p.
donc :
Code :
|
Code :
|
Le Veilleur a écrit : |
pourquoi dois tu accéder à ta liste depuis creerListeAnnonce ?
Marsh Posté le 26-04-2003 à 11:52:32
merci Ca marche, maintenant je voudrais bien lire ma liste dans la fonction
Code :
|
donc pAnnonce contient en fait p
Maintenant, je voudrais relire la totalité de ma liste
Code :
|
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 :
|
Juste au dessus de ma phase de lecture, mais il me sort
Citation : Wedit output window build: Sat Apr 26 11:52:45 2003 |
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
Marsh Posté le 26-04-2003 à 11:58:59
Le Veilleur a écrit :
|
je pense qu'il faut faire :
Code :
|
[/citation]
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?
Marsh Posté le 26-04-2003 à 12:14:05
et si tu fas ca pour parcourrir ta liste dans creerlisteannonce :
Code :
|
ca donne quoi ?
Marsh Posté le 26-04-2003 à 12:17:52
Code :
|
ne passe pas, il en veut
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 |
Citation : uc32-33.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru. |
Marsh Posté le 26-04-2003 à 12:21:32
oups, je me suis planté dans le test du while :
Code :
|
devrait être :
Code :
|
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
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 : |
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 : |
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.
Marsh Posté le 26-04-2003 à 12:58:26
SquiZz 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 , je commence tout de suite avec une liste d'entier de 5 nombres
Marsh Posté le 26-04-2003 à 13:06:05
Le Veilleur a écrit : |
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.
Marsh Posté le 26-04-2003 à 13:15:05
Voilà, j'essaye d'inserer des elements en fin de listes
Code :
|
mais il rouspete ici
Code :
|
Citation : Error "d:\mes documents\projetc2\liste\liste.c": 81 left operand of . has incompatible type `pointer to struct Liste' |
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
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;
};
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+
Marsh Posté le 26-04-2003 à 13:29:43
|
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)
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 |
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.
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