Continuando com a abordagem de
typedef struct, apresento mais alguns exemplos e um em especial que é o da definição de um
node em uma lista ligada.
Na estrutura
No, são usados ponteiros do tipo
void, pois não sabemos que tipo de estrutura será usado na aplicação.
Para testar a lista ligada, foram usados exemplos com estruturas pre-definidas:
Paciente e
Salario.
No caso de
strings, também é apresentado um exemplo de lista com os nomes dos dias da semana sem haver a necessidade de definir previamente uma estrutura.
A seguir o código na linguagem
C Ansi:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// exemplo de dados estruturados e algumas funções relacionadas
typedef struct{
int prontuario;
char nome[40];
int idade;
char rg[13];
} Paciente;
Paciente* criaPaciente( int prontuario, char *nome, int idade, char *rg ){
Paciente *tmp = (Paciente *) calloc( sizeof(Paciente), 1 );
tmp->prontuario = prontuario;
strcpy( tmp->nome, nome );
tmp->idade = idade;
strcpy( tmp->rg, rg );
return tmp;
}
void mostraPaciente( Paciente *tmp ){
printf("\n\nPaciente: \t[%05d] [%-40s]\nIdade: \t\t[%3d]\t\tRG: [%-13s]\n",
tmp->prontuario,
tmp->nome,
tmp->idade,
tmp->rg
);
}
// outro exemplo de dados estruturados
typedef struct{
double salario;
char *cargo;
} Salario;
Salario* criaSalario( double salario, char *cargo ){
Salario *tmp = (Salario *) calloc( sizeof( Salario ), 1 );
tmp->salario = salario;
tmp->cargo = cargo;
return tmp;
}
// estruturas e funções de uma lista generica
typedef struct{
void *dados;
void *proximo;
void *anterior;
} No;
typedef struct{
No *primeiro;
No *corrente;
No *ultimo;
int tamanho;
} Lista;
Lista* criaLista(){
Lista *tmp = (Lista *) calloc( sizeof(Lista),1);
tmp->primeiro = NULL;
tmp->corrente = NULL;
tmp->ultimo = NULL;
tmp->tamanho = 0;
return tmp;
}
void insereElemento( Lista *lst, void *dat ){
No *no = (No *) calloc( sizeof(No), 1 );
no->anterior = lst->ultimo;
no->dados = dat;
no->proximo = NULL;
lst->ultimo = no;
if ( lst->tamanho == 0 ){
lst->primeiro = no;
} else {
//No *tmp = no->anterior;
//tmp->proximo = no;
((No *) no->anterior)->proximo = no;
}
lst->tamanho++;
}
void destroiLista( Lista *tmp ){
tmp->corrente = tmp->primeiro;
while ( tmp->tamanho > 0 ){
No *proximo = tmp->corrente->proximo;
free( tmp->corrente->dados );
free( tmp->corrente );
tmp->corrente = proximo;
tmp->tamanho --;
}
free( tmp );
}
// outras funções do programa
void pausa(){
printf( "\ntecle ENTER" );
fflush( stdin );
getchar();
system( "cls" );
}
int main()
{
Lista *pacientes = criaLista();
insereElemento( pacientes, criaPaciente( 1200, "Antonio", 89, "123.456.123-1" ) );
insereElemento( pacientes, criaPaciente( 1300, "Maria", 81, "987.654.432-2" ) );
insereElemento( pacientes, criaPaciente( 1400, "Joao", 84, "765.234.546-3" ) );
insereElemento( pacientes, criaPaciente( 1500, "Francisco", 78, "453.765.897-5" ) );
printf( "\nListagem Normal:\n" );
pacientes->corrente = pacientes->primeiro;
while ( pacientes->corrente != NULL ){
mostraPaciente((Paciente *) pacientes->corrente->dados);
pacientes->corrente = pacientes->corrente->proximo;
}
pausa();
printf( "\nListagem Invertida:\n" );
pacientes->corrente = pacientes->ultimo;
while ( pacientes->corrente != NULL ){
mostraPaciente((Paciente *) pacientes->corrente->dados);
pacientes->corrente = pacientes->corrente->anterior;
}
pausa();
destroiLista( pacientes );
pacientes = NULL;
// outro exemplo
Lista *semana = criaLista();
insereElemento( semana, "Segunda-Feira" );
insereElemento( semana, "Terca-Feira" );
insereElemento( semana, "Quarta-Feira" );
insereElemento( semana, "Quinta-Feira" );
insereElemento( semana, "Sexta-Feira" );
insereElemento( semana, "Sabado-Feira" );
insereElemento( semana, "Domingo" );
printf( "\nDias da Semana:\n" );
semana->corrente = semana->primeiro;
while ( semana->corrente != NULL ){
printf("\n%-s\n", (char *) semana->corrente->dados);
semana->corrente = semana->corrente->proximo;
}
pausa();
destroiLista( semana );
semana = NULL;
// mais um outro exemplo
Lista *salarios = criaLista();
insereElemento( salarios, criaSalario( 1200.00, "Estagiario" ) );
insereElemento( salarios, criaSalario( 1600.00, "Motorista" ) );
insereElemento( salarios, criaSalario( 1900.00, "Secretaria" ) );
insereElemento( salarios, criaSalario( 2300.00, "Vendedor" ) );
insereElemento( salarios, criaSalario( 3400.00, "Programador" ) );
insereElemento( salarios, criaSalario( 4500.00, "Analista" ) );
insereElemento( salarios, criaSalario( 6720.00, "Gerente" ) );
printf( "\nTabela de Salarios:\n" );
salarios->corrente = salarios->primeiro;
while ( salarios->corrente != NULL ){
Salario *tmp = (Salario *) salarios->corrente->dados;
printf("\n%-15s - %12.2f\n", tmp->cargo, tmp->salario );
salarios->corrente = salarios->corrente->proximo;
}
pausa();
destroiLista( salarios );
salarios = NULL;
return 0;
}
Bom estudo e até a próxima.