Linguagem C: Estruturas e Tipos Abstratos de Dados
Conteúdo relacionado: Programação em C
Definição
As estruturas (ou structs) são definições de dados correlacionados em uma forma organizada. Por exemplo, você pode reunir as informações necessárias para os dados de um cliente, tais como: nome, telefone, endereço, etc..
A seguir, apresento uma forma simples para se criar uma estrutura:
typedef struct {
float x;
float y;
int color;
} Point;
o typedef informa que está sendo criado um tipo definido pelo usuário, no caso, uma struct. O nome do tipo definido pelo usuário fica aparece no final da declaração (Point). Entre as chaves, são definidos os dados dessa estrutura.
Para acessar a estrutura, basta criar uma variável desse tipo e acessar seus elementos com o nome da variável criada a partir da estrutura, seguida de ponto e seguida do nome da variável interna dela:
// Criação uma variável do tipo Point
Point p1;
// Acessando os dados da estrutura de p1
p1.x = 100.0;
p1.y = 245.0;
p1.color = 0;
Pode-se criar também um ponteiro para uma estrutura. No caso, ao invés de se utilizar ponto, usa-se uma seta ->
// Criando uma variável ponteiro do tipo Point*
Point* p1 = (Point*) malloc(sizeof(Point));
// Acessando os dados da estrutura p1;
p1->x = 100.0;
p1->y = 245.0;
p1->color = 0;
// Liberando a memória alocada por p1
free (p1);
Exemplo 1
1#include <stdio.h>
2#include <string.h>
3
4typedef struct {
5 char nome[80];
6 char endereco[100];
7 int idade;
8 float salario;
9} Cliente;
10
11void imprime(Cliente c) {
12 printf("cliente %s, mora em %s, tem %d anos e recebe %.2f\n",
13 c.nome,
14 c.endereco,
15 c.idade,
16 c.salario);
17}
18
19int main () {
20 Cliente bob;
21 strcpy(bob.nome, "Paulo");
22 strcpy(bob.endereco, "rua x");
23 bob.idade = 18;
24 bob.salario = 1500.21;
25 imprime(bob);
26}
Exemplo 2
1#include <stdio.h>
2#include <stdlib.h>
3#include <time.h>
4
5#define SIZE 3
6
7typedef struct {
8 float x;
9 float y;
10} Point;
11
12/*
13 * Essa função retornaria uma informação de um sensor.
14 * Contudo, para fins de exemplo, está retornando um
15 * número aleatório entre 0 e 99.
16 */
17float getSensorInfo() {
18 return rand() % 100;
19}
20
21int main() {
22 int i;
23 Point point[SIZE];
24 // Inicializa o servidor de números randômicos
25 srand (time(NULL));
26 // Monta o gráfico
27 for (i = 0; i < SIZE; i++) {
28 point[i].x = i * 10;
29 point[i].y = getSensorInfo();
30 }
31 // Apresenta o gráfico;
32 for (i = 0; i < SIZE; i++) {
33 printf("(%.1f, %.1f)\t", point[i].x, point[i].y);
34 }
35 printf("\n");
36}
Exemplo 3
Igual ao exemplo 2, mas com a utilização de ponteiros.
1#include <stdio.h>
2#include <stdlib.h>
3#include <time.h>
4
5#define SIZE 5
6
7typedef struct {
8 float x;
9 float y;
10} Dados;
11
12float getSensorInfo() {
13 return rand() % 100;
14}
15
16int main() {
17 srand(time(NULL));
18 int i;
19 Dados **Dados = (Dados**) malloc(SIZE * sizeof(Dados*)); // Aloca espaço para a lista
20
21 for (i = 0; i < SIZE; i++) {
22 Dados[i] = (Dados*) malloc(sizeof(Dados)); // Aloca espaço para cada elemento da lista
23 Dados[i]->x = i * 10;
24 Dados[i]->y = getSensorInfo();
25 }
26
27 for (i = 0; i < SIZE; i++) {
28 printf("(%.1f, %.1f)\n", Dados[i]->x, Dados[i]->y);
29 free(Dados[i]); // Libera a memória alocada para cada elemento da lista
30 }
31 free(Dados); // Libera a memória alocada para a lista
32}
Exercício
Ler os dados para vários clientes, guardar todos na memória (em um vetor de structs), e imprimir o maior salário e a média das idades.