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}