Skip to content

Commit a648d51

Browse files
Create ListaEncadeada.c
Acabei fechando o último pull request sem querer aqui. Recriando o arquivo com as devidas alterações
1 parent d6c78b9 commit a648d51

File tree

1 file changed

+268
-0
lines changed

1 file changed

+268
-0
lines changed

src/c/ListaEncadeada.c

+268
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
#include <stdlib.h>
2+
#include <stdio.h>
3+
4+
typedef struct tno {
5+
/*Caso queira usar isso para qualquer um use TAD
6+
E com o TAD defina: typedef void *tdado;
7+
E em todo local do código relacionado ao dado
8+
troque int por tdado.
9+
*/
10+
int dado;
11+
struct tno *anterior;
12+
struct tno *proximo;
13+
} tipoNo;
14+
15+
typedef tipoNo *pnoh;
16+
17+
typedef struct {
18+
int tamanho;
19+
pnoh primeiro;
20+
pnoh ultimo;
21+
} tcabec;
22+
23+
typedef tcabec *TLista;
24+
25+
26+
TLista criaLista() {
27+
TLista c = (tcabec *)malloc(sizeof(tcabec));
28+
29+
c->tamanho = 0;
30+
c->primeiro = NULL;
31+
c->ultimo = NULL;
32+
33+
return c;
34+
}
35+
36+
TLista appendLista(TLista lst, int dado) {
37+
pnoh novono = (tipoNo *)malloc(sizeof(tipoNo));
38+
39+
novono->dado = dado;
40+
novono->anterior = lst->ultimo;
41+
novono->proximo = NULL;
42+
43+
if(lst->tamanho == 0){
44+
lst->primeiro = novono;
45+
lst->ultimo = novono;
46+
}
47+
else {
48+
lst->ultimo->proximo = novono;
49+
lst->ultimo = novono;
50+
}
51+
52+
lst->tamanho++;
53+
54+
return lst;
55+
}
56+
57+
int lenLista(TLista lst) {
58+
return lst->tamanho;
59+
}
60+
61+
int primLista(TLista lst) {
62+
return lst->primeiro->dado;
63+
}
64+
65+
int ultLista(TLista lst) {
66+
return lst->ultimo->dado;
67+
}
68+
69+
TLista insertLista(TLista lst,int i, int dado) {
70+
int tam = lenLista(lst);
71+
72+
if((i < 0) || (i > tam)) return NULL;
73+
74+
if(lenLista(lst) == 0)
75+
appendLista(lst,dado);
76+
else
77+
if(i==tam)
78+
appendLista(lst,dado);
79+
else {
80+
if(i == 0) {
81+
pnoh novono = (tipoNo *)malloc(sizeof(tipoNo));
82+
novono->dado = dado;
83+
84+
novono->proximo = lst->primeiro;
85+
lst->primeiro = novono;
86+
}
87+
else {
88+
pnoh novono = (tipoNo *)malloc(sizeof(tipoNo));
89+
novono->dado = dado;
90+
91+
pnoh aux = lst->primeiro;
92+
int pos = 0;
93+
94+
while(pos != (i - 1)){
95+
aux = aux->proximo;
96+
pos++;
97+
}
98+
novono->proximo = aux->proximo;
99+
aux->proximo = novono;
100+
}
101+
102+
lst->tamanho++;
103+
}
104+
105+
return lst;
106+
}
107+
108+
int infoLista(TLista lst,int i) {
109+
int tam = lenLista(lst);
110+
111+
if((tam == 0) || (i < 0) || (i > tam))
112+
return NULL;
113+
114+
if(i == 0) return lst->primeiro->dado;
115+
116+
else if(i == tam - 1) return lst->ultimo->dado;
117+
else {
118+
pnoh aux = lst->primeiro;
119+
int pos = 0;
120+
121+
while(pos != i){
122+
aux = aux->proximo;
123+
pos++;
124+
}
125+
126+
return aux->dado;
127+
}
128+
}
129+
130+
int removeLista(TLista lst,int i) {
131+
int tam = lenLista(lst);
132+
133+
if((i < 0) || (i > tam) || (tam == 0)) return NULL;
134+
135+
if(tam == 1) {
136+
pnoh aux = lst->primeiro;
137+
lst->primeiro = NULL;
138+
lst->ultimo = NULL;
139+
lst->tamanho--;
140+
141+
int d =aux->dado;
142+
free(aux);
143+
144+
return d;
145+
}
146+
else {
147+
if(i == 0){
148+
pnoh aux = lst->primeiro;
149+
lst->primeiro = aux->proximo;
150+
lst->tamanho--;
151+
152+
int d =aux->dado;
153+
free(aux);
154+
155+
return d;
156+
}
157+
else {
158+
if(i == tam - 1) {
159+
pnoh aux = lst->ultimo;
160+
161+
pnoh penultimo = lst->primeiro;
162+
int pos = 0;
163+
164+
while(pos != i-1){
165+
penultimo = penultimo->proximo;
166+
pos++;
167+
}
168+
169+
penultimo->proximo = NULL;
170+
lst->ultimo = penultimo;
171+
172+
lst->tamanho--;
173+
174+
int d =aux->dado;
175+
free(aux);
176+
177+
return d;
178+
}
179+
else {
180+
pnoh anterior = lst->primeiro;
181+
int pos = 0;
182+
183+
while(pos != i-1){
184+
anterior = anterior->proximo;
185+
pos++;
186+
}
187+
188+
pnoh aux = anterior->proximo;
189+
anterior->proximo = aux->proximo;
190+
lst->tamanho--;
191+
192+
int d = aux->dado;
193+
free(aux);
194+
195+
return d;
196+
}
197+
}
198+
}
199+
}
200+
201+
int indexLista(TLista lst, int dado){
202+
int tam = lenLista(lst);
203+
int i;
204+
int dadolst;
205+
206+
if(tam == 0) return -1;
207+
208+
i = 0;
209+
dadolst = infoLista(lst,i);
210+
while((i < tam) && (dado != dadolst)){
211+
i++;
212+
dadolst = infoLista(lst,i);
213+
}
214+
215+
if(i < tam) return i;
216+
else return -1;
217+
}
218+
219+
TLista clearLista(TLista lst){
220+
int tam = lenLista(lst);
221+
222+
if(tam == 0) return lst;
223+
224+
while(lenLista(lst) > 0)
225+
removeLista(lst,0);
226+
227+
return lst;
228+
}
229+
230+
TLista clonaLista(TLista lst){
231+
TLista clone = criaLista();
232+
int tam = lenLista(lst);
233+
234+
if(tam == 0) return clone;
235+
236+
for(int i=0;i < tam; i++)
237+
appendLista(clone,infoLista(lst,i));
238+
239+
return clone;
240+
}
241+
242+
int main(){
243+
TLista lista = criaLista();
244+
appendLista(lista, 3);
245+
appendLista(lista, 5);
246+
appendLista(lista, 7);
247+
printf("Lista criada e adicionado 3 numeros\n");
248+
int tamanho = lenLista(lista);
249+
int primeiro = primLista(lista);
250+
int ultimo = ultLista(lista);
251+
int valor = infoLista(lista, 1);
252+
printf("Tamanho da lista: %d\nPrimeiro da Lista: %d\nUltimo da Lista: %d\nSegundo valor: %d\n", tamanho, primeiro, ultimo, valor);
253+
insertLista(lista, 2, 6);
254+
valor = infoLista(lista, 2);
255+
printf("Adicionando 6 na posição 2: %d\n", valor);
256+
removeLista(lista, 1);
257+
tamanho = lenLista(lista);
258+
printf("Novo tamanho após adicionar e remover: %d\n", tamanho);
259+
int index = indexLista(lista, 3);
260+
printf("Index do elemento com valor 3 na lista: %d\n", index);
261+
TLista cloneLista = clonaLista(lista);
262+
printf("Lista Duplicada\n");
263+
clearLista(lista);
264+
265+
printf("Lista Apagada");
266+
267+
return 0;
268+
}

0 commit comments

Comments
 (0)