Você está na página 1de 3

O mínimo que se espera de um(a) programador(a) de nível "Júnior" é que ele(a)

domine lógica de programação, bem como alocação dinâmica de memória e


estruturas de dados básicas. Dessa forma, um(a) programador(a) em início de
carreira deveria, pelo menos, poder analisar um código-fonte próprio, explicar seu
funcionamento, bem como adaptá-lo para utilizar tal código em seu dia a dia.
Assim, observe o trecho de código-fonte a seguir:
Linh
Código
a
typedef struct ELEMENTO{
01
int data;
02
ELEMENTO* next;
03
};
04
05
typedef struct ESTRUTURA{
06
ELEMENTO* head;
07
};
08
09
ESTRUTURA *e;
10
11
void insere(){
12
ELEMENTO* p = (ELEMENTO *)
13
malloc(sizeof(ELEMENTO));
14
p->data = rand()0;
15
p->next = e->head;
16
e->head = p;
17
}
18
19
int remove(){
20
ELEMENTO* p = e->head;
21
int data;
22
if(p != NULL){
23
e->head = p->next;
24
p->next = NULL;
25
data = p->data;
26
return data;
27
}
28
}

Fonte: o autor.
Observe que essa é uma estrutura de dados que pode ser composta
dinamicamente. Ou seja, seus elementos não são alocados estritamente em tempo
de compilação, mas em tempo de execução.

Com base no trecho de código anterior e em seus conhecimentos sobre estruturas


de dados lineares, responda:

1. Podemos dizer que essa estrutura de dados ficará armazenada,


obrigatoriamente, de forma contígua em memória?
RESPOSTA:
Não, essa estrutura de dados não será armazenada obrigatoriamente de
forma contígua em memória. Ela utiliza alocação dinâmica de memória para criar
elementos individualmente, que são então ligados por meio de ponteiros.

2. Qual é o nome da estrutura de dados que o respectivo trecho de código-


fonte se propõe a implementar?
RESPOSTA:
A estrutura de dados que o trecho de código se propõe a implementar é
uma lista encadeada.
3. Da forma como o código foi escrito, ele possui algum erro de sintaxe? Se
sim, indique em qual linha de código está o erro e como podemos fazer para
corrigir.
RESPOSTA:
Há um erro de sintaxe na linha 14 do código. O trecho "rand()0" não é
válido. Para corrigir, é necessário colocar um operador entre "rand()" e "0", por
exemplo: "rand() % 100", que retornaria um número aleatório entre 0 e 99.
void insere() {
ELEMENTO* p = (ELEMENTO*) malloc(sizeof(ELEMENTO));
p->data = rand() % 100;
p->next = e->head;
e->head = p;
}
4. Qual é o problema com a função "remove()"? Como podemos corrigi-la?
RESPOSTA: A função "remove()", ela é nome reservado em C e, portanto, não
pode ser usado como o nome de uma função, precisa ser renomeada com outro
nome, por exemplo removeDados(), esse é um erro de sintaxe no código
fornecido, além disso possui um outro problema em potencial que se a lista estiver
vazia (ou seja, "e->head" for NULL), a função não retorna nenhum valor, o que
pode levar a comportamentos indesejados ou erros de execução.
Para corrigir isso, pode-se adicionar uma cláusula "else" na função "remove()"
para retornar um valor de sentinela quando a lista estiver vazia. Por exemplo,
poderia retornar um valor negativo para indicar que a remoção falhou.
int removeDados(){
ELEMENTO* p = e->head;
int data;
if(p != NULL){
e->head = p->next;
p->next = NULL;
data = p->data;
free(p); // Liberar a memória alocada
return data;
} else {
return -1; // Retorna um valor negativo para indicar falha na remoção
}
}

Você também pode gostar