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