Merge sort em C
09/09/2020
0
Boa noite!
Estou implementando uma lista sequencial e preciso ordenar meu elementos, então coloquei o Merge sort para fazer isso, só que está dando um erro:
ListaSequencial.c: In function ‘merge’:
ListaSequencial.c:152:19: error: request for member ‘A’ in something not a structure or union
152 | l->A[comAux] = Aux->A[comAux-inicio];
Por favor, quem puder me ajudar, agradeço.
Estou implementando uma lista sequencial e preciso ordenar meu elementos, então coloquei o Merge sort para fazer isso, só que está dando um erro:
ListaSequencial.c: In function ‘merge’:
ListaSequencial.c:152:19: error: request for member ‘A’ in something not a structure or union
152 | l->A[comAux] = Aux->A[comAux-inicio];
Por favor, quem puder me ajudar, agradeço.
#include <stdio.h> #include <stdlib.h> #define MAX 50 #define ERRO -1 #define true 1 #define false 0 typedef int bool; typedef int TIPOCHAVE; typedef struct{ TIPOCHAVE chave; // outros campos... } REGISTRO; typedef struct { REGISTRO A[MAX+1]; int nroElem; } LISTA; /* Inicialização da lista sequencial (a lista já está criada e é apontada pelo endereço em l) */ void inicializarLista(LISTA* l){ l->nroElem = 0; } /* inicializarLista */ /* Exibição da lista sequencial */ void exibirLista(LISTA* l){ int i; printf("Lista: " "); for (i=0; i < l->nroElem; i++) printf("%i ", l->A[i].chave); // só lembrando TIPOCHAVE = int printf(""\n"); } /* exibirLista */ /* Retornar o tamanho da lista (numero de elementos "validos") */ int tamanho(LISTA* l) { return l->nroElem; } /* tamanho */ /* Retornar o tamanho em bytes da lista. Neste caso, isto nao depende do numero de elementos que estao sendo usados, pois a alocacao de memoria eh estatica. A priori, nao precisariamos do ponteiro para a lista, vamos utiliza-lo apenas porque teremos as mesmas funcoes para listas ligadas. */ int tamanhoEmBytes(LISTA* l) { return sizeof(LISTA); } /* tamanhoEmBytes */ /* Retornar a chave do primeiro elemento da lista sequencial (caso haja) e ERRO caso a lista esteja vazia */ TIPOCHAVE primeiroElem(LISTA* l){ if(l->nroElem > 0) return l->A[0].chave; else return ERRO; // lista vazia } /* primeiroElem */ /* Retornar a chave do ultimo elemento da lista sequencial (caso haja) e ERRO caso a lista esteja vazia */ TIPOCHAVE ultimoElem(LISTA* l) { if(l->nroElem > 0) return l->A[l->nroElem-1].chave; else return ERRO; // lista vazia } /* ultimoElem */ /* Retornar a chave do elemento que está na posição n da LISTA. Lembre-se que as posicoes do arranjo A vao de 0 a MAX-1 */ TIPOCHAVE enesimoElem(LISTA* l, int n) { if( (n >= 0) && (n < l->nroElem)) return l->A[n].chave ; else return ERRO; } /* enesimoElem */ /* Reinicializar a estrutura */ void reinicializarLista(LISTA* l) { l->nroElem = 0; } /* reinicializarLista */ /* Inserção "direta" na iésima posição (posicao i do arranjo A). Funciona da mesma maneira de um insertionSort: deve-se deslocar todos os elementos a partir da iesima posicao e entao se insere o novo elemento. */ bool inserirElemLista(LISTA* l, REGISTRO reg, int i){ int j; if ((l->nroElem >= MAX) || (i < 0) || (i > l->nroElem)) return(false); // lista cheia ou índice inválido for (j = l->nroElem; j > i; j--) l->A[j] = l->A[j-1]; l->A[i] = reg; l->nroElem++; return true; } /* inserirElemLista */ /* Busca sequencial em lista ordenada ou não SEM SENTINELA */ int buscaSequencial(LISTA* l, TIPOCHAVE ch) { int i = 0; while (i < l->nroElem){ if(ch == l->A[i].chave) return i; // achou else i++; } return ERRO; // não achou } /* buscaSequencial */ /* Exclusão do elemento cuja chave seja igual a ch */ bool excluirElemLista(LISTA* l, TIPOCHAVE ch) { int pos, j; pos = buscaSequencial(l,ch); if(pos == ERRO) return false; // não existe for(j = pos; j < l->nroElem-1; j++) l->A[j] = l->A[j+1]; l->nroElem--; return true; } /* excluirElemLista */ /* Busca sequencial em lista COM SENTINELA (vetor criado com MAX+1 posições) */ int buscaSentinela(LISTA* l, TIPOCHAVE ch) { int i = 0; l->A[l->nroElem].chave = ch; // sentinela while(l->A[i].chave != ch) i++; if (i > l->nroElem -1) return ERRO; // não achou else return i; } /* buscaSentinela */ void merge(LISTA* l, int inicio, int meio, int fim) { //Intercalação. int com1 = inicio, com2 = meio+1, comAux = 0, tam = fim-inicio+1; int *Aux; Aux = (int*) malloc(tam*sizeof(int)); while (com1 <= meio && com2 <= fim) { if (l->A[com1].chave < l->A[com2].chave) { //Compara os dois vetores e guarda na variável r. Aux[comAux] = l->A[com1].chave; com1++; }else { Aux[comAux] = l->A[com2].chave; com2++; } comAux++; } while(com1 <= meio){ //Caso ainda haja elementos na primeira metade Aux[comAux] = l->A[com1].chave; comAux++; com1++; } while(com2 <= fim) { //Caso ainda haja elementos na segunda metade Aux[comAux] = l->A[com2].chave; comAux++; com2++; } for(comAux = inicio; comAux <= fim; comAux++){ //Move os elementos de volta para o vetor original l->A[comAux] = Aux->A[comAux-inicio]; } free(Aux); //Limpa a memória. } //Código de ordenação, usando o conceito do MergeSort. void ordenar(LISTA* l, int inicio, int fim) { if (inicio < fim) { //Caso minha função seja menor que o fim. int meio = ((inicio+fim)/2); //Divida meu conjunto em duas partes e o floor é para arredondar. ordenar(l,inicio,meio); ordenar(l,meio+1,fim); //Chama a função para as duas metades. merge(l,inicio,meio,fim);//Unir as partes. } } int main(){ LISTA lista; inicializarLista(&lista); exibirLista(&lista); printf("Numero de elementos na lista: %i.\n",tamanho(&lista)); printf("Tamanho da lista (em bytes): %i.\n",tamanhoEmBytes(&lista)); REGISTRO reg; reg.chave = 9; inserirElemLista(&lista,reg,0); exibirLista(&lista); reg.chave=3; inserirElemLista(&lista,reg,1); reg.chave=4; inserirElemLista(&lista,reg,2); reg.chave=1; inserirElemLista(&lista,reg,3); reg.chave=12; inserirElemLista(&lista,reg,2); exibirLista(&lista); printf("Numero de elementos na lista: %i.\n",tamanho(&lista)); printf("Tamanho da lista (em bytes): %i.\n",tamanhoEmBytes(&lista)); printf("Chave 4 encontrada na posicao: %i do arranjo A.\n",buscaSequencial(&lista,4)); printf("Chave 4 encontrada na posicao: %i do arranjo A.\n",buscaSentinela(&lista,4)); if (excluirElemLista(&lista,4)) printf("Exclusao bem sucedida: 4.\n"); if (excluirElemLista(&lista,8)) printf("Exclusao bem sucedida: 8.\n"); if (excluirElemLista(&lista,9)) printf("Exclusao bem sucedida: 9.\n"); exibirLista(&lista); printf("Numero de elementos na lista: %i.\n",tamanho(&lista)); printf("Tamanho da lista (em bytes): %i.\n",tamanhoEmBytes(&lista)); reinicializarLista(&lista); exibirLista(&lista); printf("Numero de elementos na lista: %i.\n",tamanho(&lista)); printf("Tamanho da lista (em bytes): %i.\n",tamanhoEmBytes(&lista)); return 0; }
Lucas
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)