(C] liste chainée

Fermé
PIERRE - 21 sept. 2007 à 10:48
w1sm3rhi11 Messages postés 372 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 30 mars 2009 - 24 sept. 2007 à 11:45
Bonjour j'ai un petit problème de C.
Soit la struct suivant :
typedef struct element *Element
typdef struct element
{
int entier;
int decimal ;
Element next ;
} ;

après j'ai :
Element element = malloc(sizeof(struct Element));

void ajouter(Element a,int b,int c)
{
Element node = a ;
while(node ->suivant != null)
node = node ->suivant ;
Element nouveau = malloc(sizeof(struct Element));
nouveau->entier = b ; nouveau->decimal = c ;
node->suivant = nouveau ;
}

void supprimer_element(Element a,int b,int c)
{
Element node = a ;
while( node ->entier != b && node->decimal != c && node->suivant != null )
node = node ->suivant ;

/* LA je bloque */
Comment faire pour libérer la mémoire et affecter a la node_precedente la valeur de la node_suivante ( par rapport a celle que nous voulons supprimer ?
}

29 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
21 sept. 2007 à 13:31
courant->suivant = supp_element->suivant; si j'ai bien compris ?
Non.
supp_element c'est un pointeur que j'utilise pour avoir une référence vers l'élément que je doit supprimer
ça me permettre de faire free() sur supp_element

donc à eviter cette interpretation, même si ça pourrait être valable

je fait courant->suivant = courant->suivant->suivant justement pour montrer l'enchaînement ;-)

0
De plus, tu utilise souvant :

typedef struct ElementListe
{
char *donnee;
struct ElementListe *suivant;
} Element;
Element *elem ;
... /* du code */
elem->suivant->suivant

peut se remplacer par si je suis là logique :

typedef struct ElementListe *PElement ;
typedef struct ElementListe
{
char *donnee;
PElement suivant;
} Element;
PElement elem ;
elem->suivant-suivant

? Element *elem ~= PElement elem reviens a la même :s normalement
0
up
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
22 sept. 2007 à 18:14
Salut,

typedef struct ElementListe *PElement ;
typedef struct ElementListe
{
char *donnee;
PElement suivant;
} Element;
PElement elem ;


PElement c'est un pointeur du type ElementListe* , ce qui te permettra de definir le pointeur suivant dans la structure Element
En revanche elem c'est un pointeur de type Element*
donc il faut declaré
typedef struct ElementListe *PElement ;
typedef struct ElementListe
{
char *donnee;
PElement suivant;
} Element;
Element elem ; 
--
lami20j
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
w1sm3rhi11 Messages postés 372 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 30 mars 2009 53
24 sept. 2007 à 10:39
typedef struct ElementListe *PElement ;
typedef struct ElementListe
{
char *donnee;
PElement suivant;
} Element;
PElement elem ;


marche tout aussi bien ;)

Il suffira alors d'utiliser elem->suivant pour pointer sur l'élément suivant de la liste :)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 sept. 2007 à 10:43
Oui, biensûr.
Pourquoi faire un typedef si on ne l'utilise pas

typedef struct ElementListe{
  
}Element;


en plus c'est plus clair de dire qu'on crée un élément de la liste
ça reviens en fait à une histoire d'alias, le principe reste le même

faire un alias d'un alias ce n'est pas très top :-))
0
w1sm3rhi11 Messages postés 372 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 30 mars 2009 53 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
24 sept. 2007 à 10:53
C'est sur, juste que je trouve ton exemple un peu alambiqué enfin si ca marche et que PIERRE comprend c'est le principal ;)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 sept. 2007 à 11:21
et que PIERRE comprend c'est le principal ;)
D'accord avec toi, c'est ça mon but ;-)
Et voici sa réponse
D'accord merci, je viens de teste ton code est tout est bcp plus clair.

juste que je trouve ton exemple un peu alambiqué

Ben, justement il n'est pas alambique (ce qui ne vas changer pas ton avis ;-)
Au contraire j'ai crée le code dans le but didactic pour comprendre les opérations sur les listes chaînées.
Et je l'ai fait puisque à vrai dire je n'ai pas vu encore une présentation basique à la portée pour tout débutant.
Chaque fonction pourra être étudier sans se soucier d'une autre.
Si un structuration des opérations ne te semble pas organisée alors je suis désolé.

C'est loin d'être une bonne implementation.
Une impléméntation se fait en fonction des besoins.


Bref, je le trouve plûtot organisé, quoi que assez long, ce qui est d'ailleurs normal vu que pour chaque opération j'ai crée une fonction.

Je pense que c'est essentiel de comprendre le principe et ensuite de comprendre les opérations qu'on peut effectuer sur une liste

- sauvegarder le début et la fin de la liste pour garder le contrôle
- incrementation ou decrementation de la taille en fonction des opérations d'insertion ou suppression
- allocation de la mémoire pour le nouveau élément
- insertion dans une liste vide
- insertion au début
- insertion à la fin
- insertion ailleurs dans la liste
- suppression au début
- suppression à la fin
- suppression ailleurs dans la liste
- affichage de la liste
- detruire la liste

J'ai fait aussi une représentation pour chaque opérations pour être encore plus clair.

On pourrait écrire une seule fonction qui groupe les opérations d'insertion ainsi qu'une seule fonction qui groupe les opérations de suppression (voir Maîtrise des algorithmes en C)

0
w1sm3rhi11 Messages postés 372 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 30 mars 2009 53
24 sept. 2007 à 11:30
Pour ma compréhension ca ira ^^ j'ai largement utilisé les listes chaînées et créé certaines du genre hétérogène ou des trucs comme ca.

Ce que je voulais dire est simplement que je trouvais la structure de la liste un peu compliquée pour les débutants qui se lancent la dedans.
Apparemment j'ai eu tort ^^ en tout cas vu que c'est toi qui a fait ca c'est du beau travail :)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
24 sept. 2007 à 11:43
que je trouvais la structure de la liste un peu compliquée pour les débutants qui se lancent la dedans.
je vais tenir compte de ton opinion ;-) et je vais essayer de modifier.
Merci ;-)
0
w1sm3rhi11 Messages postés 372 Date d'inscription jeudi 20 septembre 2007 Statut Membre Dernière intervention 30 mars 2009 53
24 sept. 2007 à 11:45
Je t'en prie :)

Bon courage @+
0