diff --git a/lib_lista.c b/lib_lista.c index df2079c885b25ebe8f6e0068d2ac5cab6da8767e..b8f4acc2532f86de7adb1489eb1282cecdfa3b49 100644 --- a/lib_lista.c +++ b/lib_lista.c @@ -12,7 +12,7 @@ int inicializa_lista(t_lista *l) return 0; sentinel->prox = NULL; - sentinel->prev = l->ini; + sentinel->prev = NULL; l->ini = sentinel; diff --git a/lib_lista_complementar.c b/lib_lista_complementar.c index 7480e823ee9bfdf2cdd8a3a48bae0b0fa3b21ec8..e846740023c29bc7f5777ae59a2db9b2c5f7503c 100644 --- a/lib_lista_complementar.c +++ b/lib_lista_complementar.c @@ -2,10 +2,6 @@ #include "lib_lista.h" -/* - Funcao que imprime todos os elementos da lista, do inicio ao fim. - Caso a lista seja vazia nao imprime nada, nem um \n -*/ void imprime_lista(t_lista *l) { int item; @@ -20,10 +16,6 @@ void imprime_lista(t_lista *l) } } -/* - Funcao que copia todos os elementos da lista l na lista c. - Retorna 1 se a operação foi bem sucedida e zero caso contrário. -*/ int copia_lista(t_lista *l, t_lista *c) { int item; @@ -45,11 +37,6 @@ int copia_lista(t_lista *l, t_lista *c) return 1; } -/* - Concatena os elementos da lista c (na mesma ordem) ao final - da lista l e destroi a lista c. - Retorna 1 se a operação foi bem sucedida e zero caso contrário. -*/ int concatena_listas(t_lista *l, t_lista *c) { int item; @@ -62,10 +49,6 @@ int concatena_listas(t_lista *l, t_lista *c) return 1; } -/* - Ordena a lista l em ordem crescente. - Retorna 1 se a operação foi bem sucedida e zero caso contrário. -*/ int ordena_lista(t_lista *l) { t_lista aux; @@ -86,9 +69,40 @@ int ordena_lista(t_lista *l) } /* - Funcao que cria uma nova lista i pela intercalacao dos elementos - das listas l e c. As listas l e c devem estar ordenadas. - Retorna 1 se a operação foi bem sucedida e zero caso contrário. + Assumindo que as listas l e m já estão ordenadas. */ -int intercala_listas(t_lista *l, t_lista *m, t_lista *i){return 1;} +int intercala_listas(t_lista *l, t_lista *m, t_lista *i) +{ + if (!inicializa_lista (i)) + return 0; + int item; + while (!lista_vazia(l) || !lista_vazia(m)) + { + consulta_item_atual(&item, l); + incrementa_atual(l); + insere_inicio_lista(item, i); + + consulta_item_atual(&item, m); + incrementa_atual(m); + insere_inicio_lista(item, i); + } + + if (lista_vazia(l)) + while (!lista_vazia(m)) + { + consulta_item_atual(&item, m); + incrementa_atual(m); + insere_inicio_lista(item, i); + } + + else + while (!lista_vazia(l)) + { + consulta_item_atual(&item, l); + incrementa_atual(l); + insere_inicio_lista(item, i); + } + + return 1; +} diff --git a/main.c b/main.c index 2a77806723228894d95db1154b2dc8d8e1a80d4d..fde3c7d9f5faa5752e8ecbcfc470ddad25296a1c 100644 --- a/main.c +++ b/main.c @@ -4,9 +4,11 @@ int main() { - t_lista l, u; + t_lista l, u, w; + inicializa_lista(&l); inicializa_lista(&u); + inicializa_lista(&w); printf("insere inicio e fim:\n"); insere_inicio_lista(10,&l); @@ -40,8 +42,15 @@ int main() imprime_lista(&l); printf("\n"); + printf("intercala:\n"); + intercala_listas(&l, &l, &w); + printf ("lista w: "); + imprime_lista(&w); + printf("\n"); + destroi_lista(&l); destroi_lista(&u); + destroi_lista(&w); return 0; }