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 :

probleme sur les listes chainees


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut probleme sur les listes chainees
    Bonjour,je vous explique mon problème.J'ai un fichier texte que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    \ \ \ 5\ 18\ \ \
    \ \ 11\6 . . \ \
    \ \13 . . . \ \
    \7 . . \4 . . \
    \ \15 . . . \ \
    \ \ \ \ \ \ \
    Mon but est de faire un tableau de listes qui a la taille du nombre de variables qui sont ici représentés par les points.
    J'ai déjà un programme qui calcule le nombre de variables.

    Maintenant,je dois donc lire le fichier, je dois donner des valeurs(indices) à mes variables(points).
    Et lorsque 2 variables(points)se succèdent comme dans la deuxieme ligne par exemple,je dois chainer la premiere variable(premier point) à la deuxieme et inversement la deuxieme(deuxieme point) a la premiere.

    Je schématise pour la premiere ligne :

    0->1
    1->0

    Pour la deuxieme ligne j'aurais:

    0->1 //le premier point trouvé(indice 0) dans le fichier est lié au 2eme point(indice 1)
    1->0 //l'inverse
    //deuxieme ligne
    2->3->4 // le 3eme point(indice 2) est lié au 4eme et 5eme point trouvé
    3->2->4
    4->2->3
    .........
    .........
    .........
    nieme point

    Les variables(points) sur une meme ligne qui se succèdent
    ex: . . .
    sont dans une liste.

    Voici ce que j'ai fait :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void construction_graphe_contraintes(int nombre_variables);
    typedef struct maillon maillon;
    struct maillon
    {
    	maillon *suivant;
    	int indice_maillon;
    };
     
    typedef maillon*liste;
     
    liste tableau_contraintes[nombre_variables];
     
    int main(void)
    {
    	FILE*grille=fopen("grille.txt","r");
    	if(grille==NULL)
    	{
    		perror("Erreur lors de l'ouverture de la grille");
    		return EXIT_FAILURE;
    	}
    	while(!feof(grille)
    	{
    		lecture_ligne(nombre_variables);
    	}
     
    }
    	//Contraintes sur les lignes
    	lecture_ligne(int nombre_variables)
    	{
    		char caractere;
    		int indice_tableau=0;
    		int indice_m=0;
    		char tmp;
    		int reste_variable=nombre_variables;
    		tmp=fgetc(grille);
     
    		while(tmp!="\n")
    		{
    			if(tmp==".")
    			{	
    				maillon* tableau_contraintes[nombre_variables]=(maillon*)malloc(sizeof(struct maillon));
    				maillon*maillon=(maillon*)malloc(sizeof(struct maillon));
    				maillon->indice_maillon=indice_m;
    				indice_m++;
    				maillon->suivant=NULL;
     
    				tmp=fgetc(grille);
     
    				while(tmp==".")
    				{
    					maillon * pointeur=(maillon*)malloc(sizeof(struct maillon)):
    					pointeur=tableau_contraintes[indice_tableau];
    					maillon* nouveau_maillon=(maillon*)malloc(sizeof(struct maillon));
    					nouveau_maillon->indice_maillon=indice_m;
    					indice_m++;
    					nouveau_maillon->suivant=NULL;
    					pointeur->suivant=nouveau_maillon;
    					indice_tableau++;
    					pointeur->suivant=maillon;
    					pointeur=nouveau_maillon;
    				}
    			}
    		}
    Mon probleme est que je n'arrive pas a généraliser mon code pour n variables et je n'ai pas très bien compris le procéder pour chainer 0 à 1 et en meme temps 1 à 0. C'est un problème d'algo.Merci de m'aider!

  2. #2
    Membre Expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Par défaut
    Bonjour,

    Tu as plusieurs problèmes dans ton code.
    Déjà d'un point de vue algorithmique, tu ne lis pas le caractère suivant dans ta boucle de départ.

    Reprenons un peu ton exercice
    Il te demande de rechercher le caractère "." et de chainer les caractères points successifs entre eux.

    1 - Parcourir tant que non fin de fichier
    2 - Parcourir tant que non fin de ligne
    3 - Rechercher le premier caractère point
    4 - Regarder le caractère suivant
    a) C'est un point => Traitement de chainage et regarder le suivant
    b) Regarder le suivant

    En algo :

    parcours tant que non fin de fichier
    parcours tant que non fin de ligne et non fin de fichier
    Recherche caractère Point
    Parcours tant que non fin de fichier et non fin de ligne et caractère suivant différent de point
    Traitement de chaînage
    fin de parcours
    fin de parcours
    fin de parcours

    Pour des raisons évidentes, tous ces parcours doivent être effectué à l'aide de la même variable afin de progresser toujours dans le fichier

    Au niveau programmation dans ton code, tu as une erreur importante sur le traitement des chaines de caractères.

    La comparaison des chaines de caractères s'effectue avec la fonction strcmp. Je t'invite à regarder la FAQ à ce sujet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	while(tmp!="\n") // Entre autre dans ton code
    En espérant t'avoir un peu éclairer
    Cordialement,
    Christophe

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Merci mais j'avouerai que je bloque ici:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    lecture_ligne(int nombre_variables)
    	{
    		char caractere;
    		int indice_tableau=0;
    		int indice_m=0;
    		char tmp;
     
    		while(!feof(grille))
    		{
    			tmp=fgetc(grille);
    			while((strcmp(tmp,'\n')==0) && !feof(grille))
    			{
    Je ne vois pas comment faire pour "chercher" le caractère point tant que non fin de fichier,non fin de ligne et caractère suivant différent de point.

    Merci !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    lecture_ligne(int nombre_variables)
    	{
    		char caractere;
    		int indice_tableau=0;
    		int indice_m=0;
    		char tmp;
     
    		while(!feof(grille))
    		{
    			tmp=fgetc(grille);
    			while((strcmp(tmp,'\n')==0) && !feof(grille))
    			{	
    				while(strcmp(tmp,'.')==0)
    				{

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    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
    while(!feof(grille))
    		{
    			tmp=fgetc(grille);
    			while((strcmp(tmp,'\n')==0) && !feof(grille))
    			{	
    				liste tableau_contraintes[nombre_variables]=(liste)malloc((nombrevariables)*sizeof(struct maillon));
     
    				while((strcmp(tmp,'\n')==0) && !feof(grille) && strcmp(tmp,'.')==0)
    				{
     
    					liste maillon=(liste)malloc(sizeof(struct maillon));
    					maillon->indice_maillon=indice_m;
    					indice_m++;
    					maillon->suivant=NULL;
    					tmp=fgetc(grille);

    Ce que j'arrive pas à comprendre c'est le processus de chainage.

    Comment garder un maillon,allouer un nouveau maillon,sauvegarder puis allouer un autre par exemple puis faire le chainage entre les 3 !! !

    1->2->3
    2->1->3
    3->1->2

  6. #6
    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
    Ce que j'arrive pas à comprendre c'est le processus de chainage.
    Moi non plus.

    Tu n'es pas clair sur ce que tu veux, et c'est sans doute pour cela que tu n'as pas de réponses.

    Tu dis vouloir obtenir :

    1->2->3
    2->1->3
    3->1->2
    et pourquoi pas aussi 1->3->2 ou 2->3->1 ou 3->2->1 ?

    Il faut définir précisément ce que tu entends toi par "chainage" et quel est le critère qui fait que A sera chainé à B.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Oui l'ordre du chainage importe peu :

    Pour chaque ligne, lorsque je rencontre des points qui se succèdent(c'est à dire des '.' dans mon fichier) alors je dois chainer ces points entre eux.

    Je trouve un premier point,j'alloue un maillon avec comme indice 0 (puisque c'est le premier point que j'ai trouvé) puis après tant que j'ai des points après ce premier point je dois faire pareil.J'alloue un deuxieme maillon d'indice 1 puis un troisieme d'indice 2.

    Et donc dans mon tableau de maillon,le maillon d'indice 1 et 2 devront etre dans la liste de tab_maillon[0].

    Puis le maillon d'indice 0 et 2 devront etre dans la liste de tab_maillon[1] .

    ...

    Vous comprenez?

  8. #8
    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
    Si l'ordre du chainage importe peu, placer en tête de la liste le nouveau maillon est plus simple.
    Au départ, toutes les listes sont vides donc les têtes de liste, les tab_maillon[i], doivent être initialisées à NULL.

    On peut ensuite insérer les nouveaux maillons dans la liste adéquate en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    - Créer un nouveau maillon et initialiser ses champs de données (indice_maillon)
    
    - Placer dans son champ de chainage (suivant) la valeur de la tête de liste
    
    - placer dans la tête de liste l'adresse du nouveau maillon
    Ceci donne symboliquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
              Liste                                  Ajout d'un maillon
    --------------------------------------------------------------------------------
    Tete -> NULL                             Maillon1             Tete->maillon1
                                             suivant -> NULL
    --------------------------------------------------------------------------------
    Tete -> Maillon1                         Maillon2             Tete ->Maillon2
            suivant -> NULL                  suivant ->Maillon1
    --------------------------------------------------------------------------------
    Tete -> Maillon2 
            suivant -> Maillon1
                        suivant -> NULL
    --------------------------------------------------------------------------------

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Je ne comprends pas trop ta notion de tête de liste !

    Le premier point que je trouve, j'alloue de la mémoire pour créer un maillon, je lui donne l'indice que je veux,j'initialise son champ suivant à NULL puis après?

    C'est là que je bloque !

    Tu appelles tete de liste tab[i] ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    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
    lecture_ligne(int nombre_variables)
    	{
    		char caractere;
    		int indice_tableau=0;
    		int indice_m=0;
    		char tmp;
    		int i;
     
    		while(!feof(grille))
    		{
    			tmp=fgetc(grille);
    			while((strcmp(tmp,'\n')==0) && !feof(grille))
    			{	
    				tableau_contraintes[nombre_variables]=(liste)malloc((nombrevariables)*sizeof(struct maillon));
    				for(i=0;i<nombre_variables;i++)
    				{
    					tableau_contraintes[i]=NULL;
    				}
    				while((strcmp(tmp,'\n')==0) && !feof(grille) && strcmp(tmp,'.')==0)
    				{
     
    					liste pointeur=(liste)malloc(sizeof(struct maillon));
    					pointeur=tableau_contraintes[0];
    					liste maillon=(liste)malloc(sizeof(struct maillon));
    					maillon->indice_maillon=indice_m;
    					maillon->suivant=pointeur;
    					pointeur=maillon;
    Voila ce que tu m'as conseillé de faire.Cependant ce n'est pas bon car tab|0] ne doit pas etre chainé au maillon d'indice 0(on devrait le garder quelque part pour ensuite le chainer quand on le doit).Je ne sais pas comment procéder !

  11. #11
    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 ne comprends pas trop ta notion de tête de liste !
    Bah, c'est le premier de la liste !

    Cependant ce n'est pas bon car tab|0] ne doit pas etre chainé au maillon d'indice 0(on devrait le garder quelque part pour ensuite le chainer quand on le doit).Je ne sais pas comment procéder !
    Pourrais-tu être clair ? reprenons ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    \ \ \ 5\ 18\ \ \
    \ \ 11\6 . . \ \
    \ \13 . . . \ \
    \7 . . \4 . . \
    \ \15 . . . \ \
    \ \ \ \ \ \ \
    Qu'est-ce que tu veux obtenir précisément au final comme liste(s) et avec quoi dedans ? (Je suis peut être un peu lent, mais je n'ai toujours pas compris ton but)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Mes points dans mon fichier texte représente des variables.

    Dans un premier temps je veux créer un tableau de maillon qui a la taille du nombre de mes variables trouvées dans le fichier. Pour ça pas de problème.

    En fait dans un premier temps je veux différencier les variables qui se trouvent sur la même ligne et qui ne sont pas séparées par des '\' :

    ex: . . . (ces 3 points représentent 3 maillons différents,d'indice 0 1 et 2,c'est l'ordre dans lequel ils apparaissent dans le fichier.Comme ces 3 points sont sur la meme ligne et qu'ils ne sont pas séparés par des '\', je dois les chainer entre eux.

    J'aurais donc dans mon tableau de maillons:

    tab[0]->maillon1->maillon2
    tab[1]->maillon0->maillon2
    tab[2]->maillon0->maillon1

    Et je dois faire ceci pour les n points qui se trouvent dans mon fichier.

    Si dans la suite de mon fichier, j'ai 2 points qui se suivent:

    ../

    j'aurais(si ce sont les 4eme et 5 eme point dans l'ordre d'apparition dans mon fichier):

    tab[3]->maillon4
    tab[4]->maillon3

    etc...

    Dans un premier temps donc je chaine les points qui se trouvent sur la meme ligne et qui ne sont pas séparés par des'\'.
    Dans un deuxieme temps je dois chainer entre eux les points qui se trouvent sur la meme colonne(ça on verra plus tard je pense)

  13. #13
    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
    Inutile de faire des "up"
    Tu n'es pas clair dans ce que tu veux, c'est pourquoi tu n'as pas de réponses.

    Personnellement, je n'ai toujours rien compris.
    Par exemple, pourquoi as tu
    tab[0]->maillon1->maillon2
    tab[1]->maillon0->maillon2
    tab[2]->maillon0->maillon1
    et pas, par exemple
    tab[..] ->maillon2->maillon1
    Pourquoi tab[0] pointe t-il sur maillon1 plutôt que maillon0 ?
    ...

    Dans un post précédent je te demande
    Pourrais-tu être clair ? reprenons ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    \ \ \ 5\ 18\ \ \
    \ \ 11\6 . . \ \
    \ \13 . . . \ \
    \7 . . \4 . . \
    \ \15 . . . \ \
    \ \ \ \ \ \ \
    Qu'est-ce que tu veux obtenir précisément au final comme liste(s) et avec quoi dedans ? (Je suis peut être un peu lent, mais je n'ai toujours pas compris ton but)
    Tu n'as pas répondu. Quel est le résultat attendu dans ce cas ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Désolé je pensais avoir été clair.

    Je reprends.

    Ce que je souhaiterais faire est d'abord de donner un numéro à mes variables(les points dans mon fichier).
    ex:Le premier point que je rencontre aura l'indice 1, le 2eme l'indice 2 etc...

    Ensuite je veux pouvoir faire un tableau de listes indexés sur mes indices de variables et qui suivrait la règle suivante:

    Si la variable d'indice 0(donc le premier point que je rencontre) est suivie par d'autres '.' sur la même ligne sans etre séparés par des '\', par exemple:
    ...

    Je veux pouvoir chainer 2 maillons respectivement d'indice 1 et 2(puisque ce sont les 2eme et 3eme point que j'ai trouvé dans mon fichier) à tableau_liste[0].
    Pour continuer je dois aussi chainer les maillons d'indice 0 et 3 à tableau_liste[2] car les points 1 et 3 sont sur la meme ligne que le point 2.
    Enfin je dois chainer les maillons d'indice 1 et 2 à tableau_liste[3] pour les mêmes raisons.

    Et je dois répéter ce processus pour les n lignes de mon fichier.

    Vous comprenez ?

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par guipe Voir le message
    Je veux pouvoir chainer 2 maillons respectivement d'indice 1 et 2(puisque ce sont les 2eme et 3eme point que j'ai trouvé dans mon fichier) à tableau_liste[0].
    Pour continuer je dois aussi chainer les maillons d'indice 0 et 3 à tableau_liste[2] car les points 1 et 3 sont sur la meme ligne que le point 2.
    Enfin je dois chainer les maillons d'indice 1 et 2 à tableau_liste[3] pour les mêmes raisons.
    Je ne te suis pas trop dans les indices (j'ai l'impression que parfois tu indices depuis 0 et parfois depuis 1).

    Ne serait-ce pas plutôt :

    Pour continuer je dois aussi chainer les maillons d'indice 0 et 2 à tableau_liste[1] car les points 1 et 3 sont sur la même ligne que le point 2.
    Enfin je dois chainer les maillons d'indice 0 et 1 à tableau_liste[2] pour les mêmes raisons.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Oui désolé j'ai fait une erreur: je reprends :

    Ce que je souhaiterais faire est d'abord de donner un numéro à mes variables(les points dans mon fichier).
    ex:Le premier point que je rencontre sera la variable l'indice 0, le 2eme la variable d'indice 1 etc...

    Ensuite je veux pouvoir faire un tableau de listes indexés sur mes indices de variables et qui suivrait la règle suivante:

    exemple pour la premiere ligne:

    Si la variable d'indice 0(donc le premier point que je rencontre) est suivie par d'autres '.' sur la même ligne sans etre séparés par des '\', par exemple:
    1ere ligne: ...

    Je veux pouvoir chainer 2 maillons respectivement d'indice 1 et 2(puisque ce sont les 2eme et 3eme point que j'ai trouvé dans mon fichier) à tableau_liste[0].
    Pour continuer je dois aussi chainer les maillons d'indice 0 et 2 à tableau_liste[1] car les points 1(le premier point de mon fichier) et 3(le 3eme point rencontré dans mon fichier) sont sur la meme ligne que le point 2(2eme point de mon fichier).
    Enfin je dois chainer les maillons d'indice 0 et 1 à tableau_liste[2] pour les mêmes raisons.



    Et je dois répéter ce processus pour les n lignes de mon fichier.

    Vous comprenez ?

  17. #17
    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
    Si j'ai bien compris, on peut faire ceci :
    n est l'indice du nouveau premier point
    m est l'indice du point à ajouter
    1- Ajouter m à la liste des points référencés dans la liste de n
    2- Ajouter n et la liste de n à la liste de m
    3- Ajouter m à la liste de n
    Exemple (/ représente NULL):
    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
        indice actuellement     après étape (1)        après étape (2)         après étape (3) 
    .             _
         n       |_|->/
    
    ..            _                 _                    _                      _
         n       |_|->/            |_|->/               |_|->/                 |_|->n+1->/
     m = n+1     |_|->/            |_|->/               |_|->n->/              |_|->n->/
    
    ...           _                 _                    _                      _
         n       |_|->n+1->/       |_|->n+1->/          |_|->n+1->/            |_|->n+1->n+2->/
         n+1     |_|->n->/         |_|->n->n+2->/       |_|->n->n+2->/         |_|->n->n+2->/
     m = n+2     |_|->/            |_|->/               |_|->n->n+1->/         |_|->n->n+1->/
    
    ....          _                 _                    _                      _
         n       |_|->n+1->n+2->/  |_|->n+1->n+2->/     |_|->n+1->n+2->/       |_|->n+1->n+2->n+3/
         n+1     |_|->n->n+2->/    |_|->n->n+2->n+3->/  |_|->n->n+2->n+3->/    |_|->n->n+2->n+3->/
         n+2     |_|->n->n+1->/    |_|->n->n+1->n+3/    |_|->n->n+1->n+3/      |_|->n->n+1->n+3/
     m = n+3     |_|->/            |_|->/               |_|->n->n+1->n+2->/    |_|->n->n+1->n+2->/
    (Note : le code sera plus simple si l'ordre dans une liste n'a pas d'importance et qu'on peut insérer en tête plutôt qu'en queue)

    Mais, il serait plus économique (et plus simple) de ne faire qu'une seule liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ....          _                
         n       |_|--| 
         n+1     |_|--|    
         n+2     |_|--|--->n->n+1->n+2->n+3->/    
     m = n+3     |_|--|
    et lors de la consultation de la liste de p, ignorer simplement le maillon qui référence la valeur p

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Oui ce que je souhaite faire est ce que tu as fait et expliqué dans le 2eme exemple !

    Mon fichier exemple est celui ci:

    \ \ \ 5\ 18\ \ \
    \ \ 11\6 . . \ \
    \ \13 . . . \ \
    \7 . . \4 . . \
    \ \15 . . . \ \
    \ \ \ \ \ \ \

    Pour la 1ere ligne dans mon exemple il n'y a rien à faire.

    Cela commence à la seconde ligne. Je trouve un point que je définis avec l'indice 0 parce que c'est le premier point que j'ai trouvé.Je regarde le caractère suivant et je vois que c'est encore un point:

    Donc je fais tab[0]->maillon_indice1 et tab[1]->maillon_indice0.

    Je regarde le caractère suivant jusqu'à la fin de ligne et je vois qu'il n'y a plus de points.

    Donc je vais à la 3eme ligne et je recommence:
    Je vois un point, je lui alloue l'indice 2, je regarde le caractère suivant c'est encore un point(qui aura l'indice 3) donc je fais:

    tab[2]->maillon_indice_3 et tab[3]->maillon_indice_2

    Je regarde le caractère suivant et c'est encore un point(qui aura l'indice 4)donc je continue:

    tab[2]->maillon_indice_3->maillon_indice_4
    tab[3]->maillon_indice-2->maillon_indice_4
    tab[4]->maillon_indice_2->maillon_indice_3

    et etc jusqu'à la fin duc fichier !

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Cela fait plus de 2 semaines et je n'ai pas de réponses !

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 291
    Par défaut
    Voici mon code actualisé, je n'ai pas trop eu de temps pour cause d'autres projets en bdd et outils du web qui me sont plus faciles pour moi et que j'ai fait en priorité.Mais maintenant j'aimerai m'attarder sur ce projet.

    MOn problème est toujours le même:

    ex j'ai un fichier avec :

    .../.

    J'arrive a lier tab[0] aux maillons d'indice 0,1 et 2(représentant les 3 premiers points).

    Mais ce que je n'arrive pas à comprendre c'est comment lier tab[1] et tab[2]aux maillons d'indice 0,1,2 pour modéliser que les 3 points sont sur la meme ligne et qu'ils se succèdent.

    Voici le code:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void construction_graphe_contraintes(int nombre_variables);
    typedef struct maillon maillon;
    struct maillon
    {
    	maillon *suivant;
    	int indice_maillon;
    };
     
    typedef maillon*liste;
     
    int main(void)
    {
    	FILE*grille=fopen("grille.txt","r");
    	if(grille==NULL)
    	{
    		perror("Erreur lors de l'ouverture de la grille");
    		return EXIT_FAILURE;
    	}
    	while(!feof(grille)
    	{
    		lecture_ligne(nombre_variables);
    	}
     
    }
    	//Contraintes sur les lignes
    	lecture_ligne(int nombre_variables)
    	{
    		char caractere;
    		int indice_tableau=0;
    		int indice_m=0;
    		char tmp;
    		int reste_variable=nombre_variables;
    		tmp=fgetc(grille);
     
    		liste tableau_contraintes=(liste)malloc(nombre_variables*sizeof(struct maillon));
    		liste pointeur=(liste)malloc(nombre_variables*sizeof(struct maillon));
    		pointeur=tableau_contraintes[indice_tableau];
     
    		while(tmp!=EOF)
    		{
     
    			while(tmp!="\n")
    			{
    				if(tmp==".")
    				{	
    					liste maillon=(liste)malloc(sizeof(struct maillon));
    					maillon->indice_maillon=indice_m;
    					indice_m++;
    					maillon->suivant=NULL;
    					tmp=fgetc(grille);
    					pointeur->suivant=maillon;
    					pointeur=maillon;
     
    					while(tmp==".")
    					{
    						liste nouveau_maillon=(liste)malloc(sizeof(struct maillon));
    						nouveau_maillon->indice_maillon=indice_m;
    						indice_m++;
    						nouveau_maillon->suivant=NULL;
    						pointeur->suivant=nouveau_maillon;
    						pointeur=nouveau_maillon;
     
    						tmp=fgetc(grille);
    					}
     
    				}
     
    			}
    			tmp=fgetc(grille);
    		}
    	}

Discussions similaires

  1. Probleme sur les listes WD
    Par Godvertomi dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 12/06/2013, 17h18
  2. Réponses: 6
    Dernier message: 16/02/2008, 22h53
  3. MS Access et TQuery (probleme sur les dates)
    Par Djob dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 15h57
  4. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 13h32
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 20h01

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