Solução: Problema da seqüência de algarismos agrupados com ordenação (Jadson Nunes)
From AdonaiMedrado.Pro.Br
#include <stdio.h> #include <stdlib.h> typedef struct agrupStruct{ int indice; int algarismos[10]; struct agrupStruct *prox; } agrupamento; void insereAgrupamento (agrupamento **a, int indice, unsigned long int n); int main (){ int quant, indice, i, j; unsigned long int num; // Usando undigned long int porque é um numero >9 e pode ter 25 algarismos agrupamento *agrup; scanf("%d", &quant); // Loop para ler o numero e inserir no agrupamento de forma ordenada. agrup = NULL; for (quant; quant > 0; quant--){ scanf("%lu", &num); indice = num%10; num /= 10; insereAgrupamento (&agrup, indice, num); } // Loop para imprimir o agrupamento. while (agrup) { printf ("%d.", agrup->indice); for (i = 0; i < 10; i++){ for (j = agrup->algarismos[i]; j > 0; j--){ printf("%d", i); } } printf("\n"); agrup = agrup->prox; } return 0; } /* Função que recebe o agrupamento, verifica se o indice que estou tentando inserir já está no agrupamento. Se já existir indice então a função só insere os algarismos no agrupamento, senão ele cria um novo registro no agrupamento e insere os algarismos. */ void insereAgrupamento (agrupamento **agrup, int indice, unsigned long int n) { agrupamento *pos, *ant, *aux; int i; if (*agrup){ ant = pos = *agrup; while (pos){ if (pos->indice < indice){ ant = pos; pos = pos->prox; } else if (pos->indice == indice){ while (n > 0){ i = n%10; pos->algarismos[i]++; n /= 10; } return; } else { aux = (agrupamento *) malloc (sizeof(agrupamento)); aux->indice = indice; for (i = 0; i < 10; i++){ aux->algarismos[i] = 0; } while (n > 0){ i = n%10; aux->algarismos[i]++; n /= 10; } if (ant != pos){ ant->prox = aux; aux->prox = pos; } else { *agrup = aux; aux->prox = pos; } return; } } aux = (agrupamento *) malloc (sizeof(agrupamento)); aux->indice = indice; for (i = 0; i < 10; i++){ aux->algarismos[i] = 0; } while (n > 0){ i = n%10; aux->algarismos[i]++; n /= 10; } ant->prox = aux; aux->prox = pos; return; } aux = (agrupamento *) malloc (sizeof(agrupamento)); aux->indice = indice; for (i = 0; i < 10; i++){ aux->algarismos[i] = 0; } while (n > 0){ i = n%10; aux->algarismos[i]++; n /= 10; } aux->prox = *agrup; *agrup = aux; return; }