diff --git a/3-lista-lig-din-v1.c b/3-lista-lig-din-v1.c index 02f8021..6a9505c 100644 --- a/3-lista-lig-din-v1.c +++ b/3-lista-lig-din-v1.c @@ -25,9 +25,18 @@ void insercaoSimples(NO **p, int ch); NO* primeiroElem(NO *p); NO* ultimoElem(NO *p); NO* enesimoElem(NO *p, int n); -NO* buscaSeq(NO *p, int ch, NO **ant); +NO* buscaSeqOrd(NO *p, int ch, NO **ant); // funciona para lista em ordem crescente e sem rep +NO* buscaSeqSimples(NO *p, int ch); // funciona para lista em qualquer ordem e sem rep +NO* elemComMaiorChave(NO *p); // funciona para lista em qualquer ordem e sem rep +NO* elemComMenorChave(NO *p); // funciona para lista em qualquer ordem e sem rep int tam(NO *p); +int somaDasChaves(NO *p); + +bool insercaoOrdSemRep(NO** p, int ch); +bool exclusaoCh(NO **p, int ch); +bool destruicaoLista(NO **p); + // implementando funcoes @@ -124,7 +133,7 @@ int tam(NO *p) } -NO* buscaSeq(NO *p, int ch, NO **ant) +NO* buscaSeqOrd(NO *p, int ch, NO **ant) { if (p == NULL) return (NULL); // lista vazia @@ -145,6 +154,173 @@ NO* buscaSeq(NO *p, int ch, NO **ant) } +bool insercaoOrdSemRep(NO** p, int ch) +{ + NO **ant, *aux, *existe; + aux = *p; + existe = buscaSeqOrd(aux, ch, ant); + + if(existe != NULL) return (false); // no ja existente na lista + + NO *novo = (NO*) malloc(sizeof(NO)); + novo->chave = ch; + + if(*p == NULL) + { + *p = novo; + novo->prox = NULL; + + } else { + + if(*ant == NULL) // insercao no primeiro no + { + novo->prox = aux; + *p = novo; + + } else { // insercao quando tem anterior + + aux = *ant; + novo->prox = aux->prox; + aux->prox = novo; + + } + + } + + return (true); + +} + +bool exclusaoCh(NO **p, int ch) +{ + NO *existe, *aux, *ant; + aux = *p; + existe = buscaSeqOrd(aux, ch, &ant); + + if(aux == NULL || existe == NULL) // lista vazia ou elem inexistente + { + return (false); + + } else { + + aux = existe; + + if(ant == NULL) // elem e o primeiro da lista + { + *p = existe->prox; + free(aux); + + } else { // elem possui anterior + + ant->prox = existe->prox; + free(aux); + + } + + return (true); + + } + +} + +bool destruicaoLista(NO **p) +{ + NO *aux, *prox; + aux = *p; + + if(*p == NULL) + { + return (false); // lista ja e vazia + + } else { // lista tem elem + + while(aux != NULL) + { + prox = aux->prox; + free(aux); + aux = prox; + + } + + inicializacaoLista(p); + + return (true); + + } + +} + +NO* buscaSeqSimples(NO *p, int ch) +{ + NO *aux = p; + + while(aux != NULL) + { + if(aux->chave == ch) return (aux); + aux = aux->prox; + + } + + return (NULL); + +} + +NO* elemComMaiorChave(NO *p) +{ + if(p == NULL) return (NULL); // lista vazia; + + NO *aux, *maior; + aux = p; + maior = p; + + while(aux != NULL) + { + if(maior->chave < aux->chave) maior = aux; + aux = aux->prox; + + } + + return (maior); + +} + +NO* elemComMenorChave(NO *p) +{ + if(p == NULL) return (NULL); // lista vazia + + NO *aux, *menor; + aux = p; + menor = p; + + while(aux != NULL) + { + if(menor->chave > aux->chave) menor = aux; + aux = aux->prox; + + } + + return (menor); + +} + +int somaDasChaves(NO *p) +{ + if(p == NULL) return (-1); // lista vazia + + NO *aux = p; + int soma = 0; + + while (aux != NULL) + { + soma = soma + aux->chave; + aux = aux->prox; + + } + + return (soma); + +} + // funcao main int main()