Linguagem C: Estruturas e Tipos Abstratos de Dados

De Aulas

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.