Publicado por Listeiro 037 em (última atualização em 22/06/2012) [ 2017 hits ]
Login: Listeiro 037, 195836 pontos
Publicado por Listeiro 037 em 20/06/2012
Changelog: Este exemplo usa a função realloc() no lugar da recriação com um ponteiro temporário e a função malloc()/calloc().
A função realloc() recebe o ponteiro de uma alocação previamente feita e o tamanho da nova alocação, devolvendo um ponteiro para o espaço redimensionado.
Sem o truque de ser criada uma variável auxiliar para facilitar a cópia de elementos.
A funço realloc() não serve para uma primeira alocação porque se for feita tentativa, ela interpretará o endereço do parâmetro como se algo já estivesse alocado ali e que não está. Por exemplo, para um ponteiro com valor 0 (zero), será tentada uma alocação no endereço número zero da memória.
[code]#include <stdio.h>
#include <stdlib.h>
unsigned int part (unsigned int n) {
static unsigned int tam = 0;
static unsigned int *tab;
if (n==-1 && tab!=NULL) {
free (tab);
tab = NULL;
tam = 0;
return 0;
}
if (tam<4)
tab = (unsigned int *) calloc ((n<4?4:n+1),sizeof(unsigned int));
if (tab==NULL) {
puts("Erro de alocacao");
exit (1);
}
*(tab+0) = 1;
*(tab+1) = 1;
*(tab+2) = 2;
*(tab+3) = 3;
tam = 3;
if (tam<n && 4<n) {
tab = (unsigned int *) realloc (tab,(n<4?4:n+1)*sizeof(unsigned int));
if (tab==NULL) {
puts("Erro de realocacao");
exit (1);
}
tam = n;
}
if (n<0) return 0;
if (n<=3) return *(tab+n);
unsigned int i=0, j=0;
unsigned int p=0;
unsigned int k, s;
if (*(tab+n))
return *(tab+n);
else {
for (k=1,s=1;i<n||j<n;k++,s=-s) {
i = (3*k*k-k)/2;
j = (3*k*k+k)/2;
if (i<=n) p += s * ((*(tab+(n-i))==0)?part(n-i):*(tab+(n-i)));
if (j<=n) p += s * ((*(tab+(n-j))==0)?part(n-j):*(tab+(n-j)));
}
*(tab+n) = p;
}
return p;
}
int main (void) {
printf ("particao de %3u = %15u\n", 30, part(30));
printf ("particao de %3u = %15u\n", 60, part(60));
printf ("particao de %3u = %15u\n", 45, part(45));
printf ("particao de %3u = %15u\n", 90, part(90));
printf ("particao de %3u = %15u\n", 120, part(120));
printf ("particao de %3u = %15u\n", 105, part(105));
part(-1);
return 0;
}[/code]
Semi LS
Beer.h
Estrutura de dados: Lista dinâmica duplamente encadeada
Minishell
Jogo Simon (Genius) - com gráficos