UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA Bacharelado em Ciência da Computação e Engenharia da Computação INF 01203 Estruturas de Dados Profa. Renata Galante (galante@inf.ufrgs.br ) PRIMEIRA AVALIAÇÃO IDENTIFICAÇÃO Nome: 22/09/2010 01. (valor 1.0) Quais abordagens você utilizaria para a especificação do modelo lógico (lista, pilha, fila, deque) e do modelo físico (lista com array, lista circular com array, lista simplesmente encadaeada, lista simplemente encadeada circular, lista duplamente encadeada, lista duplamente encadeada circular), se o objetivo fosse implementar uma estrutura de dados que otmizasse os exemplos descritos a seguir. Justifique sua resposta. a) O controlador do disco é um processador dedicado para controlar o acesso ao disco. Vários usuários podem requisitar acesso a determinados setores do disco ao mesmo tempo. Como o atendimento a cada requisição demora alguns milisegundos, o controlador tem que gerenciar uma estrutura de dados de requisições dos usuários. b) Na execução de um programa, quando se entra num novo bloco, podem existir novas variáveis. Estas novas variáveis são alocadas em uma estrutura de dados de variáveis, pois na saída do bloco o espaço ocupado deve ser liberado para dar lugar a novas variáveis quando a execução entrar em novos blocos. Observe a figura que ilustra tal situação.
02. parte I (valor 1,0) Considerando a estrutura de dados apresentada no item a) da tabela apresentada a seguir, explique qual problema é solucionado pelo trecho de código no item b) da tabela apresentada a seguir. a) Tipo de Dados struct lista int info struct lista* prox; typedef struct lista Lista; b) Função oquesera Lista* oquesera (Lista* lis, int n) Lista* p; /* variável auxiliar para percorrer a lista */ Lista* q; /* variável auxiliar */ int m = 1; p = lis; while(p!= NULL && m <= n) m = m+1; q = p->prox; free(p); p = q; } return p; } 02. parte II (valor 1,0) Demonstre, passo a passo, a execução da função (teste de mesa) para os dois casos apresentados a seguir: Caso 01 lis = 1 -> 2 -> 3 -> 4 n = 2 Caso 02 lis = 1 -> 2 -> 3 -> 4 n = 5
03. (valor 1.0) Considere duas listas simplesmente encadeadas circulares, não vazias. Os ponteiros para o primeiro elemento de cada lista são lis1 e lis2, respectivamente. Analise o seguinte trecho de código e responda as duas questões a seguir: paux = lis1->prox; lis1->prox = lis2->prox; lis2->prox = paux; lis1 = lis2; lis2 = NULL; a) Qual o resultado da execução desse trecho de código? b) Qual o resultado da execução desse trecho de código caso lis1 e lis2 apontassem para dois elementos distintos da mesma lista circular?
04. (valor 3,0) Um sistema de navegação armazena o caminho entre dois pontos como uma lista encadeada de dados do tipo Logradouro (descrito a seguir). O campo nome contém o nome do Logradouro e o campo prox aponta para o próximo elemento da lista. struct logradouro char nome[51]; struct logradouro *prox; typedef struct logradouro Logradouro; Considere o tipo abstrato de dados Pilha, definido para armazenar ponteiros para cadeias de caracteres e que implementa as funções descritas na tabela a seguir: Pilha* pilha_cria (void); Retorna o ponteiro para uma nova pilha alocada dinamicamente. char* pilha_pop (Pilha* p); Retira um elemento do topo de uma pilha. O ponteiro da pilha é passado como parâmetro, e o retorno é o valor deste elemento. void pilha_push (Pilha** p, char* x); Insere um elemento no topo de uma pilha. O ponteiro da pilha e o elemento a ser inserido são passados como parâmetros int pilha_vazia (Pilha* p); Verifica se a pilha está vazia. O ponteiro da pilha é passado como parâmetro e o retorno é 1, se a pilha está vazia, ou 0, caso contrário. void pilha_libera (Pilha* p); Esvazia e libera a memória alocada para uma pilha. O ponteiro da pilha é passado como parâmetro. Crie uma função em C para comparar dois caminhos e verificar se um é o inverso do outro, ou seja, comparar as duas listas que armazenam caminhos e verificar se o conteúdo de uma lista --- seqüência de nomes de logradouros armazenados em cada nó --- equivale ao da outra lista na ordem inversa. Essa função deve usar o tipo abstrato Pilha para auxiliar nessa comparação. Os parâmetros da função são os ponteiros l1 e l2 para as duas listas. O retorno da função deve ser 1 se uma lista for o inverso da outra e 0, caso contrário. A função tem o seguinte protótipo: int Compara_listas(Logradouro* l1, Logradouro* l2);
05. (valor 3,0) Um site de busca (semelhante ao Google) armazena todas as expressões procuradas em uma lista duplamente encadeada não-circular. Os nós dessa lista são do tipo Expressao, definido como o tipo estruturado expressao descrito a seguir: struct expressao char descricao[81]; struct expressao *prox, *ant; typedef struct expressao Expressao; A referida lista é mantida ordenada por uma função que determina o ranking de consultas das expressões da forma descrita a seguir. Cada vez que uma expressão é consultada, se ela não consta na lista, ela é acrescentada ao final da lista. Por outro lado, se ela é encontrada, ela deve ganhar uma posição na lista, ou seja, deve trocar de posição com o nó imediatamente a sua frente. A função retorna a posição final do nó que contém a expressão. Por exemplo, considerando a figura acima, uma consulta à expressão iphone 3G causaria a alocação dinâmica de uma nova variável Expressao, que teria o campo descricao preenchido com a expressão procurada. Essa variável seria inserida no final da lista e a função retornaria o valor 4. Uma consulta à expressão Harry Potter causaria a troca de posição entre o segundo e o terceiro nó da lista e o valor de retorno seria 2. Uma consulta à expressão Britney Spears causaria a troca de posição entre o primeiro e o segundo nó da lista (o que exigiria a atualização do valor do ponteiro da lista) e o valor de retorno seria 1. Escreva, em C, a função descrita. A função deve receber como parâmetros um ponteiro para o início da lista e uma expressão que é a cadeira de caracteres que se deseja buscar. O retorno desta função deve ser um valor inteiro que representa a posição na lista do nó que contém a expressão após a reordenação, conforme foi descrito.