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}