Solução: Problema da seqüência de algarismos agrupados com ordenação (Jadson Nunes)

From AdonaiMedrado.Pro.Br
Jump to: navigation, search
#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;
}