Liste chainé bugé

Résolu
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"); 
} 

2 réponses

  1. 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??
    1. Trop simple et dans ce cas je laurai fait en scheme pas en c ^^