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.
Nenhum comentário:
Postar um comentário