Ir ao conteúdo

Posts recomendados

Postado

Ola gostaria de aprender a implementar uma Array List (não é trabalho da facu ou coisa do tipo, quero aprender para aumentar o conhecimento na area).

Sei que ela une o acesso aleatório de um vetor com a quantidade "variada" de uma estrutura encadeada.

Alguém sabe como implementá-la em C ?

  • Curtir 1
  • 4 anos depois...
Postado

Tenho esse exemplo que pode ser alterado de acordo com seu interesse!

 

#include <stdio.h>
#include <stdlib.h>

typedef struct ArrayList ArrayList;
typedef ArrayList* ArrayListPtr;

struct ArrayList {
    size_t capacity;
    size_t size;
    int *data;
    ArrayListPtr parent;
    ArrayListPtr child;
};

const size_t ARRAY_LIST_CHUNCK_SIZE = 64;

ArrayListPtr array_list_create_with_parent_and_chunck_size(ArrayListPtr parent,
                                                           size_t chunck_size) {
    ArrayListPtr result = (ArrayListPtr)calloc(sizeof(ArrayList), 1);
    result->parent = parent;
    result->capacity = chunck_size;
    result->data = (int*)malloc(sizeof(int) * chunck_size);
    return result;
}

ArrayListPtr array_list_create_with_parent(ArrayListPtr parent) {
    return array_list_create_with_parent_and_chunck_size(
        parent, ARRAY_LIST_CHUNCK_SIZE
    );
}

ArrayListPtr array_list_create() {
    return array_list_create_with_parent_and_chunck_size(
        NULL, ARRAY_LIST_CHUNCK_SIZE
    );
}

void array_list_push_back(ArrayListPtr list, int value) {
    if (list->size >= list->capacity) {
        if (!list->child) {
            list->child = array_list_create_with_parent(list);
        }
        array_list_push_back(list->child, value);
    } else {
        list->data[list->size++] = value;
    }
}

int* array_list_get_value_by_index(ArrayListPtr list, size_t index) {
    if (index >= list->capacity || index >= list->size) {
        if (list->child) {
            return array_list_get_value_by_index(list->child,
                                                 index - list->size);
        } else {
            return NULL;
        }
    }
    return list->data + index;
}

int main(int argc, char *argv[]) {
    ArrayListPtr vetor = array_list_create();
    int i=0;
        int n=0,control = 0,j;
        
    r: while (control == 0){
        
        scanf("%d",&n);
        if (n == 0){
            control = 1;
            goto r;
        }
        array_list_push_back(vetor, n);
        n = 0;
        i++;
    }
      for (j=0;j < i;j++){
    int* result = array_list_get_value_by_index(vetor, j);
        printf("Vetor[x] = %d\n", j, *result);
    }
    }

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...