Liste chainée - C - Programmation
Marsh Posté le 23-06-2006 à 00:59:48
Hum... un peu compliqué.
Bon, avant toute chose, il faut savoir qu'une liste chaînée n'est utile que si tu dois insérer des éléments au-milieu d'autres. Avec une liste chaînée, tu crées un nouvel élément puis tu mets à jour les liens.
Si ton élément vient s'insérer après les autres, une liste chaînée marchera mais n'est vraiment pas utile et peut avantageusement être remplacée par un tableau que tu alloues et réalloue avec realloc dès que tu l'as remplis...
Remarque annexe: c'est pas très propre de mettre des "exit" dans des fonctions autre que "main"
Marsh Posté le 23-06-2006 à 15:42:59
Sve@r a écrit : Bon, avant toute chose, il faut savoir qu'une liste chaînée n'est utile que si tu dois insérer des éléments au-milieu d'autres. Avec une liste chaînée, tu crées un nouvel élément puis tu mets à jour les liens. |
Effectivement, mais je pense que dans ce cas, la liste chaînée se justifie pour les suppressions d'éléments (fonction effaceutilisateur).
mayapour> Ta définition de la structure Element me paraît pas mal, mais je ne comprends pas pourquoi val est un int et pas un my_passwd.
Tu devrais maintenant te construire une petite bibliothèque de fonctions permettant de manipuler tes listes chaînées (ajout, suppression, recherche). On t'aidera si tu as des problèmes pour ça.
Ensuite, il sera simple de reprendre tes fonctions existantes et les primitives de manipulation de listes pour faire ce que tu veux.
PS: utilise des balises code pour poster tes programmes stp.
EDIT: j'avais pas vu le topic doublon
Marsh Posté le 23-06-2006 à 16:53:00
franceso a écrit : Effectivement, mais je pense que dans ce cas, la liste chaînée se justifie pour les suppressions d'éléments (fonction effaceutilisateur). |
Exact. J'avais juste survolé le code sans fait gaffe à cette fonction. Effectivement, s'il y a insertion ou suppression d'un élément intermédiaire, la liste chaînée se justifie.
franceso a écrit : mayapour> Ta définition de la structure Element me paraît pas mal, mais je ne comprends pas pourquoi val est un int et pas un my_passwd. |
Très bonnes remarques. Je vais rajouter les miennes
1) en général, une structure se nomme conventionnellement "s_qqchose" => struct s_passwd" au lieu de "struct passwd"
2) utiliser "typedef" permet de ne plus être obligé de mettre "struct" chaque fois que tu veux avoir une variable de type "struct s_passwd"
typedef struct { |
Ensuite, au-lieu de créer des variables de type "struct s_passwd", tu crées des variables de type "t_passwd" mais qui s'emploient de la même manière
3) après avoir défini ton type "t_elem" te permettant de manipuler un élément de ta liste, il est souvent judicieux de créer un type "t_liste" te permettant de manipuler toute ta liste entière.
Ce type (pouvant être vu comme "poignée de ta liste" ) contiendra évidemment un pointeur sur le premier élément, éventuellement un pointeur sur le dernier, un pointeur sur l'élément en cours de traitement, etc (tout ce qu'il peut te paraître utile d'avoir).
Ensuite, dans ton main, tu définis un "t_liste liste" et tu initialises tous ses pointeurs à NULL (autant créer une fonction "void ListeInit" pour faire cela) puis, dès que tu veux passer ta liste à une fonction quelconque, tu lui passes "&liste" et ta fonction recevant un pointeur de type "t_liste *" pourra, à partir de ce pointeur, manipuler à son grès chacun des éléments de ta liste.
En faisant comme Francesco le dit, en créant toute une foule de fonctions te permettant de manipuler un élément, ou une liste complète, tu te rapproches de la philosophie "objet" (un type + des fonctions pour le manipuler). Une fois que tes fonctions sont bien solides, la finalisation devient très simple.
Marsh Posté le 22-06-2006 à 22:34:37
Bonjour,
J'ai besoin de conseils pour les listes chainées.
Mon programme fait ce que je veux, c'est à dire sauvegarde dans un fichier du login, pass et shell entré (option a) et liste (option l) ou efface (option d) (avec cryptage du mot de passe).
Mais voilà, je souhaiterai qu'il ne sauvegarde pas dans un fichier mais dans une liste chainée (donc en mémoire dynamique).
J'ai tenté de remplacer la structure ci dessous par quelque chose comme :
typedef struct Element{
int val;
struct Element *next;
}Element;
Mais j'ai trop d'erreurs.
Des idées ?
MERCI par avance
Message édité par mayapour le 23-06-2006 à 16:17:58