Ir ao conteúdo
  • Cadastre-se
brdam

C erro na ordenação de lista ligada

Recommended Posts

Programa está inserindo normalmente, mais não está ordenando e nem mostrando os itens ordenados. 

 

obs1: Usando bubblesort

obs2: ordenando primeiro por nome e depois por idade

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct lista
{
	int qtd;
	struct Aluno * inicio;
}lista;

typedef struct Aluno
{
	char nome[30];
	int idade;
	struct Aluno * prox;
}Aluno;

lista * aloca_lista();
Aluno * aloca_aluno();
int inserir(lista *l, char * nome, int idade);
void  mostrar(lista *l);

int main()
{
	char aux[30];
	int i,aux2,aux3,aux4,tam=3,pass,trocou;
	Aluno * aluno[3];
	lista * l1;
	l1 = aloca_lista();
	aux4 = l1->inicio;
	
	int idade;
	char nome[30];
	
	for(i=0; i<3; i++)
	{
		printf("\nDigite o nome do aluno[%d]: ",i+1);
		fflush(stdin);
		gets(nome);
		printf("\nDigite o numero: ");
		fflush(stdin);
		scanf("%d",&idade);
		inserir(l1,nome,idade);
	}
	
	trocou = 1;
	
	for(pass=0; pass<tam-1 && trocou==1; pass++)
	{
		trocou = 0;
		
		for(i=0; i<tam-pass-1; i++)
		{
			if(strcmp(aluno[i]->nome,aluno[i+1]->nome) == 0)
			{
				if(aluno[i]->idade > aluno[i+1]->idade)
				{
					aux2 = aluno[i]->idade;
					aluno[i]->idade = aluno[i]->prox->idade;
					aluno[i]->prox->idade = aux2;
				
					strcpy(aux,aluno[i]->nome);
					strcpy(aluno[i]->nome,aluno[i+1]->nome);
					strcpy(aluno[i+1]->nome,aux);
					trocou = 1;
				}
			}
			else if(strcmp(aluno[i]->nome,aluno[i+1]->nome)>0)
			{
				aux3 = aluno[i]->idade;
				aluno[i]->idade = aluno[i+1]->idade;
				aluno[i+1]->idade = aux3;
				
				strcpy(aux,aluno[i]->nome);
				strcpy(aluno[i]->nome,aluno[i+1]->nome);
				strcpy(aluno[i+1]->nome,aux);
				trocou = 1;
			}
		}
	}
	

	printf("\nmostrando:\n\n");
	
	mostrar(l1);
	
	return 0;
}

lista * aloca_lista()
{
	lista * novo;
	novo = (lista*)malloc(sizeof(lista));
	novo->qtd = 0;
	novo->inicio = NULL;
	return novo;	
}

Aluno * aloca_aluno()
{
	Aluno * novo;
	novo = (Aluno*)malloc(sizeof(Aluno));
	novo->idade = 0;
	strcpy(novo->nome," ");
	novo->prox = NULL;
	return novo;
}

int inserir(lista *l,char * nome, int idade)
{
	Aluno * novo, * aux;
	novo = aloca_aluno();
	novo->idade = idade;
	strcpy(novo->nome,nome);
	
	if(l->inicio == NULL)
	{
		l->inicio = novo;
	}
	else
	{
		aux = l->inicio;
		while(aux->prox != NULL)
		{
			aux = aux->prox;
		}
		aux->prox = novo;
	}
	l->qtd++;
	return 1;
}

void mostrar(lista *l)
{
	Aluno * aux;
	aux = l->inicio;
	while (aux != NULL)
	{
		printf("\nNome: %s",aux->nome);
		printf("\nIdade: %d",aux->idade);
		aux = aux->prox;
	}
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@brdam , oi cara!

Penso que entendi o seu programa... se tivesse documentado estaria certo disso, não é o caso, então tenho vaga 'certeza'.

 

 

DESCRIÇÃO: O programa escrito em linguagem C, solicita do usuário alguns dados cadastrais, após essa tarefa realiza organização, primeiro por critério de nome [ordem alfabética] e em último por idade [ordem crescente]. Os dados são guardados em estrutura de nome Aluno que no termino da organização estão prontos para serem exibidos.

Entrada: Nome do aluno contendo 29 caracteres e sua idade em anos. Esses dados serão digitados pelo usuário.

Saída: Lista contendo os dados cadastrais organizados alfabeticamente e do menor idade até o de maior idade. Tudo exibo no prompt na tela do computador.

Requisito:  Usar algoritmo de ordenação Bubble sort no campo nome e para critério de desempate no campo idade

 

ALGORITMO: O programa [sem nome] tem as seguintes etapas

  1. COMEÇO
  2. Exibir na tela a mensagem solicitando que usuário digite nome do Aluno
  3. Captura nome
  4. Exibir na tela a mensagem solicitando que usuário digite idade do Aluno
  5. Captura idade
  6. Repetir as etapas 2...5 até que X vez aconteça.
  7. Ordenar o cadastro de acordo com requisito
  8. Exibir mensagem de apresentação
  9. Exibir o cadastro ordenado
  10. FIM

 

Confirma-me as informações estão corretas e assinale o que não.

 

Agora o que vejo de mais importante é; não compreendo o porquê o algoritmo de ordenação está realizando tantas cópias, não há necessidade disto, não deveria ser assim. Na minha idealização de lista ligada feriu completamento com princípio de estrutura de dados dinâmico com lista. Seria justificado tantos comandos de cópias se estivesse usando estruturas estáticas, como por exemplo Vetores; Matrizes e etc. Essa última com algumas linhas de código ainda é possível ter um pouco de dinâmica, coisa que você sucateou em Linked List.

 

recomendação para esse código é que; reveja o algoritmo de ordenação Bubble para que se realize fazendo trocas internas a lista sem copiar os dados de Aluno. Não sou professor mais mesmo não sendo sei que isso não está certo. E também documente seu programa, pois nessa altura do campeonato (estrutura é quase reta final dos estudos em C) se espera o código impecável no quesito  indentação e documentação. Imagino-me que na qualidade de teu professor, tiraria muitos pontos pela falta de documentação e por consequência disso também da indentação, apesar de que as duas coisas são diferentes uma espira a outra...

 

Nas palavras do Ph.D McCann da Universidade do Arizona; um programador que não dedica tempo para documentar o seu código, não quer ser um bom programador.

 

 

~~ / ~~

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×