From 089ff3f236e956faaee1be8953c1042ccef4430b Mon Sep 17 00:00:00 2001 From: Leonardo Krambeck <lk19@inf.ufpr.br> Date: Thu, 24 Oct 2019 20:48:54 -0300 Subject: [PATCH] implementa insere ordenado --- lib_lista.c | 74 ++++++++++++++++++++++++++++++++++++++--------------- main.c | 29 +++++++++++++++------ 2 files changed, 75 insertions(+), 28 deletions(-) diff --git a/lib_lista.c b/lib_lista.c index 8b93226..19964fe 100644 --- a/lib_lista.c +++ b/lib_lista.c @@ -9,7 +9,6 @@ int inicializa_lista(t_lista *l) /* Insert beginning sentinel */ sentinel = (t_nodo*) malloc (sizeof (t_nodo)); - if (sentinel == NULL) return 0; @@ -18,7 +17,6 @@ int inicializa_lista(t_lista *l) /* Insert end sentinel */ sentinel = (t_nodo*) malloc (sizeof (t_nodo)); - if (sentinel == NULL) return 0; @@ -60,10 +58,18 @@ void destroi_lista(t_lista *l) l->tamanho = 0; } +int tamanho_lista(int *tam, t_lista *l) +{ + if (l->ini == NULL && l->fim == NULL) + return 0; + + *tam = l->tamanho; + return 1; +} + int insere_inicio_lista(int item, t_lista *l) { t_nodo *new; - new = (t_nodo*) malloc (sizeof (t_nodo)); if (new == NULL) return 0; @@ -80,19 +86,9 @@ int insere_inicio_lista(int item, t_lista *l) return 1; } -int tamanho_lista(int *tam, t_lista *l) -{ - if (l->ini == NULL && l->fim == NULL) - return 0; - - *tam = l->tamanho; - return 1; -} - int insere_fim_lista(int item, t_lista *l) { t_nodo *new; - new = (t_nodo*) malloc (sizeof (t_nodo)); if (new == NULL) return 0; @@ -109,18 +105,56 @@ int insere_fim_lista(int item, t_lista *l) return 1; } -/* - Insere o elemento item na lista de maneira que ela fique em ordem - crescente, do início para o final dela. - Retorna 1 se a operação foi bem sucedida e zero caso contrário. -*/ -int insere_ordenado_lista(int item, t_lista *l){return 1;} +int insere_ordenado_lista(int item, t_lista *l) +{ + if (lista_vazia(l)) + return insere_inicio_lista (item, l); + + t_nodo *new; + new = (t_nodo*) malloc (sizeof (t_nodo)); + if (new == NULL) + return 0; + + new->chave = item; + + t_nodo *p = l->ini->prox; + while (p->prox != NULL && p->chave < item) + p = p->prox; + + new->prox = p; + new->prev = p->prev; + + p->prev->prox = new; + p->prev = new; + + l->tamanho++; + + return 1; +} /* Remove o primeiro elemento da lista e o retorna em *item. Retorna 1 se a operação foi bem sucedida e zero caso contrário. */ -int remove_inicio_lista(int *item, t_lista *l){return 1;} +int remove_inicio_lista(int *item, t_lista *l) +{ + if (lista_vazia(l)) + { + item = NULL + return 0; + } + + t_nodo *p = l->ini->prox; + + l->ini = p->prox; + p->prox->prev = l->ini + + free (p); + + l->tamanho--; + + return 1; +} /* Remove o último elemento da lista e o retorna em *item. diff --git a/main.c b/main.c index 1658764..66bc484 100644 --- a/main.c +++ b/main.c @@ -2,19 +2,32 @@ #include "lib_lista.h" +void imprime (t_lista *l) +{ + t_nodo *p = l->ini->prox; + + while (p->prox->prox != NULL) + { + printf ("%d ",p->chave); + p = p->prox; + } + printf ("%d\n",p->chave); +} + int main () { t_lista l; - int tam; inicializa_lista(&l); - insere_inicio_lista (10, &l); - insere_inicio_lista (5, &l); - tamanho_lista(&tam, &l); - printf ("tam: %d\n",tam); - insere_fim_lista (8, &l); - tamanho_lista(&tam, &l); - printf ("tam: %d\n",tam); + insere_ordenado_lista(7, &l); + insere_ordenado_lista(10, &l); + insere_ordenado_lista(1, &l); + insere_ordenado_lista(3, &l); + insere_ordenado_lista(2, &l); + imprime (&l); + remove_inicio_lista(&l); + imprime (&l); + return 0; } -- GitLab