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 :

Problème avec la recursivité et les pointeurs en C


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut Problème avec la recursivité et les pointeurs en C
    Salut !
    Je veux faire un programme qui fait la création d'un arbre ou chaque noeud représente une possibilité de permutation de 0 dans un tableau de 9 entiers, j'explique, un noeud est composté d'un tableau (qui représente une grille 3X3 dans le jeu de Taquin) et d'autre attribut qui nous intéresse pas pour le moment.
    Chaque noeud peut avoir au maximum 4 successeurs (qui contient les changements possibles)

    voila 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
    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
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    #include<stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <windows.h>
     
    /******************************************************************************/
    int start[] = {1,2,3,4,0,5,7,8,6};
    int goal[] = {1,2,3,4,5,6,7,8,0};
    //structure liste entier
    struct elt {
        int val ;
        struct elt *suiv ;
    };
    typedef struct elt* liste;
     
     
    /* Cr?ation d'un nouvel ?l?ment */
    liste creation(int vval)
    {    liste e = NULL ;
        e = (liste) malloc(sizeof(struct elt*));
        if(e!=NULL) {
            e->val = vval ;
            e->suiv = NULL ;
        }
        return e ;
    }
    /*vide ab */
    int vide_l_int(liste* l)
    {    liste q = *l ;
        return(q==NULL);
    }
    /*insert en queu */
    void enfiler_l_int(liste* l,int ve)
    {   liste  e=NULL,q = *l ; ;
        e=creation(ve);
     
        if(q==NULL) {*l =e;}
        else {
     
           while(q->suiv!=NULL) q = q->suiv ;
            q->suiv = e ;
        }
    }
     
     
     
    /*xxxxxxxxxxxx DENILER UN NOEUD DANS LA liste xxxxxxxx*/
    liste defiler_l_int(liste* l)
    {
    liste p=*l, q=p->suiv;
    if(p!=NULL){
                *l=q;
                p->suiv=NULL;
                return p;
                }
    free(p);
    }
     
    //afficher un tableau
    void afficher_tab(int t[])
    {int i;
         for(i=0;i<9;i++)
         {
          if((i%3)==0)   { printf("\n[ %d ]",t[i]);}
     
                 else {printf("[ %d ]",t[i]);}
                 }
         }
     
    //test l'egalite de deux grilles
    int egal_tab(int t1[],int t2[])
    {int i;
    int c=0;
         for(i=0;i<9;i++)
         {if(t1[i]!=t2[i]){c++;}
     
     
         }
         if(c==0) {return 1;}
         else {return 0;}
    }
     
    //permuatation de deux entiers
    void permutaion(int* a,int* b)
    {int* t;
    t=a;
    a=b;
    b=t;
    }
     
    //recherche d'un indice dun entier dans un tableau
    int rech_ind_ent(int t[9],int x)
    	{int ind = 10;
    	int i=0;
    		for (i=0;i<9;i++){
    			if (t[i]==x) ind=i;
    		}
    		return ind;
     
    	}
     
     
    liste Test_permut(int g)
    	{
    	liste pp=NULL;
     
     
    	switch (g)
    	{
    	case 0:
    	{
    		enfiler_l_int(&pp,1);
    		enfiler_l_int(&pp,3);
    	break;}
     
    	case 1:
    	{
    		enfiler_l_int(&pp,0);
    		enfiler_l_int(&pp,2);
    		enfiler_l_int(&pp,4);
    	break;}
     
     
    	case 2:
    	{
    		enfiler_l_int(&pp,1);
    		enfiler_l_int(&pp,5);
    	break;}
     
    	case 3:
    	{
    		enfiler_l_int(&pp,0);
    		enfiler_l_int(&pp,4);
    		enfiler_l_int(&pp,6);
     
    	break;}
     
    	case 4:
    	{
    		enfiler_l_int(&pp,1);
    		enfiler_l_int(&pp,3);
    		enfiler_l_int(&pp,5);
    		enfiler_l_int(&pp,7);
     
    	break;}
     
    	case 5:
    	{
    		enfiler_l_int(&pp,2);
    		enfiler_l_int(&pp,4);
    		enfiler_l_int(&pp,8);
     
    	break;
    	}
     
    	case 6:
    	{
    	enfiler_l_int(&pp,3);
    	enfiler_l_int(&pp,7);
    	break;}
     
    	case 7:
    	{
    	enfiler_l_int(&pp,4);
    	enfiler_l_int(&pp,6);
    	enfiler_l_int(&pp,8);
     
    	break;}
     
    	case 8:
    	{
    	enfiler_l_int(&pp,5);
    	enfiler_l_int(&pp,7);
    	break;}
    	default:{};
    	}
     
    		return pp;
    	}
     
     
    /******************************************************************************/
     
    //structure frontiere
    struct noeudf {
      int grille[9];
      int niv;
      struct noeudf *suiv;
    };
    typedef struct noeudf* frontiere;
     
     
    frontiere creation_nf(int vval[])
    {    frontiere e = NULL ;
        e = malloc(sizeof(struct noeudf));
        e->suiv=NULL;
        if(e!=NULL) {
            int i;
        for(i=0;i<9;i++){e->grille[i] = vval[i] ;}
     
        }
        return e ;
    }
     
     
    /*xxxxxxxxxxxx ENFILER UN NOEUDF DANS LA FRONTIERE xxxxxxxx*/
    void enfiler_f_n(frontiere* l,frontiere e)
    {   frontiere  q = *l ;
     
        if(q==NULL) {*l =e;}
        else {
           while(q->suiv!=NULL) {q = q->suiv ;}
            q->suiv = e ;
     
        }
    }
     
     
    /*xxxxxxxxxxxx DENILER UN NOEUDF DANS LA FRONTIERE xxxxxxxx*/
    frontiere defiler_f_n(frontiere* l)
    {
    frontiere p=*l, q=p->suiv;
    if(p!=NULL){
                *l=q;
                p->suiv=NULL;
                return p;
                }
    free(p);
    }
    //******************************************************
    /******************************************************************************/
    /*structure noeud ab*/
     
    struct noeud {
      int grille[9];
      int niv;
      struct noeud *s1;
      struct noeud *s2;
      struct noeud *s3;
      struct noeud *s4;
    };
    typedef struct noeud  *ab;
    ab creation_ab(int vval[])
    {    ab e = NULL ;
        e = malloc(sizeof(struct noeud));
        e->s1=NULL;
    	e->s2=NULL;
    	e->s3=NULL;
    	e->s4=NULL;
        if(e!=NULL) {
            int i;
        for(i=0;i<9;i++){e->grille[i] = vval[i] ;}
     
        }
        return e ;
    }
     
    //Afficher un arbre
    void affich_ab(ab r)
    {
      if (r != NULL) {printf("\n* * * * * * * * *");
                        afficher_tab(r->grille);}
    if (r->s1 != NULL) {affich_ab(r->s1);}
    if (r->s1 != NULL) {affich_ab(r->s2);}
    if (r->s1 != NULL) {affich_ab(r->s3);}
    if (r->s1 != NULL) {affich_ab(r->s4);}
     
     
     
    }
     
    /*xxxxxxxxxxxx ENFILER UN noeud DANS LA ab xxxxxxxx*/
    void enfiler_n_ab(ab* l,ab e)
    {   ab  q = *l ;
     
        if(q==NULL) {*l =e;}
        else {
           while(q->s1!=NULL) {q = q->s1 ;}
            q->s1 = e ;
     
        }
    }
     
     
    /*xxxxxxxxxxxx DENILER UN noeud DANS LA ab xxxxxxxx*/
    ab defiler_n_ab(ab* l)
    {
    ab p=*l, q=p->s1;
    if(p!=NULL){
                *l=q;
                p->s1=NULL;
                return p;
                }
    free(p);
    }
    /*vide ab */
    int vide_l_n(ab l)
    {
     
        return(l==NULL) ;
     
    }
     
    //Successeur dun noeud
    void successeur(ab* r)
    {
        ab q=*r;
     if(q!=NULL)
     {
     
     liste pp=Test_permut(rech_ind_ent(q->grille,0));
     
     
     
     if(pp!=NULL)
     {
         liste ds1=defiler_l_int(&pp);
         if(ds1!=NULL)
         {q->s1=creation_ab(q->grille);
         q->s1->niv=q->niv+1;
         q->s1->grille[rech_ind_ent(q->s1->grille,0)]=q->s1->grille[ds1->val];
         q->s1->grille[ds1->val]=0;
             }
             liste ds2=defiler_l_int(&pp);
         if(ds2!=NULL)
         {q->s2=creation_ab(q->grille);
         q->s2->niv=q->niv+1;
         q->s2->grille[rech_ind_ent(q->s2->grille,0)]=q->s2->grille[ds2->val];
         q->s2->grille[ds2->val]=0;
             }
          liste ds3=defiler_l_int(&pp);
         if(ds3!=NULL)
         {q->s3=creation_ab(q->grille);
         q->s3->niv=q->niv+1;
         q->s3->grille[rech_ind_ent(q->s3->grille,0)]=q->s3->grille[ds3->val];
         q->s3->grille[ds3->val]=0;
             }
                   liste ds4=defiler_l_int(&pp);
         if(ds4!=NULL)
         {q->s4=creation_ab(q->grille);
         q->s4->niv=q->niv+1;
         q->s4->grille[rech_ind_ent(q->s4->grille,0)]=q->s4->grille[ds4->val];
         q->s4->grille[ds4->val]=0;
             }
     
        }
    }
     
     
     
    if((q->s1!=NULL)&&(egal_tab(q->s1->grille,goal)==0)){successeur(&q->s1);}
     
     
     
     
         }
     
    //******************************************
    /*PROGRAMME PRINCIPAL*/
    main()
    {
    ab n=creation_ab(start);
    n->niv=0;
    successeur(&n);
    affich_ab(n);
     
     
    getch();
    }
    J'ai un problème dans l'appel récursive au niveau de la procédure successeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((q->s1!=NULL)&&(egal_tab(q->s1->grille,goal)==0)){successeur(&q->s1);}
    M'ais j'arrive pas à comprendre pourquoi ?

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef struct elt* liste;
    Salut
    Déjà ça c'est pas à faire. Masquer un pointeur dans un nom de type c'est le crash assuré.

    Citation Envoyé par mohsenuss91 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    frontiere defiler_f_n(frontiere* l)
    {
    frontiere p=*l, q=p->suiv;
    if(p!=NULL){
                *l=q;
                p->suiv=NULL;
                return p;
                }
    free(p);
    Donc ici tu fais un free() sur un pointeur NULL...

    Citation Envoyé par mohsenuss91 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //permuatation de deux entiers
    void permutaion(int* a,int* b)
    {int* t;
    t=a;
    a=b;
    b=t;
    }
    Totalement inefficace. Tu ne permutes que les copies des adresses et non les entiers pointés par ces adresses !!!

    Citation Envoyé par mohsenuss91 Voir le message
    J'ai un problème dans l'appel récursive au niveau de la procédure successeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((q->s1!=NULL)&&(egal_tab(q->s1->grille,goal)==0)){successeur(&q->s1);}
    M'ais j'arrive pas à comprendre pourquoi ?
    Ben moi non plus. Ton code est illisible. Des noms de variable comme "s1", "a3", "q" ; des commentaires tellement absent que ça en devient éblouissant et une indentation à chier. Mon conseil: tout jeter et recommencer propre...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    Désolé , J'ai pas bien compris ça veux dire quoi masquer un pointeur ?

    free(p) c'est pour supprimer le nœud défilé

    s1,s2,s3,s4 c'est pour successeur1,successeur2,successeur3,successeur4.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    Désolé , J'ai pas bien compris ça veux dire quoi masquer un pointeur ?
    Au lieu de déclarer struct elt *toto et bien montrer au lecteur que "toto" est un pointeur, on déclare maintenant liste toto. Et là, on croit que "toto" est une entité alors qu'en fait ça reste un pointeur vers cette entité.

    Par exemple regarde ce code
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct {
        char nom[10];
       char prenom[10];
    } t_personne;
     
    typedef t_personne* t_liste;

    Ensuite, tu as
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
         t_personne toto;
         t_liste titi;
         ...
    }

    Apparemment, toto et titi sont des variables de même nature (l'une de type "t_personne", l'autre de type "t_liste"). Sauf que l'une d'entre elles est un pointeur. Et sans remonter au début de ton code tu es incapable de savoir laquelle...

    Citation Envoyé par mohsenuss91 Voir le message
    free(p) c'est pour supprimer le nœud défilé
    Tu as lu ma remarque ? Non seulement tu cherches à libérer une zone mémoire que tu as allouée 3 lignes au dessus (utilité de la chose ???) mais en plus à cet endroit là p vaut NULL. Alors free(NULL) ça reste autorisé mais ça n'a aucun effet !!!

    Citation Envoyé par mohsenuss91 Voir le message
    s1,s2,s3,s4 c'est pour successeur1,successeur2,successeur3,successeur4.
    Non mais c'est bon. On te demande pas de détailler le pourquoi de tes noms moisis mais de faire l'effort, au lieu de coder comme un ouf, de réflechir à ce que tu fais quand tu le fais ; de prendre le temps de te dire "à quoi sert cette variable, comment vais-je la nommer pour que son nom soit associé à sa fonction afin que mon code soit plus compréhensible". Et accessoirement indenter proprement ton code serait un plus.

    Voici 2 codes faisant le même travail (ils viennent d'un autre topic mais peuvent servir d'exemple ici)

    Code1
    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
     
    #define SZ_ALLOC (512)
    #define MAXPATHLEN (512)
     
    typedef struct {
    				char *nom;
    				size_t sz_alloc;
    			size_t len;
    } t_chemin;
     
    void init_chemin(t_chemin* const chemin)
    {
    					chemin->nom=NULL;
    	chemin->sz_alloc=0;
    			chemin->len=0;
    }
     
    char* append_chemin(t_chemin* const chemin, const char const *nom)
    {
    while ((chemin->len + strlen(nom) + sizeof(char)) > chemin->sz_alloc)
    		{
    char *new;
    			chemin->sz_alloc+=SZ_ALLOC;
    if ((new=realloc(chemin->nom, (chemin->sz_alloc + 1) * sizeof(char))) == NULL)
    	return NULL;
    	chemin->nom=new;
    		}
     
    		(chemin->len != 0 ?strcat :strcpy)(chemin->nom, "/");
    			strcat(chemin->nom, nom);
     
    	chemin->len=strlen(chemin->nom);
     
    				return chemin->nom;
    }
     
    void pop_chemin(t_chemin* const chemin)
    {
    		char *pt;
     
    	if ((pt=strrchr(chemin->nom, '/')) != NULL)
    {
    *pt='\0';
     
    				chemin->len=strlen(chemin->nom);
    		}
    }
     
    void cibler(char* const nom)
    {
    			t_chemin chemin;
    				char *strtok_mem;
    				char *split;
    				char cwd[MAXPATHLEN + 1];
     
    init_chemin(&chemin);
     
    if (nom[0] != '/')
    				{
    			getcwd(cwd, MAXPATHLEN);
     
    	split=NULL;
    while ((split=strtok_r(split == NULL ?cwd :NULL, "/", &strtok_mem)) != NULL)
    {
    	if (append_chemin(&chemin, split) == NULL)
    fprintf(stderr, "Erreur alloc(%s) - Abandon !!!", split);
    			}
    				}
     
    			split=NULL;
    	while ((split=strtok_r(split == NULL ?nom :NULL, "/", &strtok_mem)) != NULL)
    				{
    			if (strcmp(split, ".") == 0)
    		continue;
     
    				if (strcmp(split, "..") == 0)
    		{
    	pop_chemin(&chemin);
    			continue;
    }
     
    		if (append_chemin(&chemin, split) == NULL)
    				fprintf(stderr, "Erreur alloc(%s) - Abandon !!!", split);
    }
     
    		printf("%s\n", chemin.nom);
     
    		free(chemin.nom);
    				init_chemin(&chemin);
    }
     
    int main(int argc, char *argv[])
    {
    char **pt_arg;
    		for (pt_arg=argv+1; *pt_arg; pt_arg++)
    		cibler(*pt_arg);
    }

    Code2
    Code c : 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
    // Donne le chemin absolu d'un chemin donné en argument
    // Prend en compte le répertoire courant pour les noms relatifs
    // Supprime les noms inutiles (comme ".")
    // Supprime le dernier nom ajouté quand il tombe sur ".."
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
     
    #define SZ_ALLOC			(512)
    #define MAXPATHLEN			(512)		// Devrait être défini dans unistd.h mais, bizarrement, je ne l'y trouve pas...
     
    typedef struct {
    	char *nom;
    	size_t sz_alloc;
    	size_t len;
    } t_chemin;
     
    // Initialisation chemin
    void init_chemin(t_chemin* const chemin)
    {
    	chemin->nom=NULL;
    	chemin->sz_alloc=0;
    	chemin->len=0;
    }
     
    // Ajout nom au chemin
    char* append_chemin(t_chemin* const chemin, const char const *nom)
    {
    	// Tant que la taille du nom total dépasse la taille allouée (ne pas oublier le '/')
    	while ((chemin->len + strlen(nom) + sizeof(char)) > chemin->sz_alloc)
    	{
    		// Agrandissement nom
    		char *new;
    		chemin->sz_alloc+=SZ_ALLOC;
    		if ((new=realloc(chemin->nom, (chemin->sz_alloc + 1) * sizeof(char))) == NULL)
    			return NULL;
    		chemin->nom=new;
    	}
     
    	// Concaténation nom
    	(chemin->len != 0 ?strcat :strcpy)(chemin->nom, "/");
    	strcat(chemin->nom, nom);
     
    	// Mise à jour longueur nom
    	chemin->len=strlen(chemin->nom);
     
    	// On renvoie le nom créé (permet de détecter l'erreur de malloc)
    	return chemin->nom;
    }
     
    // Suppression dernier nom
    void pop_chemin(t_chemin* const chemin)
    {
    	char *pt;
     
    	// Recherche dernier "/"
    	if ((pt=strrchr(chemin->nom, '/')) != NULL)
    	{
    		// Suppression fin chemin
    		*pt='\0';
     
    		// Mise à jour longueur nom
    		chemin->len=strlen(chemin->nom);
    	}
    }
     
    // Chemin
    void cibler(char* const nom)
    {
    	t_chemin chemin;
    	char *strtok_mem;
    	char *split;
    	char cwd[MAXPATHLEN + 1];
     
    	// Initialisation chemin
    	init_chemin(&chemin);
     
    	// Si le nom ne commence pas par '/'
    	if (nom[0] != '/')
    	{
    		// Récupération du chemin courant
    		getcwd(cwd, MAXPATHLEN);
     
    		// Découpage du chemin courant
    		split=NULL;
    		while ((split=strtok_r(split == NULL ?cwd :NULL, "/", &strtok_mem)) != NULL)
    		{
    			// Ajout du nom au chemin
    			if (append_chemin(&chemin, split) == NULL)
    				fprintf(stderr, "Erreur alloc(%s) - Abandon !!!", split);
    		}
    	}
     
    	// Découpage du nom
    	split=NULL;
    	while ((split=strtok_r(split == NULL ?nom :NULL, "/", &strtok_mem)) != NULL)
    	{
    		// Si le nom est "."
    		if (strcmp(split, ".") == 0)
    			// On le passe
    			continue;
     
    		// Si le nom est ".."
    		if (strcmp(split, "..") == 0)
    		{
    			// On supprime le dernier noeud et on passe
    			pop_chemin(&chemin);
    			continue;
    		}
     
    		// Ajout du nom au chemin
    		if (append_chemin(&chemin, split) == NULL)
    			fprintf(stderr, "Erreur alloc(%s) - Abandon !!!", split);
    	}
     
    	// Affichage chemin
    	printf("%s\n", chemin.nom);
     
    	// Libération chemin
    	free(chemin.nom);
    	init_chemin(&chemin);
    }
     
    int main(int argc, char *argv[])
    {
    	char **pt_arg;
    	for (pt_arg=argv+1; *pt_arg; pt_arg++)
    		cibler(*pt_arg);
    }

    Ce sont les deux mêmes mais pour le premier j'ai supprimé tous les commentaires et, excepté pour les définitions de types et de fonctions (et leurs accolades ouvrante et fermante) fait commencer chaque ligne par un nombre de tabulations aléatoire (compris entre 0 et 5). Lequel préfères-tu lire ???

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    Voila la nouvelle version du 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
    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
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    #include <stdio.h>
    #include <stdlib.h>
     
    /******************************************************************************/
    int start[] = {1,2,3,4,0,5,7,8,6};
    int goal[] = {1,2,3,4,5,6,7,8,0};
     
     
    //structure Liste d'entiers
    typedef struct sElt
    {
        int val ;
        struct sElt *suiv ;
    } Elt;
    typedef Elt* Liste;
     
     
    /* Creation d'un nouvel element qui va contenir un entier*/
    Liste creation(int vval)
    {
        Liste e =  malloc(sizeof(*e));
        if(e!=NULL)
        {
            e->val = vval ;
            e->suiv = NULL ;
        }
        return e ;
    }
     
    /*inserer un element en queu de la Liste d'entiers*/
    void emfiler_l_int(Liste* l,int ve)
    {
        Liste  e=NULL,q = *l ; ;
        e=creation(ve);
     
        if(q==NULL)
        {
            *l =e;
        }
        else
        {
     
            while(q->suiv!=NULL) q = q->suiv ;
            q->suiv = e ;
        }
    }
     
    //inserer un element en tete de la Liste d'entiers
    void empiler_l_int(Liste* l,int ve)
    {
        Liste  e=creation(ve),q = *l ; ;
     
        if(q==NULL)
        {
            *l =e;
        }
        else
        {
            e->suiv=q;
            *l =e;
        }
    }
     
     
    //Defiler un element de la tete de la Liste d'entiers
    Liste defiler_l_int(Liste* l)
    {
        Liste p=*l, q=p->suiv;
        if(p!=NULL)
        {
            *l=q;
            p->suiv=NULL;
        }
        return p;
        free(p);
    }
     
    //afficher un tableau d'entiers
    void afficher_tab(int t[])
    {
        int i;
        for(i=0; i<9; i++)
        {
            if((i%3)==0)
            {
                printf("\n[ %d ]",t[i]);
            }
            else
            {
                printf("[ %d ]",t[i]);
            }
        }
    }
     
    //test l'egalite de deux tableaux d'entier
    int egal_tab(int t1[],int t2[])
    {
        int i;
        int c=0;
        for(i=0; i<9; i++)
        {
            if(t1[i]!=t2[i])
            {
                c++;
            }
        }
        if(c==0)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
     
    //permuatation de deux entiers
    void permutation(int* a, int* b)
    {
        int t;
        t=*a;
        *a=*b;
        *b=t;
    }
     
    //rechercher l'indice d'un entier dans un tableau
    int rech_ind_ent(int t[9],int x)
    {
        int ind = 10;
        int i=0;
        for (i=0; i<9; i++)
        {
            if (t[i]==x) ind=i;
        }
        return ind;
     
    }
     
    //tester les permutation possible de la case qui à l'indice comme parametre dans la fonction
    Liste Test_permut(int g)
    {
        Liste pp=NULL;
     
        if((g<9)&&(g>-1))
        {
            switch (g)
            {
            case 0:
            {
                emfiler_l_int(&pp,1);
                emfiler_l_int(&pp,3);
                break;
            }
     
            case 1:
            {
                emfiler_l_int(&pp,0);
                emfiler_l_int(&pp,2);
                emfiler_l_int(&pp,4);
                break;
            }
     
            case 2:
            {
                emfiler_l_int(&pp,1);
                emfiler_l_int(&pp,5);
                break;
            }
     
            case 3:
            {
                emfiler_l_int(&pp,0);
                emfiler_l_int(&pp,4);
                emfiler_l_int(&pp,6);
     
                break;
            }
     
            case 4:
            {
                emfiler_l_int(&pp,1);
                emfiler_l_int(&pp,3);
                emfiler_l_int(&pp,5);
                emfiler_l_int(&pp,7);
     
                break;
            }
     
            case 5:
            {
                emfiler_l_int(&pp,2);
                emfiler_l_int(&pp,4);
                emfiler_l_int(&pp,8);
     
                break;
            }
     
            case 6:
            {
                emfiler_l_int(&pp,3);
                emfiler_l_int(&pp,7);
                break;
            }
     
            case 7:
            {
                emfiler_l_int(&pp,4);
                emfiler_l_int(&pp,6);
                emfiler_l_int(&pp,8);
     
                break;
            }
     
            case 8:
            {
                emfiler_l_int(&pp,5);
                emfiler_l_int(&pp,7);
                break;
            }
            default:
            {};
            }
        }
        return pp;
    }
     
     
    //*****************************************************************************
    //structure Noeud Abr
    typedef struct sNoeud
    {
        int grille[9];
        int niv;
        struct sNoeud* pr;
        struct sNoeud* s1;
        struct sNoeud* s2;
        struct sNoeud* s3;
        struct sNoeud* s4;
    } Neoud;
    typedef Neoud* Abr;
     
     
    //creation d'un Noeud
    Abr creation_Abr(int vval[])
    {
        Abr e  = malloc(sizeof(*e));
        e->pr=NULL;
        e->s1=NULL;
        e->s2=NULL;
        e->s3=NULL;
        e->s4=NULL;
        if(e!=NULL)
        {
            int i;
            for(i=0; i<9; i++)
            {
                e->grille[i] = vval[i] ;
            }
        }
        return e ;
    }
     
    //Afficher un arbre
    void affich_Abr(Abr r)
    {
        if (r != NULL)
        {
            printf("\n* * * * * * * * *");
            afficher_tab(r->grille);
        }
     
        if (r->s1 != NULL)
        {
            affich_Abr(r->s1);
        }
        if (r->s2 != NULL)
        {
            affich_Abr(r->s2);
        }
        if (r->s3 != NULL)
        {
            affich_Abr(r->s3);
        }
        if (r->s4 != NULL)
        {
            affich_Abr(r->s4);
        }
    }
     
    //ENFILER UN Noeud DANS L'Abr
    void emfiler_n_Abr(Abr* l,int vval[])
    {
        Abr  q = *l ;
        Abr e  = creation_Abr(vval);
        if(q==NULL)
        {
            *l =e;
        }
        else
        {
            while(q->s1!=NULL)
            {
                q = q->s1 ;
            }
            q->s1 = e ;
        }
    }
     
    //ENPILER UN Noeud DANS l'Abr
    void empiler_n_Abr(Abr* l,int vval[])
    {
        Abr  q = *l ;
        Abr e  = creation_Abr(vval);
        if(e!=NULL)
        {
            int i;
            for(i=0; i<9; i++)
            {
                e->grille[i] = vval[i] ;
            }
        }
        if(q==NULL)
        {
            *l =e;
        }
        else
        {
            e->s1 = q ;
            q->pr=e;
            *l =e;
        }
    }
     
    //DEFILER UN Noeud DANS L'Abr
    Abr defiler_n_Abr(Abr* l)
    {
        Abr p=*l, q=p->s1;
        if(p!=NULL)
        {
            *l=q;
            p->s1=NULL;
        }
        return p;
        free(p);
    }
     
     
    //Creer les Successeurs dun Noeud
    void successeur(Abr* r)
    {
        Abr q=*r;
     
        if(q!=NULL)
        {
            Liste pp=Test_permut(rech_ind_ent(q->grille,0));
     
            if(pp!=NULL)
            {
                q->s1=creation_Abr(q->grille);
                q->s1->niv=q->niv+1;
                q->s1->pr=q;
                permutation(&q->s1->grille[rech_ind_ent(q->s1->grille,0)],&q->s1->grille[pp->val]);
            }
            if(pp->suiv!=NULL)
            {
     
                q->s2=creation_Abr(q->grille);
                q->s2->niv=q->niv+1;
                q->s2->pr=q;
                permutation(&q->s2->grille[rech_ind_ent(q->s2->grille,0)],&q->s2->grille[pp->suiv->val]);
            }
     
            if(pp->suiv->suiv!=NULL)
            {
                q->s3=creation_Abr(q->grille);
                q->s3->niv=q->niv+1;
                q->s3->pr=q;
                permutation(&q->s3->grille[rech_ind_ent(q->s3->grille,0)],&q->s3->grille[pp->suiv->suiv->val]);
            }
            if(pp->suiv->suiv->suiv!=NULL)
            {
                q->s4=creation_Abr(q->grille);
                q->s4->niv=q->niv+1;
                q->s4->pr=q;
                permutation(&q->s4->grille[rech_ind_ent(q->s4->grille,0)],&q->s4->grille[pp->suiv->suiv->suiv->val]);
            }
            /*
            if((q->s1!=NULL)&&(egal_tab(q->s1->grille,goal)==0)){printf("\n");
                                                                successeur(q->s1);
                                                                }
            */
        }
    }
     
     
    /*PROGRAMME PRINCIPAL*/
    int main()
    {
        Abr l=creation_Abr(start);
        successeur(&l);
     
        affich_Abr(l);
        getch();
    }

    Le problème est dans la procedure "successeur()" dans la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((q->succ[0]!=NULL)&&(egal_tab(q->succ[0]->grille,goal)==0)){successeur(&q->succ[0]);}
    Si le noeud à un successeur non NULL et la grille du noeud et différence de goal alors on fais un appel récursive de successeur ce dernier..

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    Retourne voir des tutos sur le C, il semble que tu n'ais pas compris ou assimilé les principes de base.

    Indente mieux ton code, sinon personne ne viendras t'aider.
    Note de modération : le code a été indenté correctement.

    Renomme bien tes variable, le fait d'avoir titi1,titi2,titi3 n'est pas une bonne solution.
    Tu ne devrais pas avoir des variable avec des nombres dedans à moins que ta conception ne soit pas efficace.

    Quand tu as un soucis de logique, éteinds ton ordinateur, code "en français" la logique de ton programme sur un papier, rallume ton ordinateur et vérifie que ce que tu as codé correspond bien à ce que tu as écris.

    Tu t'appercevras alors que 90% des problèmes que tu pensais avoir sont un oubli ou une différence entre ta feuille et ton code.

Discussions similaires

  1. Problème avec la fonction pow(les puissance)
    Par Clément76 dans le forum C
    Réponses: 10
    Dernier message: 04/10/2006, 12h44
  2. Réponses: 2
    Dernier message: 02/08/2006, 16h46
  3. [Tableaux] Problème avec un array et les pseudo frame
    Par azerty53 dans le forum Langage
    Réponses: 6
    Dernier message: 10/05/2006, 14h57
  4. Problème avec l'unicode et les exceptions
    Par Rafy dans le forum C++
    Réponses: 5
    Dernier message: 07/02/2006, 00h52
  5. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08

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