Liste chainé bugé

Résolu
armasousou Messages postés 1351 Statut Membre -  
armasousou Messages postés 1351 Statut Membre -
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 482 Statut Membre 23
 
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 1351 Statut Membre 83
 
Trop simple et dans ce cas je laurai fait en scheme pas en c ^^
0