-
Notifications
You must be signed in to change notification settings - Fork 0
/
lista-encadeada.h
171 lines (153 loc) · 4.63 KB
/
lista-encadeada.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <stdio.h>
#include <stdlib.h>
//Struct que representa um elemento de uma lista.
typedef struct linked_list
{
//Valor do elemento.
int value;
//Ponteiro para o proximo elemento na lista.
struct linked_list* next;
} llist;
//Insere elemento na primeira posicao de uma lista.
void laddToStart(llist** aList, int add)
{
//Criando elemento da lista. newElement e um ponteiro para esse elemento
llist* newElement =
(llist*) malloc(sizeof(llist));
//Modificando informacao do elemento
newElement->value = add; //ok
newElement->next = *aList; //Novo elemento aponta para o segundo elemento (que antes era o primeiro)
*aList = newElement; //Ponteiro apontado por aList (inicio da cadeia) comeca a apontar para esse novo elemento
}
//Insere elemento na posicao da lista indicada.
void linsert(llist** aList, int index, int add)
{
//Criando elemento da lista. newElement e um ponteiro para esse elemento
llist* newElement =
(llist*) malloc(sizeof(llist));
//Modificando informacao do elemento
newElement->value = add;
//Elementos analisados durante busca
llist* before = NULL;
llist* current = *aList;
for(int i = 0; i <= index; i++)
{
//Encontrado
if(i == index)
{
newElement->next = current; //O novo elemento passa a apontar para o que esta no indice
//O anterior passa a apontar para o novo elemento
if(index != 0) before->next = newElement; //Mudando o ponteiro do anterior para o posterior
else *aList = newElement; //Caso o elemento seja o primeiro da lista, mudamos a quem aponta o ponteiro inicial
}
//Nao Encontrado
else
{
before = current;
current = current->next;
}
}
}
//Troca o valor do elemento na posicao da lista indicada.
void lchange(llist** aList, int index, int change)
{
//Elementos analisados durante busca
llist* current = *aList;
for(int i = 0; i <= index; i++)
{
//Encontrado
if(i == index)
{
current->value = change;
}
//Nao Encontrado
else
{
current = current->next;
}
}
}
//Apaga um elemento numa posicao da lista
void lerase(llist** aList, int index)
{
llist* before = NULL;
llist* current = *aList;
for(int i = 0; i <= index; i++)
{
//Encontrado
if(i == index)
{
if(index != 0) before->next = current->next; //Mudando o ponteiro do anterior para o posterior
else *aList = current->next; //Caso o elemento seja o primeiro da lista, mudamos a quem aponta o ponteiro inicial
free(current); //Apagando o atual da memoria
}
//Nao Encontrado
else
{
before = current;
current = current->next;
}
}
}
//Cria uma lista com elemento inicial de valor especificado.
llist* lcreate(int add)
{
//Cria o ponteiro para o primeiro elemento da lista encadeada
llist* l = (llist*) malloc(sizeof(llist));
l->value = add;
l->next = NULL;
return l;
}
//Retorna o valor de um elemento numa lista na posicao index.
int lget(llist* aList, int index)
{
for(int i = 0; i <= index; i++)
{
if(i == index) return aList->value;
else aList = aList->next;
}
}
//Retorna o ponteiro para um elemento numa lista com posicao index. Caso o elemento nao exista, retorna NULL.
llist* lgetPointer(llist* aList, int index)
{
for (int i = 0; i <= index; i++)
{
if (i == index) return aList;
else aList = aList->next;
}
return NULL;
}
//Retorna o indice do primeiro elemento de valor value. Retorna -1 caso nao exista.
int lfind(llist* aList, int value)
{
for(int i = 0; aList != NULL; i++)
{
if(aList->value == value) return i;
else aList = aList->next;
}
return -1;
}
//Retorna o ponteiro do primeiro elemento de valor value. Retorna NULL caso nao exista.
llist* lfindPointer(llist* aList, int value)
{
for (int i = 0; aList != NULL; i++)
{
if (aList->value == value) return aList;
else aList = aList->next;
}
return NULL;
}
//Imprime uma lista.
void lprint(llist* aList)
{
printf("{");
for(int i = 0; aList != NULL; i++)
{
if(aList->next != NULL)
printf("%d, ", aList->value);
else
printf("%d", aList->value);
aList = aList->next;
}
printf("}");
}