I was able to come up with this:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int numero_nodes(void);
int comparar_nome(const void *, const void *);
void remover_newline(char *); /* função para remover o \n do final do array */
void ordenar_nome(const int);
struct dados {
char matricula[6]; /* a função fgets() vai ler até 6 - 1 (o que é 5) */
char nome[41]; /* mesma coisa aqui... serão lidos até 40 caracteres */
char curso[21]; /* serão lidos 20 caracteres */
char nota[3]; /* serão lidos 2 caracteres */
struct dados *proximo;
};
struct dados *primeiro = NULL;
int main(void)
{
int nodes;
char ch;
char linha[41];
FILE *dados;
struct dados *novo;
struct dados *guia;
dados = fopen("dados.txt", "r");
if(dados == NULL){
printf("dados.txt - arquivo desconhecido\n");
getchar();
exit(1);
}
while(fgets(linha, sizeof(linha), dados) != NULL){
novo = (struct dados *)malloc(1 * sizeof(*novo));
if(novo == NULL){
printf("Erro alocando memoria...");
getchar();
exit(1);
}
novo->proximo = NULL;
remover_newline(linha);
strcpy(novo->matricula, linha);
fgets(linha, sizeof(linha), dados);
remover_newline(linha);
strcpy(novo->nome, linha);
fgets(linha, sizeof(linha), dados);
remover_newline(linha);
strcpy(novo->curso, linha);
fgets(linha, sizeof(linha), dados);
remover_newline(linha);
strcpy(novo->nota, linha);
/* pula a linha em branco */
fgets(linha, sizeof(linha), dados);
if(primeiro == NULL)
primeiro = novo;
else{
guia = primeiro;
while(guia->proximo != NULL)
guia = guia->proximo;
guia->proximo = novo;
}
}
fclose(dados);
printf("Arquivo lido...\n\n");
printf("Ordenar por\n");
printf("[1] Nome\n");
printf("[2] Nota\n");
printf("> ");
ch = getchar();
nodes = numero_nodes();
if(ch == '1')
ordenar_nome(nodes);
/*else
ordenar_nota();*/
return 0;
}
void remover_newline(char *linha)
{
char *ptr;
ptr = strchr(linha, '\n');
if(ptr != NULL)
*ptr = '\0';
}
int numero_nodes(void)
{
int quantidade = 0;
struct dados *guia;
guia = primeiro;
while(guia->proximo != NULL){
++quantidade;
guia = guia->proximo;
}
return quantidade;
}
void ordenar_nome(const int nodes)
{
struct dados *guia;
qsort((void *)primeiro, nodes, sizeof(*primeiro) * nodes, comparar_nome);
guia = primeiro;
while(guia->proximo != NULL){
printf("%s\n", guia->matricula);
printf("%s\n", guia->nome);
printf("%s\n", guia->curso);
printf("%s\n\n", guia->nota);
guia = guia->proximo;
}
}
int comparar_nome(const void *nome1, const void *nome2)
{
return strcmp(((dados *)nome1)->nome, ((dados *)nome2)->nome);
}
When I choose option number 1 (sort by name), here's the output:
Code:
Arquivo lido...
Ordenar por
[1] Nome
[2] Nota
> 1
════44
a da Silva Sauro
Here's the file the program reads:
Code:
20451
Denis Rocha da Silva
Arquitetura Arquiter
5
98364
Tom Hanks
Teatro
38
44076
Nicolas Cage
Futebol
44
10902
Sabrina da Silva Sauro
Basquete
3
12008
Charles Petzold
Tiro ao alvo
12
I really don't know what is wrong. Help me fix my program please. Thanks.