Um excelente tutorial sobre ponteiros, arrays, strings, alocação dinâmica de memória, struct e typedef em C Ansi:
http://cesarakg.freeshell.org/pointers.html
Bom estudo.
quarta-feira, 20 de junho de 2012
quinta-feira, 7 de junho de 2012
Lista genérica para dados estruturados
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.
sexta-feira, 1 de junho de 2012
Usando typedef, struct, malloc e free
A seguir temos alguns exemplos de fácil compreensão.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int id;
char name[30];
} elemento;
typedef struct node{
struct node *next; // forma correta
// node *previous; // declaração errada
elemento *dados;
} node;
typedef struct tag{
int key;
int value;
} tag;
int main()
{
elemento *prod = (elemento *) malloc( sizeof( elemento ));
prod->id = 123;
strcpy( prod->name, "teste");
node *n = (node *) malloc( sizeof(node));
n->next = NULL;
n->dados = prod;
free( n->dados );
free( n );
tag *a = (tag *) malloc( sizeof( tag ));
a->key = 12;
a->value = 14;
free( a );
struct tag *b = (struct tag *) malloc( sizeof( struct tag ));
b->key = 120;
b->value = 140;
free( b );
struct point3d {
int x;
int y;
int z;
};
struct point3d *ptr = (struct point3d *) malloc( sizeof( struct point3d ));
ptr->x = 10;
ptr->y = 20;
ptr->z = 30;
free( ptr );
typedef struct point{
int x;
int y;
} point;
point *q = (point *) malloc( sizeof( point ));
q->x = 39;
q->y = 67;
free( q );
return 0;
}
Link relacionado ao assunto:
RE: typedef struct vs struct
http://www.netalive.org/codersguild/posts/1753.shtml