IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Liste chainée et pb de pointeur


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut Liste chainée et pb de pointeur
    bonjour,
    J'essaye de créer une liste chainée en C, pour le moment rien de très compliqué : création de la liste, ajout de "cases" et affichage.
    Tout d'abord j'ai créé une structure dans un fichier .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    		int info;
    		struct type_case* suivant;
    }type_case;
    Puis pour manipuler plus facilement les pointeurs, j'ai créé un autre type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef type_case* pointeur_case;
    J'ai aussi créé une procédure pour insérer mes cases au bon endroit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    void insertion_bonne_place(pointeur_case* adr_liste, int val){
    	 /* variables locales */
    	 pointeur_case ptr_courant;
    	 pointeur_case case_precedente;
    	 bool case_trouvee= FAUX;
     
    	/* Création de la nouvelle case */
    	pointeur_case nouvelle_case=(pointeur_case)malloc(sizeof(type_case));
    	/*Stockage de l'information */
    	nouvelle_case->info=val;
    	ptr_courant=*adr_liste;
    	case_precedente=NULL;
     
    	while((ptr_courant != NULL) && (!case_trouvee)){
    		 if (ptr_courant->info < val){
       		 	case_precedente=ptr_courant;
       		 	ptr_courant = ptr_courant->suivant;
       		 }else{
    		 	   case_trouvee = VRAI;
    		 }
    	 }
    	 if( ptr_courant == NULL){
    	 	 if (*adr_liste == NULL){
    		 	/* liste vide, on a créé la première case */
    		 	*adr_liste = nouvelle_case; 
    		 	nouvelle_case->suivant = NULL;
    		 }else{
    		 	   /* la liste n'est pas vide mais la nouvelle case doit être insérée à la fin */
    		 	   case_precedente->suivant=nouvelle_case;
    		 	   nouvelle_case->suivant=NULL;
    		 }
    	 }else{
    	 	   if (case_precedente!=NULL){
    				  /* insertion de la case au bon endroit dans la liste*/
    				  case_precedente->suivant=nouvelle_case;
    				  nouvelle_case->suivant=ptr_courant;
    		   }else{
    		   		 /* insertion au tout début , avant la première case */
    		   		 *adr_liste= nouvelle_case;
    		   		 nouvelle_case->suivant=ptr_courant;
    		   }
      	 }
    }
    Mais j'ai des pb lors de la compilation : Warning assignment from incompatible pointer type pour les lignes de code suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	ptr_courant = ptr_courant->suivant;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     case_precedente->suivant=nouvelle_case;
    , ainsi que toutes les autres qui leur ressemblent.
    J'ai malheureusement une erreur aussi " syntax error at end of input " signalé à la fin de mon main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
     
    #include "fonction.h"
     
    int main() {
    	 pointeur_case liste;
    	 initialisation_liste(&liste);
    	 insertion_bonne_place(&liste,2);
    	 insertion_bonne_place(&liste,20);
    	 insertion_bonne_place(&liste,4);
    	 insertion_bonne_place(&liste,1);
    	 insertion_bonne_place(&liste,6);
    	 afficher_liste(liste);
     
    }
    Si vous pouvez m'aider , ça serait gentil , car la manipulation des listes chainées n'est que la base d'un projet que je dois faire, et j'avoue que je suis mal partie si je ne n'arrive pas à faire des choses simples.
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    struct type_case est une structure indéfinie.
    Le type type_case, lui, correspond à une structure définie mais anonyme.

    Donc, type_case * et struct type_case * ne sont pas des pointeurs vers le même type...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Dans ce cas, comment fait-on une liste ???
    c'est le genre d'exemple que j'ai retrouvé dans de nombreux cours de C aussi bien dans des livres que sur internet et c'est même la façon que nous a donné mon prof ...

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par P'tite Nélodie
    J'essaye de créer une liste chainée en C, pour le moment rien de très compliqué : création de la liste, ajout de "cases" et affichage.
    Tout d'abord j'ai créé une structure dans un fichier .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
    		int info;
    		struct type_case* suivant;
    }type_case;
    Pas bon. Je recommande de faire les choses plus simplement avec une structure nommée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct noeud
    {
       int info;
       struct noeud* p_suivant;
    };
    Ce qui peut aider, c'est une structure supplémentaire de gestion de la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct liste
    {
       struct node* p_debut;
       struct node* p_fin;
    };
    Pas besoin de typedef, ça va t'embrouiller plus qu'autre chose...

  5. #5
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Un indice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct item
    {
       struct item *next;
       void *data;
    } item_s;
    Pour plus de détails : http://nicolasj.developpez.com/articles/listesimple/

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Merci pour ces réponses, mais je ne vois pas tellement la différence avec mon code
    Bon sinon , j'ai réussi à éliminer mes warning, j'avais fait une ptite erreur dans ma définition de structure
    voilà ce que j'ai maintenant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct type_case{
    		int info;
    	    struct type_case* suivant;
    }type_case;
    J'avais oublié de mettre le nom de mon type après struct.
    Enfin , cela ne résoud qu'à moitié les choses car j'ai toujours les même warning dans un autre fichier test du même style et avec la bonne définition de la structure.
    Et puis j'ai toujours cette erreur à la fin du main

  7. #7
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Le problème, c'est que l'on veut souvent écrire des typedef trop rapidement et on zappe de ce fait de nombreuses choses.

    La déclaration de types en C ne correspond pas à la définition ou la déclaration d'un ensemble de valeurs, mais plutôt à la construction d'une structure de données, contrairement au Haskell où l'on définit des ensembles de valeurs, voire des ensembles de types !

    Tu peux donc procéder de la façon suivante ; c'est très découpé, mais au moins ça a le mérite de bien comprendre les choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct type_case_ { int info; struct type_case_ *suivant; };
     
    typedef struct type_case_ type_case;
     
    typedef type_case *pointeur_case;
    Une précision concernant la première déclaration : "struct type_case_ *suivant" déclare un pointeur sur un type n'existant pas encore, ou du moins n'étant pas encore complètement défini. Le C-ANSI autorise explicitement ce genre de déclaration, mais uniquement pour les pointeurs sur les types enregistrés comme "struct" ou "union" ; en fait, on aurait très bien pu procéder de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct type_case_;
     
    struct type_case_ { int info; struct type_case_ *suivant; };
    La première ligne spécifie que type_case_ est un "struct", et dès lors il est possible de déclarer un pointeur sur ce type, même si il n'est pas encore entièrement défini.

  8. #8
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Je n'ai pas réussi à reproduire ton erreur finale, ni tes warning, en copiant-collant ton code, et en ajoutant les fonctions initialisation_liste() et afficher_liste() que tu n'avais pas données, et un petit "return EXIT_SUCCESS;" tout à la fin du main().
    Le résultat de mon afficher_liste() a l'air cohérent.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    C'est bon mon code fonctionne enfin correctement !!
    voilà comment j'ai défini mes structures et mes types
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct case_liste{
    		int info;
    	    struct case_liste* suivant;
    };
    typedef struct case_liste type_case;
    typedef type_case* pointeur_case;
    et puis j'ai aussi corrigé des ptites erreurs d'inattention du style une " } " qui manquait et une faute de frappe dans un appel de fonction.
    En tout cas , maintenant je vais faire très attention au type mais mon prof de C adore ça et je suis obligée d'utiliser ce genre de définition pour mon projet

    Merci pour vos conseils

  10. #10
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Un petit en bah du thread serait le bienvenu, si c'est le cas bien entendu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2008, 21h44
  2. Double pointeurs dans les listes chainées
    Par NouK32 dans le forum Débuter
    Réponses: 8
    Dernier message: 10/02/2008, 18h19
  3. Réponses: 18
    Dernier message: 29/03/2007, 20h40
  4. [Débutant] Pointeur sur liste chainée
    Par HaTnuX dans le forum C
    Réponses: 2
    Dernier message: 02/12/2006, 17h53
  5. Réponses: 4
    Dernier message: 26/09/2005, 22h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo