Das 5102 Fundamentos da Estrutura da Informação Gabarito da Segunda Prova 1. Tipos Abstratos de Dados TADs é uma forma programar. Eles permitem a estrutura de programas em módulos correlacionando estruturas de dados com conjuntos de funções. Em C, TADs são estruturadas em dois arquivos. No arquivo <TAD>.h que compõe o cabeçalho da TAD deve conter a definição das estruturas de dados e as definições ou protótipos das funções relacionadas que serão implementadas no arquivo <TAD>.c. 2. Toda função de uma TAD (exceto possivelmente função de criação da estrutura) deve receber uma referência para a estrutura de dados definida na TAD. Isso permite que sejam criadas e manipuladas diferentes versões da estrutura de dados em um mesmo programa. Ex: Pilha *p1, *p2; criapilha(p1); criapilha(p2); push(p1,10); push(p2, pop(p1)); 3. Passos: a) Encontrar a posição para inserção b) Checar se a posição para inserção é válida c) Inserir o novo elemento via o correto ajuste de ponteiros int inserirnaposicao(celula *le, int dado, int pos){ celula *ne, *temp; temp = le; if(pos == 1){ ne = malloc(sizeof(celula)); ne->prox = NULL; ne->dado = dado; le = ne; else{ int cont = 1; while(cont < pos) && (temp->prox!= NULL){ cont++; if((cont == pos-1) && (temp->prox == NULL)){ ne = malloc(sizeof(celula)); ne->prox = NULL; ne->dado = dado; temp->prox = ne; else{ ne = malloc(sizeof(celula)); ne->dado = dado; ne->prox = temp->prox; temp->prox = NE; return 0;
4. Pesquisa de informações em uma lista: a) int buscaelementoa(celula *le, int elem){ int cont = 1; celula *temp; temp = le; if(temp == NULL){ //lista vazia printf( a lista se encontra vazia! ); return 0; while(temp->dado!= elem){ if(temp->prox == NULL) // final da lista{ return 0; // função falhou cont++; return cont; b) celula *buscaelementob(celula *le, int pos){ int cont = 1; celula *temp; temp = le; if(temp == NULL){ //lista vazia printf( a lista se encontra vazia! ); return NULL; while(count < pos){ if(temp->prox == NULL){ // final da lista return NULL; // função falhou cont++; return temp; 5. Uma Heap pode ser implementada usando arrays como estrutura de dados base se a árvore binária que a modela for completa ou quase completa. Isto se deve ao fato das árvores binárias completas e quase completas poderem ser numeradas seqüencialmente de cima para baixo e da esquerda para a direita. Ainda, podemos facilmente identificar os graus de relacionamento na árvore via duas regras bem simples: a) Filho esquerdo = 2*pai b) Filho direito = 2*pai +1 6. Considere as duas propriedades a seguir: a) Em uma árvore completa todos os nós folha estarão localizados no último nível da árvore; b) Em uma árvore quase completa, todos os nós folha estarão no último ou no penúltimo nível da árvore. Os nós folha do último nível em uma árvore quase completa devem estar todos localizados à esquerda. int ehcompleta(celula *ab){ int altura = retornaaltura(ab); //retorna a altura de ab int resultado = checanivelfolha(ab, altura); if(resultado == 1){
printf( a árvore especificada é completa! ); else if(resultado == 2) { printf( a árvore especificada é quase completa! ); return 2; else{ printf( a árvore especificada é genérica ); return 0; int checanivelfolha(celula *ab, int alt) { int ra, rb; ra = rb = 0; if(ab->esq!= NULL){ ra = checanivelfolha(ab->esq, alt); if(ab->dir!= NULL){ rb = checanivelfolha(ab->dir, alt); if(ab->nivel == alt){ else if((ab->nivel == alt -1)&& (ra ==0) && (rb==0)){ return 2; if (ra == 1) && (ra == 1) else if ((ra == 1) (ra==2)) &&(rb == 2) return 2; else return 0; 7. Não. A função merge proposta para árvores binárias não funcionaria no caso de Heaps porque ela não garante que as propriedades da forma e da heap serão satisfeitas. Considerando que a TAD heap é dada, uma forma simples de, dadas as heaps Ha e Hb, construir uma nova heap Hc contendo todos os elementos de Ha e Hb e ainda mantendo as propriedades da heap, pode ser dada como: Heap *mergeheaps(heap *Ha, Heap *Hb){ Heap *tempa, *tempb; tempa = copyheap(ha); tempb = copyheap(hb); while(!isempy(tempb)) { Insere(TempA, remove(tempb)); return tempa; 8. struct heap{ int chave[20]; int dado[20];
int topo; typedef struct heap Heap; void insere(heap *h, int c, int d){ int temp, p, index = h->topo; h->chave[topo] = c; h->dado[topo] = d; h->topo = h->topo + 1; p = (int)(index/2); while((h->chave[index] > h->chave[p])&&(p!=0)){ temp = h->chave[index]; h->chave[index] = h->chave[topo]; h->chave[topo] = temp; index = p; p = (int)(index/2); int remove(heap *h){ int temp, index, fe, fd, indicedetroca; int tempdata = h->dado[0]; h->chave[0] = h->chave[h->topo -1]; h->topo = h->topo - 1; index = 1; fe = index * 2; fd = index * 2 + 1; while((h->chave[index] < h->chave[fe]) ( h->chave[index] < h->chave[fd])){ indicedetroca = maxkey(h, fe, fd); temp = h->chave[indicedetroca]; h->chave[indicedetroca] = h->chave[index]; h->chave[index] = temp; index = indicedetroca; fe = index * 2; fd = index * 2 + 1; 9. Para a solução desta questão, consideraremos uma fila de prioridade não ordenada struct cel{ int dado; struct cel *prox; struct cel *ant; int prioridade; ; typedef struct cel celula; struct fp{ struct cel *head; struct cel *tail; int size; ; typedef struct fp FilaPr; void inserecomp(filapr *f, int dado, int prior){
celula *c; c = malloc(sizeof(celula)); c->ant = null; c->prioridade = prior; c->dado = dado; c->prox = f->tail; f->tail = c; celula *removep(filapr *f){ int maxp; celula *maxcel, *temp; temp = f->tail; maxp = temp->prioridade; maxcel = temp; while(temp->prox!= NULL){ if(maxp < temp->prioridade){ maxp = temp->prioridade; maxcel = temp; (maxcel->ant)->prox = (maxcel->prox); (maxcel->prox)->ant = (maxcel->ant); return maxcel; //Observe que a função acima nao considera o caso do elemento ser único na lista, ou os casos em que o elemento a ser removido são o primeiro ou o último da lista. A preocupação principal com relação a questão está na identificação do elemento e no ajuste dos ponteiros. 10.Nota: como definido durante a prova, consideraremos apenas operações simples sem parênteses e sem prioridades entre as operações float resolveequacao(char *str){ char *elem; Pilha *PNums, *POps; int d1, d2, d3; PNums = criapilha(); POps = criapilha(); //parsing da string, conside funções que tomam conta desta tarefa while(elementosnastring(str)){ elem = proxelemento(str); if (ehnumero(elem)){ Celula *c = malloc(sizeof(celula)); c->num = atoi(elem); push(c, PNums); else{ Celula *c = malloc(sizeof(celula)); c->op = elem; push(c, POps);
while(numelementos(pops) > 0){ d1 = pop(pnums)->num; d2 = pop(pnums)->num; elem = pop(pops)->op; swhich (elem){ case + : d3 = d1 + d2; case - : d3 = d1 - d2; case * : d3 = d1 * d2; case / : d3 = d1 / d2; Celula *c2 = malloc(sizeof(celula)); c2->num = d3; push(c2, PNums); return pop(pnums)->num;