DAS5102 - Lista Dupla - Exemplo em C

De Aulas

Links Relacionados: DAS5102 Fundamentos da Estrutura da Informação

ListaDupla.c

 1#ifndef LISTADUPLA_H_INCLUDED
 2#define LISTADUPLA_H_INCLUDED
 3
 4typedef struct lista Lista;
 5
 6Lista* lista_criar();
 7void lista_inserirInicio(Lista* l, int info);
 8void lista_inserirFim(Lista* l, int info);
 9void lista_inserir(Lista* l, int info, int posicao);
10void lista_excluirInicio(Lista* l);
11void lista_excluirFim(Lista* l);
12void lista_excluir(Lista* l, int posicao);
13int  lista_tamanho(Lista* l);
14int  lista_retornar(Lista* l, int posicao);
15void lista_mostrar(Lista* l);
16
17#endif // LISTADUPLA_H_INCLUDED

ListaDupla.h

  1#include <stdlib.h>
  2#include <stdio.h>
  3#include "ListaDupla.h"
  4
  5typedef struct no No;
  6
  7struct no
  8{
  9	int info;
 10	No* proximo;
 11	No* anterior;
 12};
 13
 14struct lista
 15{
 16	int tamanho;
 17	No* inicio;
 18	No* fim;
 19};
 20
 21Lista* lista_criar()
 22{
 23	Lista* l = malloc(sizeof(Lista));
 24	l->tamanho = 0;
 25	l->inicio = NULL;
 26	l->fim = NULL;
 27	return l;
 28}
 29
 30void lista_inserirInicio(Lista* l, int info)
 31{
 32	No* n = malloc(sizeof(No));
 33	n->info = info;
 34	n->anterior = NULL;
 35	n->proximo = l->inicio;
 36	l->tamanho++;
 37	l->inicio = n;
 38	if (l->tamanho == 1)
 39	{
 40		l->fim = n;
 41	}
 42	if (n->proximo != NULL)
 43	{
 44		n->proximo->anterior = n;
 45	}
 46}
 47
 48void lista_inserirFim(Lista* l, int info)
 49{
 50	No* n = malloc(sizeof(No));
 51	n->info = info;
 52	n->proximo = NULL;
 53	n->anterior = l->fim;
 54	l->tamanho++;
 55	l->fim = n;
 56	if (l->tamanho == 1)
 57	{
 58		l->inicio = n;
 59	}
 60	if (n->anterior != NULL)
 61	{
 62		n->anterior->proximo = n;
 63	}
 64}
 65
 66void lista_inserir(Lista* l, int info, int posicao)
 67{
 68	if (posicao <= 0)
 69	{
 70		lista_inserirInicio(l, info);
 71		return;
 72	}
 73	if (posicao >= l->tamanho - 1)
 74	{
 75		lista_inserirFim(l, info);
 76		return;
 77	}
 78	No* local = l->inicio;
 79	int i;
 80	for (i = 0; i < posicao - 1; i++)
 81	{
 82		local = local->proximo;
 83	}
 84	No* n = malloc(sizeof(No));
 85	n->info = info;
 86	n->proximo = local->proximo;
 87	n->anterior = local;
 88	n->proximo->anterior = n;
 89	n->anterior->proximo = n;
 90	l->tamanho++;
 91}
 92
 93void lista_excluirInicio(Lista* l)
 94{
 95	if (l->tamanho == 0)
 96	{
 97		return;
 98	}
 99	if (l->tamanho == 1)
100	{
101		free(l->inicio);
102		l->tamanho = 0;
103		l->inicio = NULL;
104		l->fim = NULL;
105		return;
106	}
107	No* aux = l->inicio->proximo;
108	aux->anterior = NULL;
109	free(l->inicio);
110	l->inicio = aux;
111	l->tamanho--;
112}
113
114void lista_excluirFim(Lista* l)
115{
116	if (l->tamanho <= 1)
117	{
118		lista_excluirInicio(l);
119		return;
120	}
121	No* aux = l->fim->anterior;
122	aux->proximo = NULL;
123	free(l->fim);
124	l->fim = aux;
125	l->tamanho--;
126}
127
128void lista_excluir(Lista* l, int posicao)
129{
130	if (l->tamanho == 0)
131	{
132		return;
133	}
134	if ((l->tamanho == 1) || (posicao == 0))
135	{
136		lista_excluirInicio(l);
137		return;
138	}
139	if (posicao == l->tamanho - 1)
140	{
141		lista_excluirFim(l);
142		return;
143	}
144	if ((posicao < 0) || (posicao >= l->tamanho))
145	{
146		return;
147	}
148	No* local = l->inicio;
149	int i;
150	for (i = 0; i < posicao; i++)
151	{
152		local = local->proximo;
153	}
154	local->anterior->proximo = local->proximo;
155	local->proximo->anterior = local->anterior;
156	free(local);
157	l->tamanho--;
158}
159
160int  lista_tamanho(Lista* l)
161{
162	return l->tamanho;
163}
164
165int  lista_retornar(Lista* l, int posicao)
166{
167	if (l->tamanho == 0)
168	{
169		return -1;
170	}
171	if ((posicao < 0) || (posicao >= l->tamanho))
172	{
173		return -2;
174	}
175	No* local = l->inicio;
176	int i;
177	for (i = 0; i < posicao; i++)
178	{
179		local = local->proximo;
180	}
181	return local->info;
182}
183
184void lista_mostrar(Lista* l)
185{
186	printf("LISTA(%d):  [ ", l->tamanho);
187	No* local = l->inicio;
188	while (local != NULL)
189	{
190		printf("%d ", local->info);
191		local = local->proximo;
192	}
193	printf("]\n");
194}

main.c

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include "ListaDupla.h"
 4
 5int main()
 6{
 7    int i;
 8    Lista* l = lista_criar();
 9    lista_mostrar(l);
10    for (i = 0; i < 9; i++)
11    {
12        lista_inserirFim(l, i);
13        lista_mostrar(l);
14    }
15
16    printf("ELEMENTOS: %d [ ", lista_tamanho(l));
17    for (i = 0; i < 9; i++)
18    {
19        printf("%d ", lista_retornar(l, i));
20    }
21    printf("]\n");
22
23    lista_inserir(l, 43, 3);
24    lista_mostrar(l);
25    lista_inserir(l, 32, 7);
26    lista_mostrar(l);
27    lista_inserir(l, 99, 5);
28    lista_mostrar(l);
29
30    int tamanho = lista_tamanho(l);
31    for (i = 0; i < tamanho; i++)
32    {
33        lista_excluirFim(l);
34        lista_mostrar(l);
35    }
36    return 0;
37}