Liste doublement chainée - C - Programmation
Marsh Posté le 26-02-2008 à 18:54:43
je vois pas trop ce que tu veux faire avec une "liste chaînée circulaire"...
en tout cas, pour faire une liste chaînée "simple", il faut que ta struct comporte un pointeur sur le type de ta struct, qui servira à stocker un lien vers le contact "fils".
et pour une liste chaînée double, bah c'est pareil, sauf qu'il faut deux pointeurs, un pour le fils et un pour le père.
ensuite il faut simplement une fonction "inserer(*contact fils, *contact pere);"
=> et elle s'occupe de rechercher le père, lui colle comme fils le nouveau contact, qui prend elle-même l'ancien fils du père pour fils, et pour père, le père.
pour ce qui est de "trier", si ta liste est réellement circulaire, je ne vois pas trop comment tu veux trier ça, en tout cas, un tri se fera à grands coups de permutations utilisant ta fonction inserer() et enlever() (qui s'occupe de lier le fils et le père d'un contact ensembler et allourer 0 comme pointeurs père et fils à ton pointeur enlevé)
Marsh Posté le 26-02-2008 à 19:09:11
Oui tout compte fait, ce n'est pas utile que la liste chainée soit circulaire, le but de la liste chainée étant :
Partir d'un fichier de contacts non trié,
Rentrer les contacts dans une liste chainée,
Trier celle-ci,
Réécrire le fichier dans l'ordre alphabétique.
Je sais théoriquement comment fonctionne un liste chainée, avec un pointeur sur suivant et un autre sur précédent, mais je n'arrive pas à mettre celà en application avec un fichier (rentrer les données du fichier dans la liste chainée)
Marsh Posté le 26-02-2008 à 20:08:44
ton code est foireux (outre que y'a eu des problèmes de copier/coller, enfin j'espère).
char carlu;
while(carlu=!EOF)
pour contenir le code eof, il faut passer par un int.
!= au lieu de =!
Marsh Posté le 26-02-2008 à 20:16:19
ok je vais reprendre tout ça avec mon poly de cours et reposter une solution
Marsh Posté le 26-02-2008 à 21:01:14
Code :
|
bon j'ai rentré les données du fichier dans un tableau de structure. Ensuite je voudrais le passer dans une liste chainée, à partir de là je coince
Marsh Posté le 26-02-2008 à 21:56:26
mais sinon tu peux compiler ce que tu écris ? ou tu fais tout à l'aveugle ? c'est censé être une solution compilable telle que ou un bootleg de patricia kaas ? (je blagouille hein panique pas)
bon:
d'un point de vue design (heu heu): si c'est pour avoir liste triée, tu peux faire une liste chainée simple. (enfin bon si on t'impose une liste doublement chainée)
donc un "contact *suivant" par entrée et pas de précédent. et un "contact *premier" en local au main de préférence (et pas global, enfin là je sais pas trop ce que tu faisais).
quand tu as lu avec succès une entrée que tu as stocké dans un maillon alloué, tu te balade du premier au dernier maillon, en l'insérant devant si il est plus petit.
donc je veux voir:
- une fonction qui alloue et initialise un maillon
- une fonction qui compare deux maillon pour les trier
- un main qui utilise la première fonction, tente de la renseigner, libère le maillon si le renseignement échoue ou qui le passe à une fonction d'insertion triée dans la liste (et qui donc utilise la fonction de comparaison de maillon).
Marsh Posté le 26-02-2008 à 23:00:15
Code :
|
Je me suis aidé de commentçamarche.
Là j'ai définit ma structure avec les contact, une autre structure pour lier les maillons. Au début j'initialise tout à NULL. Mais ensuite je ne comprend pas vraiment à partir des strcpy (je connais cette fonction strcpy, mais je ne comprends pas ce qu'est *NOM etc...)
Je rappelle que je me suis aidé d'un tuto, j'ai copié mais je n'ai pas saisi réellement ce qu'il fait quand il copie nouveau_contact->nom dans *NOM.
nouveau_contact est censé être rempli de données là? Et il les copie dans quoi?
Marsh Posté le 27-02-2008 à 22:13:59
Je crois avoir compris en fait. Quelqu'un peut il me confirmer si ce début est correct svp.
Par contre il faudra que je remplisse les chainne de caractère NOM, PRENOM NUMERO et EMAIL au préalable. Comment faire pour que le premier contact soit rempli avec ses bonnes coordonées, ne faut il pas incrémenter?
Autre question, je rempli d'abord toute la liste chainée puis je la trie? ou je trie en même temps que je la rempli? (en gros je la rempli dans le bon ordre)
Marsh Posté le 28-02-2008 à 22:02:46
Quand tu insère en fin de liste, le début ne change pas ! Par contre le precedent dernier elt de la lsite doit pointer sur le nouveau dernier elt.
Ca donne quelque chose du genre
Code :
|
Marsh Posté le 29-02-2008 à 10:25:26
oui, ici la fonction insertion_dans_liste_vide ne sert seulement qu'à ajouter le 1er maillon. Pour ajouter à la suite, j'ai fais cette fonction :
Code :
|
Marsh Posté le 29-02-2008 à 10:31:48
strcpy (nouveau_contact->nom, NOM);
badaboum ! utilise strncpy + chaine[taille - 1] = '\0', voire strlcpy si tu as.
Marsh Posté le 29-02-2008 à 19:02:04
ReplyMarsh Posté le 02-03-2008 à 20:50:56
pour trier vous pensez que je part dans la bonne direction?
Code :
|
Marsh Posté le 03-03-2008 à 14:48:02
silver53000 a écrit : ça ne va pas m'apporter grand chose à ce que j'ai pu lire sur strncpy |
Faire un programme correct ?
Marsh Posté le 26-02-2008 à 18:44:22
Bonjour, je vais aller au plus simple :
J'ai un fichier texte (contact.txt) de la forme "nom prenom 0601012222 email@mail.fr" sur chaque ligne.
Je voudrais dans un premier temps rentrer chaque contact dans une cellule d'une liste doublement chainée et circulaire. Malheureusement je ne maitrise pas les listes chainées.
Voici ce que j'ai fait :
A noter que j'ai utilisé une fonction (trier_contact) qui me servira à trier la liste chainée dans l'ordre alphabétique des noms.
Merci pour votre aide
Message édité par silver53000 le 26-02-2008 à 20:15:34