Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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.

 

 

~~ / ~~

 

Editado por AnsiC

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






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

×