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 :

Listes chainées


Sujet :

C

  1. #1
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut Listes chainées
    Voila , je galére vraiment beaucoup à faire ce *** projet en C, svp pouvez vous m'aider ?

    Voici le contenu du fichier text :
    1:Maury:Florian:2,3
    2:Bortzemeyer:Stephane:1,3
    3:Ncolle:Jerome:2

    Ce qui veut dire que Florian connait le 2 et le 3 .
    Et le 3, Jerome ne conais que stephane

    Le but du jeu est de faire une liste chainé

    Autre chose, je dois rendre ca lundis à 12h donc si quelqu'un veut me donner un coup de main, ca m'aiderais beaucoup.
    Merci.



    Voici en l'algo sequentiel:

    Charger le contenu du fichier (c'est une fonction) passé en paramètre. Pour cela tu lis le fichier ligne par ligne et tu parse chaque
    ligne, c'est à dire, que tu va remplir pour chaque ligne une structure Personne qui représentera bien entendu
    une personne en mémoire. Tous ces objets Personne que tu va remplir, tu vas les ranger dans une liste (liste chaîné)
    ainsi à partir de cette liste tu devras pouvoir ajouter, supprimer une Personne, rechercher une personne par son
    identifiant.
    Et enfin tu ecrira une fonction pour sauvegarder ta liste de personne qui est en mémoire dans le fichier spécifié.

    Et pour permettre à l'utilisateur d'effectuer les diverses actions ajouter, supprimer,... tu dois faire un menu.

    je lis le fichier , les une ligne , je decoupe la ligne par separateur ( , et (,) pour les identifiant des amis
    Je me crée une structure Personne avec comme membres :
    - Un identifiant (l'identifiant de la personne)
    - Le nom
    - Le prénom
    - La liste (liste chaîné) d'identifiants d'amis OU la liste des struct Personne amis.
    // on utilise 2 liste chainé : une pour les personne et une pour la liste d'identifiant des amis d'une personne








    Lionceau,

  2. #2
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    Autre chose voici le code que j'ai commencé à écrire :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>  
     
    #define CARACTERE ':'
    #define TAILLETAB 100
    #define T 20
     
     
    /* TODO Projet :
    		Charger le contenu du fichier (c'est une fonction) passé en paramètre. Pour cela tu lis le fichier ligne par ligne et tu parse chaque
    		ligne, c'est à dire, que tu va remplir pour chaque ligne une structure Personne qui représentera bien entendu
    		une personne en mémoire. Tous ces objets Personne que tu va remplir, tu vas les ranger dans une liste (liste chaîné)
    		ainsi à partir de cette liste tu devras pouvoir ajouter, supprimer une Personne, rechercher une personne par son
    		identifiant.
    		Et enfin tu ecrira une fonction pour sauvegarder ta liste de personne qui est en mémoire dans le fichier spécifié.
     
    		Et pour permettre à l'utilisateur d'effectuer les diverses actions ajouter, supprimer,... tu dois faire un menu.
     
    		je lis le fichier , les une ligne , je decoupe la ligne par separateur (:) , et (,) pour les identifiant des amis
    		Je me crée une structure Personne avec comme membres :
    																- Un identifiant (l'identifiant de la personne)
    																- Le nom
    																- Le prénom
    																- La liste (liste chaîné) d'identifiants d'amis OU la liste des struct Personne amis.
    		// on utilise 2 liste chainé : une pour les personne  et une pour la liste d'identifiant des amis d'une personne
    */
     
    struct listeAmis;
    struct Personne {
    	unsigned long identifiant;
    	char nom[51];
    	char prenom[51];
    	struct Personne *listeAmis;
    };
     
    struct listeAmis {
    	struct Personne *pers;
    	struct listeAmis *amis;
    };
     
     
     
    //cette fonction ouvre et charge le contenu du fichier 
    void charger_fichier()
    {
     
     
     
    	FILE* fichier = NULL;
        int caractereActuel = 0;
    	int i=0;
    	char n=0;
    	char tab1[TAILLETAB]={0};
    	char tab2[TAILLETAB]={0};
    	int p=0;
    	struct Personne perso;
    	int champs =0;
     
    	fichier = fopen("test.txt", "r");
     
        if (fichier != NULL)
        {
            caractereActuel = fgetc(fichier); // On initialise caractereActuel
     
    			// Boucle de lecture des caractères un à un
    			while (caractereActuel != EOF) // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
    			{
     
     
     
    				while(caractereActuel != EOF )
    				{
    					//CARACTERE=':'
    					if(caractereActuel != CARACTERE && caractereActuel!='\n')
    						{
    					printf("%c", caractereActuel); // On affiche le caractère stocké dans caractereActuel
    					tab1[n]=caractereActuel;
    					n++;
     
      					caractereActuel = fgetc(fichier); // On lit le caractère suivant
    						}
    					else{
    							if (champs==0){
     
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
    										p++;
    										}
    								champs++;
    									}
    							else if(champs==1){
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
    										perso.nom[p]=tab1[0+p];
    										p++;
    										}
    								champs++;
    										}
    							else if(champs==2){
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
    										p++;
    										}
    								champs++;
    										}
    							else if(champs==3){
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
    										p++;
    										}
    								champs++;
    										}
     
    						printf("\n");	
    						//Essayer de recopier tout ce qui est lu avant sa dans un champs de la structure
    						n=0;
    						caractereActuel=fgetc(fichier);
     
    						}
     
    				}
     
    				//je suis sorti de la boucle donc la ligne entiere a été bien lu il faut les copier a partir du tableau dans ma structure
     
    			}
     
    			//sortie de boucle on est en fin de fichier
     
     
    			fclose(fichier);
    			}
    	else 
    	{
    		printf("erreur le fichier na pa pu etre ouvert");
    	}
    	getchar();
     
    }
     
    int main(int argc, char *argv[])
    {
    	/*
    			CODE LECTURE PARAMERTRE
    	*/
    	/*if(argc < 2)
    	{
    		printf("vous n'avez pas saisis de nom de fichier");
    		getchar();
    	}
    	else
    	{
    		/*
    		 CODE MENU
    		*/
    		charger_fichier();
     
     
     
    		getchar();
    	//}
        return 0;
    }

    Merci ,

    Lionceau,

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Quels sont les problèmes que tu rencontres et que tu as des difficultés à résoudre ?

    Tu as oublié de préciser les points sur lesquels tu recherches de l'aide.

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Un proverbe shadok disait : pourquoi faire simple quand on peut faire compliqué ? C'est ce à quoi je pense quand je vois ton programme.

    Tout d'abord ta définition de liste chainée est alambiquée (et je ne suis pas sur qu'elle soit correct). Pourquoi ne pas faire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct Personne {
    	unsigned int identifiant;
    	char nom[51];
    	char prenom[51];
    	struct Personne *listeAmis;
    }Personne;
    Tu accède au maillon suivant grâce au pointeur listeAmis.

    Ensuite pourquoi utiliser la fonction fgetc et non pas fgets? Pourquoi y aller caractère par caractère quand tu peux y aller ligne par ligne. Et en plus fgets te renvoie null quand tu arrive à la fin du fichier.

    Et pour finir quel est ton problème exactement? Qu'est ce qui ne marche pas?

    Et un petit PS : évite de dire "c'est un devoir urgent aidez-moi", ça encourage pas trop.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je verrai une structure de données du genre :

    1- On doit avoir une liste de personnes. Elle doit comporter (si la liste est simplement chainée)
    - un pointeur vers chaque descripteur d'une personne
    - un pointeur vers la personne suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Personne;
    typedef struct listePersonnes
    {
    	struct Personne *pers;
    	struct listePersonnes *suivant;
    }listePersonnes ;
    2- Chaque personne a
    - un identifiant : un entier fera l'affaire
    - un nom : il faut stocker une chaine de caractères. Comme les noms varient beaucoup en longueur, il est plus interressant, pendant qu'on y est, d'allouer la place juste nécessaire par allocation dynamique. Il faut alors un char*
    - un prénom. Même méthode que pour le nom
    - une liste d'amis : c'est aussi une liste de personnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Personne 
    {
    	unsigned identifiant;
    	char *nom;
    	char *prenom;
    	listePersonne *listeAmis;
    }Personne;

  6. #6
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    Bonjour, d'abord, merci pour vos réponses.
    Ma question est comment faire avec une liste chainé pour la liste amis

    voir dans le code : //bug pour la liste amis


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>  
     
    #define CARACTERE ':'
    #define TAILLETAB 100
    #define T 20
     
     
    /* TODO Projet :
    		Charger le contenu du fichier (c'est une fonction) passé en paramètre. Pour cela tu lis le fichier ligne par ligne et tu parse chaque
    		ligne, c'est à dire, que tu va remplir pour chaque ligne une structure Personne qui représentera bien entendu
    		une personne en mémoire. Tous ces objets Personne que tu va remplir, tu vas les ranger dans une liste (liste chaîné)
    		ainsi à partir de cette liste tu devras pouvoir ajouter, supprimer une Personne, rechercher une personne par son
    		identifiant.
    		Et enfin tu ecrira une fonction pour sauvegarder ta liste de personne qui est en mémoire dans le fichier spécifié.
     
    		Et pour permettre à l'utilisateur d'effectuer les diverses actions ajouter, supprimer,... tu dois faire un menu.
     
    		je lis le fichier , les une ligne , je decoupe la ligne par separateur (:) , et (,) pour les identifiant des amis
    		Je me crée une structure Personne avec comme membres :
    																- Un identifiant (l'identifiant de la personne)
    																- Le nom
    																- Le prénom
    																- La liste (liste chaîné) d'identifiants d'amis OU la liste des struct Personne amis.
    		// on utilise 2 liste chainé : une pour les personne  et une pour la liste d'identifiant des amis d'une personne
    */
     
    struct listeAmis;
    struct Personne {
    	unsigned long identifiant;
    	char nom[51];
    	char prenom[51];
    	struct Personne *listeAmis;
    };
     
    struct listeAmis {
    	struct Personne *pers;
    	struct listeAmis *amis;
    };
     
     
     
    //cette fonction ouvre et charge le contenu du fichier 
    void charger_fichier()
    {
     
     
     
    	FILE* fichier = NULL;
        int caractereActuel = 0;
    	int i=0;
    	char n=0;
    	char tab1[TAILLETAB]={0};
    	char tab2[TAILLETAB]={0};
    	int p=0;
    	struct Personne perso;
    	int champs =0;
     
    	fichier = fopen("test.txt", "r");
     
        if (fichier != NULL)
        {
            caractereActuel = fgetc(fichier); // On initialise caractereActuel
     
    			// Boucle de lecture des caractères un à un
    			while (caractereActuel != EOF) // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
    			{
     
     
     
    				while(caractereActuel != EOF )
    				{
    					//CARACTERE=':'
    					if(caractereActuel != CARACTERE && caractereActuel!='\n')
    						{
    					//printf("%c", caractereActuel); // On affiche le caractère stocké dans caractereActuel
    					tab1[n]=caractereActuel;
    					n++;
     
      					caractereActuel = fgetc(fichier); // On lit le caractère suivant
    						}
    					else{
    							if (champs==0){
     
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
    										perso.identifiant=tab1[0+p];
    										p++;
    										}
    								champs++;
    									}
    							else if(champs==1){
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
    										perso.nom[p]=tab1[0+p];
    										p++;
    										}
     
    								champs++;
    										}
    							else if(champs==2){
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
    										perso.prenom[p]=tab1[0+p];
    										p++;
    										}
    								champs++;
    										}
    							else if(champs==3){
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
     
    										//bug pour la liste amis 
    										p++;
    										}
    								champs=0;
    								}
     
    						printf("\n");	
    						//Essayer de recopier tout ce qui est lu avant sa dans un champs de la structure
    						n=0;
    						caractereActuel=fgetc(fichier);
     
    						}
     
    				}
     
    				//je suis sorti de la boucle donc la ligne entiere a été bien lu il faut les copier a partir du tableau dans ma structure
     
    			}
     
    			//sortie de boucle on est en fin de fichier
     
     
    			fclose(fichier);
    			}
    	else 
    	{
    		printf("erreur le fichier na pa pu etre ouvert");
    	}
    	getchar();
     
    }
     
    int main(int argc, char *argv[])
    {
    	/*
    			CODE LECTURE PARAMERTRE
    	*/
    	/*if(argc < 2)
    	{
    		printf("vous n'avez pas saisis de nom de fichier");
    		getchar();
    	}
    	else
    	{
    		/*
    		 CODE MENU
    		*/
    		charger_fichier();
     
     
     
    		getchar();
    	//}
        return 0;
    }

    Merci pour votre aide,

    Lionceau,

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Par défaut
    juste une question au passage:

    quel est l'intérêt d'écrire au lieu de ?

  8. #8
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    Ca sert à rien. Juste un copier collé.
    J'espère avoir répondus à ta question..


    Lionceau,

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    Je verrai une structure de données du genre :

    1- On doit avoir une liste de personnes. Elle doit comporter (si la liste est simplement chainée)
    - un pointeur vers chaque descripteur d'une personne
    - un pointeur vers la personne suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Personne;
    typedef struct listePersonnes
    {
    	struct Personne *pers;
    	struct listePersonnes *suivant;
    }listePersonnes ;
    2- Chaque personne a
    - un identifiant : un entier fera l'affaire
    - un nom : il faut stocker une chaine de caractères. Comme les noms varient beaucoup en longueur, il est plus interressant, pendant qu'on y est, d'allouer la place juste nécessaire par allocation dynamique. Il faut alors un char*
    - un prénom. Même méthode que pour le nom
    - une liste d'amis : c'est aussi une liste de personnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Personne 
    {
    	unsigned identifiant;
    	char *nom;
    	char *prenom;
    	listePersonne *listeAmis;
    }Personne;
    Salut

    Est-ce vraiment utile de mettre le chainage des personnes dans une structure à part ???

    Moi j'aurai plutôt vu une personne comme une entité connaissant
    - la personne suivante de la liste
    - la liste de ses amis

    Et défini ma structure ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct s_personne {
    	unsigned identifiant;
    	char *nom;
    	char *prenom;
    	struct s_personne *next;
    	struct s_personne *listeAmis;
    }t_personne;

    Citation Envoyé par lionceau Voir le message
    Ca sert à rien. Juste un copier collé.
    Ouais, bref c'est même pas ton propre code quoi. Et comme t'y pannes que dalle, tu viens ici demander qu'on te fasse la suite.

    Ben non. C'est à toi de concevoir ta propre gestion. Accessoirement je pige mal cette double boucle imbriquée pour traiter une fois le fichier. Parce que quand la boucle intérieure aura lu tout le fichier et arrivé à EOF, elle fera quoi la boucle extérieure ? Elle tentera de lire de nouveau le fichier ? Ben raté puisqu'il aura été lu !!!

    Donc il te faut commencer par le bas. Tu définis la structure. T'as divers exemples représentant la façon de voir de chacun. Je vais rajouter à la mienne un "élément pour tenir la liste". On peut se servir d'un simple pointeur pointant vers le premier élément mais l'expérience montre que c'est plus pratique si on définit une structure dédiée à ce travail. Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct {
    	t_personne *premier;
    }t_liste;

    Ca peut paraitre con de faire une structure ne contenant qu'un seul élément mais déjà ça évite le ** qu'on aura inévitablement si on se sert d'un simple pointeur (à un moment donné, il faudra peut-être modifier le pointeur "permier" et la fonction recevant ce pointeur à modifier recevra donc l'adresse de ce pointeur donc un t_personne **). Et en plus ça permet une plus grande évolutivité (on peut rajouter très facilement un compteur, un pointeur courant, un pointeur dernier, bref ce qu'on veut. C'est un peu comme une chemise. On peut la tenir par le col mais ça va mieux si on la met sur un cintre pour la transporter...

    Puis, une fois définis tes éléments, tu définis les fonctions de base. Par exemple la fonction qui, à partir d'un nom de personne et de la liste de ses amis, va remplir la structure et l'insérer dans la liste. Puis une fonction d'affichage qui te permet de tester déjà ton bout de code avec un petit jeu d'essai. Puis tu rajoutes la fonction de lecture du fichier qui récupère le nom et qui l'envoie à la fonction précédente et etc etc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    Oui c 'est vrai j'ai pas tout développé dans le code, j'ai fais ca en TP en binome.
    Et quand je disais copié collé , c'été pour "printf("%c",tab1[0+p]);" afin de juste changer printf("%c",tab1[0+p]); par printf("%c",tab1[1+p]); ..


    Tu as raison il me faut une balise struct Personne *next; qui pointe vers la personne suivante. Comment faire struct Personne *next; pour qu'il pointe vers le suivant ?
    .J'ai du mal à m'imaginer ca coté code. Sauf si on admet que le suivant admet un identifiant +1. Est ce une solution?

    En gros mon soucis est comment gérer la liste chainé. Est ce que quelqu'un peut m'expliquer ? J'ai compris le principe, mais je ne sais pas comment l'établir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct Personne {
    	unsigned identifiant;
    	char *nom;
    	char *prenom;
    	struct Personne *next;
    	struct Personne *listeAmis;
    }t_personne;
     
    typedef struct {
    	Personne *premier;
    }t_liste;
    Merci pour ton aide Sve@r.

    Lionceau,

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lionceau Voir le message
    Tu as raison il me faut une balise struct Personne *next; qui pointe vers la personne suivante. Comment faire struct Personne *next; pour qu'il pointe vers le suivant ?
    .J'ai du mal à m'imaginer ca coté code. Sauf si on admet que le suivant admet un identifiant +1. Est ce une solution?
    L'identifiant proposé par Diogène est important car dans ton fichier, tu associes des gens à des valeurs. C'est écrit "truc est copain avec 2, 3, 4" et non "truc est copain avec chose, machin, bozo" donc faut à un moment donné associer 2 et "chose". Alors imaginer "dernier identifiant connu + 1" peut marcher sauf qu'apparemment, ton fichier contient tout le monde donc tu peux pas tomber sur un cas où t'as "truc est copain avec 18" et que 18 n'existe pas donc tu devrais pas avoir besoin de créer un identifiant de façon manuelle.

    Maintenant, si tu penses au futur alors effectivement, si tu tombes sur une personne qui n'existe pas encore dans ta liste, t'as le droit de lui mettre "dernier identifiant connu" + 1. Et justement, la structure "t_liste" que j'ai donné comme exemple peut embarquer avec elle une valeur "dernier identifiant connu" ce qui t'évitera de nous mettre ça en globale.

    De mon coté, j'ai réfléchi. Quand tu parseras ton fichier, tu tomberas sur des lignes ressemblant à
    1:truc:2,3
    Alors que 2 et 3 n'existent pas encore dans ta liste. Il te faudra donc enregistrer que 1 est lié avec 2 alors que 2 n'a pas encore été créé

    Pour ça, t'as 2 possibilités
    1) tu parses 2 fois le fichier, la première fois pour créer toutes les personnes et la seconde pour créer les liens

    2) tu ne parses le fichier qu'une fois mais en recevant la fiche "1:truc", si la fiche 1 n'existe pas tu la crées et si elle existe tu ne la crées pas. Puis tu la remplis avec le nom "truc".
    Puis tu crées les fiches 2 et 3 en laissant les noms vides et tu relies la fiche 1 aux fiches 2 et 3.
    Lorsque la personne "2:machin" arrivera dans le système, sa fiche étant déjà créé ton algo ne fera que lui mettre le nom "machin". Moi perso ça me plait bien car ça évite de traiter 2 fois un fichier (lent)

    Et tu devrais aussi lire ce tuto => http://chgi.developpez.com/pile/
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @Sve@r
    Est-ce vraiment utile de mettre le chainage des personnes dans une structure à part ???
    D'un point de vue pratique, cela permet de réaliser un seul ensemble de fonctions (création/destruction de la liste, insertion/suppression d'éléments dans la liste,sauvegarde/chargement de la liste,...) qui gère à la fois la liste des personnes et la liste des amis d'une personne.
    Sinon, personnellement, j'aime mieux différentier une liste des maillons constituant la liste.

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    @Sve@r
    Sinon, personnellement, j'aime mieux différentier une liste des maillons constituant la liste.
    Mouais. Philosophie objet quoi. On distingue bien l'outil de l'élément qu'il manipule ce qui permet de faire évoluer très facilement l'élément ou de réadapter facilement un code existant à un nouveau projet... voire même créer une librairie où tout est déjà tout fait. Un peu comme moi qui apprécie bien le type, pas forcément nécessaire mais bien pratique, permettant de manipuler la liste. Bien vu.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    diogene -> une des fonctionnalités du programme est d'afficher l'identifiant ou le nom des amis que connait une personne.

    Donc cette base est elle bien bonne ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct Personne {
    	unsigned identifiant;
    	char *nom;
    	char *prenom;
    	struct Personne *next;
    	struct Personne *listeAmis;
    }t_personne;
     
    typedef struct {
    	Personne *premier;
    }t_liste;

    Lionceau,

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lionceau Voir le message
    diogene -> une des fonctionnalités du programme est d'afficher l'identifiant ou le nom des amis que connait une personne.

    Donc cette base est elle bien bonne ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct Personne {
    	unsigned identifiant;
    	char *nom;
    	char *prenom;
    	struct Personne *next;
    	struct Personne *listeAmis;
    }t_personne;
     
    typedef struct {
    	Personne *premier;
    }t_liste;

    Lionceau,
    Mouais, super classe. C'est vrai que lui il a 5204 pts tandis que je n'en ai que 2839 donc t'as raison de lui demander.

    Tu comprends donc pas que les deux bases sont toutes deux bonnes ? Et qu'on peut en établir cinquante autres différentes mais tout aussi bonnes ?? Et que c'est pas les bases qui sont importantes mais la façon dont on les comprend et les utilises ???

    Alors la vrai question est "est-ce que toi, avec cette structure, t'es capable de la comprendre et de schématiser la recherche des connaissances de untel ? Et aussi, annexe, as-tu lu le tuto sur les listes chainées disponible sur ce site ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    Oui j'ai lu http://chgi.developpez.com/pile/

    Je vais me baser à partir de ca. Je suis entrain de modifier la fonction charger_fichier() pour utiliser le push() du tuto..


    Lionceau,

  17. #17
    Membre très actif
    Avatar de lionceau
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 148
    Par défaut
    je ne sais pas comment faire pour le cas ou j'arrive dans le champ 3 c'est à dire, ou j'ai la liste d'amis d'une personne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    							else if(champs==3){
    								printf("\nmon tableau-->\t");
    								p=0;
    								while(p<n){
     
    										printf("%c",tab1[0+p]);
    										//inserer les caracteres dans chaque champs de la structure
     
     
    										//bug pour la liste amis 
    										p++;
    										}

    Lionceau,

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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