Baixe o app para aproveitar ainda mais
Prévia do material em texto
ESTRUTURA DE DADOS 8a aula Lupa 1 Questão Dr. Pei Tam possui uma lista não ordenada de pacientes de seu consultório em que registra apenas o nome endereço e o telefone de cada paciente. Como não há limites para o crescimento de sua lista, como se pode implementar a inserção de um novo paciente na lista, sabendo que cada paciente é do tipo Paciente e a lista é do tipo List assim definidos : struct Paciente { long int matricula; string nome, endereco e tel; }; struct List { Paciente p; struct List *link; }; List * inserePac(List *i) { List *novo = new List; Paciente pat; novo->p = pat; novo->link = i; return novo; } List * inserePac(List *i, Paciente pt){ List *novo ; novo->p = pt; novo->link = i; return novo; } List * inserePac(List *i, Paciente pac) { List *novo = new List; novo.p = pac; novo.link = i; return novo; } List insereCliente(List *i, Paciente pac) { List novo[]; novo[0].p = pac; novo[0].link = i; return novo; } List * inserePac(List *i, Paciente pt) { List *novo = new List; novo->p = pt; novo->link =i; return novo; } Respondido em 07/09/2020 22:22:50 Gabarito Comentado 2 Questão Para a criação de uma Fila seqüencial basta iniciar as variáveis de início e final, ou seja, apontá-las para as posições iniciais do vetor. O que alteraria na rotina de inserir se a variável final fosse inicializada com o valor -1 (menos um): Após a inserção deve-se fazer o incremento da variável inicio Antes da inserção deve-se fazer o incremento da variável final Após a inserção deve-se fazer o decremento da variável final Após a inserção deve-se fazer o incremento da variável final Antes da inserção deve-se fazer o decremento da variável final Respondido em 07/09/2020 22:20:41 Gabarito Comentado 3 Questão Admita a seguinte estrutura de nó de uma lista simplesmente encadeada: struct tno { int chave; tno *proximo; }; Admita, agora, a seguinte declaração de uma variável do tipo nó: tno *no; Qual das alternativas a seguir traz uma operação válida sobre essa variável? no->proximo = new tno; no.proximo = no; no->proximo = -10; no->chave = new int; no.chave = 5; Respondido em 07/09/2020 22:20:44 Explicação: Analisando cada item : no.chave = 5; >> Como no é ponteiro então temos que usar a seta para acessar os campos da área apontada por no. no->proximo = -10; >> O campo proximo é de ponteiro então não pode receber inteiro. no->chave = new int; >> O campo chave é de inteiro então não deve receber endereço de inteiro. O operador new aloca memória e retorna o endereço da área alocada. no->proximo = new tno; >> É correto porque o campo proximo é campo de ponteiro e pode receber outro ponteiro, pode receber NULL ou pode receber endereço da área alocada com new, como foi o caso. no.proximo = no; >> Incorreto porque não pode se pode usar o ponto para acessar campo de struct apontada pelo ponteiro no. 4 Questão q Considere int *p, *q, *r; int x = 10, y = 20; Após seguir cada instrução na ordem dada a seguir : p = &x; q = &y; *p = *p + *q; (*q)++; r = q; q = p; identifique a opção que fornece correta e respectivamente, os valores de *p, *q , *r , x e y : 30 30 21 30 21 30 20 0 30 21 30 21 21 10 20 30 20 20 10 20 30 30 21 10 20 Respondido em 07/09/2020 22:20:52 Explicação: Fazendo passo a passo temos : int *p, *q, *r; int x = 10, y = 20; p = &x; //p aponta para x, que vale 10 q = &y; // q aponta para y que recebeu 20 *p = *p + *q; //a área apontada por p, que é x, vai receber 10 + 20, que dá 30. Logo, *p e x valem 30. (*q)++; //A área apontada por q é incrementada. Ou sejam, y ou *q recebem 21 r = q; //r aponta para y q = p; // q aponta para onde p aponta, ou seja, q aponta para x Logo : *p , que é x, vale 30 *q, que é igual a *p, que é x, vale 30 *r é y, que vale 21 x vale 30 y vale 21 Logo, a resposta certa é 30 30 21 30 21 5 Questão Qual o valor de x no final do programa? int main() { int x, *p, y; x = 2; p = &x; y = *p; y = 5; (*p)++; (*p) = (*p) - y; return(0); } 5 Nenhuma das anteriores. O programa possui um erro de sintaxe. 2 8 -2 Respondido em 07/09/2020 22:20:59 Explicação: Analisando passo a passo : int main() { int x, *p, y; x = 2; p = &x; // p aponta para x, sendo que x recebeu 2 y = *p; //y recebeu o conteúdo da área apontada por p, ou seja, y recebeu *p que é 2 y = 5; //y recebeu 5 (*p)++; //A área apontada por p recebeu 3 Ou seja, x recebeu 3 (*p) = (*p) - y; //*p, que é x recebeu 3 - 5. Ou seja, *p recebeu -2 return(0); } Como p aponta para x e *p recebeu -2, então x recebeu -2 6 Questão Verifique as afirmativas e marque a opção correta. I- Na alocação estática de memória a quantidade de memória alocada é feita em tempo de compilação. II- Na alocação dinâmica de memória a quantidade de memória alocada é feita em tempo de execução. III- Na alocação estática de memória a quantidade de memória alocada é fixa durante a execução do programa. IV- Na alocação dinâmica de memória a quantidade de memória alocada é fixa durante a execução do programa. Apenas a I está correta Apenas a opção I está errada Apenas a II está correta Apenas a IV está errada Apenas as opções I e II são corretas Respondido em 07/09/2020 22:23:27 Explicação: Analisando cada afirmativa : I- Na alocação estática de memória a quantidade de memória alocada é feita em tempo de compilação. Correto. Aloca-se memória antes da execução. II- Na alocação dinâmica de memória a quantidade de memória alocada é feita em tempo de execução. Correto. III- Na alocação estática de memória a quantidade de memória alocada é fixa durante a execução do programa. Correto. A memória alocada antes da execução não sofre alteração durante a execução. IV- Na alocação dinâmica de memória a quantidade de memória alocada é fixa durante a execução do programa. Falso. A quantidade de memória não é fixa. Apenas a afirmativa IV é falsa ou está errada. 7 Questão Em algumas situações, principalmente na utilização de listas, há a necessidade de posicionar o ponteiro em determinado local da lista. Dessa forma, analisando o trecho de código abaixo, que mostra uma função, assinale a alternativa correta que descreve o objetivo desta. Sabe-se que o sinal de asterisco (*) sinaliza um ponteiro. void funcao (Nodo **P){ if ( *P != NULL ){ while ( (*P) -> Anterior != NULL ) *P= (*P) -> Anterior; } } Posicionar o ponteiro no início da lista Posicionar o ponteiro no meio da lista Posicionar o ponteiro onde houver o valor NULL Colocar o valor NULL em todos os ponteiros Posicionar o ponteiro no final da lista Respondido em 07/09/2020 22:23:34 Gabarito Comentado 8 Questão Assinale a alternativa correta sobre alocação de memória. Alocação estática de memória refere-se ao processo de alocar memória com o uso de ponteiros. É correto afirmar que a alocação dinâmica de memória sempre leva a programas mais rápidos. Uma das vantagens da alocação dinâmica sobre a alocação estática é que não é necessário fazer a liberação da memória utilizada. Na alocação dinâmica de memória, a memória é alocada sob demanda, apenas quando necessário. A declaração de um vetor é um exemplo clássico de alocação dinâmica de memória. Respondido em 07/09/2020 22:23:37
Compartilhar