Liste chainé bugé

Résolu/Fermé
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 - 12 févr. 2013 à 23:04
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 - 13 févr. 2013 à 13:53
Bonjour à tous,

Je programmais la fonction d'ackerman en algo pour le "fun" et mon programme se plante je comprend pas pourquoi ><

La fonction d'ackerman est défini par A(m, n)
Si m = 0 => A(m,n) = n+1
Si n = 0 => A(m,n) = A(m-1, 1)
Sinon A(m,n) = A(m-1, A(m, n-1))


J'ai pris le programme par une liste chainé avec deux int, un element suivant et un precedant.

Voila mon programme :

#include <stdio.h> 
#include <stdlib.h> 

typedef struct sA{ 
int m; 
int n; 
struct sA* next; 
struct sA* prev; 
}Ack; 

Ack* allouer(int, int); 
void calc(Ack*); 
void aff(Ack); 

int main(int argc, char **argv) 
{ 
int m, n, i, j; 
Ack* A; 

//~ printf("Donne ton m et n\n"); 
//~ scanf("%d", &m); 
//~ scanf("%d", &n); 

m=2; 
n=1; 

A = allouer(m, n); 

while( A->m != 0 ) 
{ 
Ack* tmp; 

aff(*A); 
tmp = A; 

while(tmp->next != NULL) 
{ 
tmp = tmp->next; 
} 
calc(tmp); 
} 

printf("\n"); 
printf("Ton Ackerman (%d,%d) est égal à %d :)\n", m, n, A->n); 

return 0; 
} 

Ack* allouer(int m, int n) 
{ 
Ack* pA; 
pA = malloc(sizeof(Ack)); 
pA->m=m; 
pA->n=n; 
pA->next = NULL; 
pA->prev = NULL; 
return pA; 
} 

void calc(Ack* pA) 
{ 
int m = pA->m; 
int n = pA->n; 

if( n == 0	) 
{ 
pA->m = m -1; 
pA->n = 1; 
} 
else if( m == 0 ) 
{ 
pA->prev->n = n+1; 
pA->prev->next = NULL; 
free(pA); 
} 
else 
{ 
pA->next = allouer(m, n-1); 
pA->next->prev = pA; 
pA->m =m-1; 
} 
} 

void aff(Ack A) 
{ 
int j, i=0; 

while(A.next != NULL) 
{ 
printf("A(%d, ", A.m);	
i++; 
A= *(A.next); 
} 

printf("A(%d, %d", A.m, A.n);	
i++; 

for(j=0 ; j<i ; j++) 
{ 
printf(")"); 
} 
printf("\n"); 
} 
A voir également:

2 réponses

ajp55 Messages postés 426 Date d'inscription dimanche 31 juillet 2011 Statut Membre Dernière intervention 17 février 2015 23
13 févr. 2013 à 11:14
qu'est ce que tu faire exactement? calculer la valeur de akerman pour deux valeur données? pourquoi ne pas simplement utilisé une fonction recursive??
0
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
13 févr. 2013 à 13:53
Trop simple et dans ce cas je laurai fait en scheme pas en c ^^
0