-
Notifications
You must be signed in to change notification settings - Fork 0
/
Lista Circular.c
218 lines (203 loc) · 6.02 KB
/
Lista Circular.c
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
/////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA 5
typedef struct SNoh{
int valor;
struct SNoh *prox;
}SNoh;
typedef SNoh *NohPtr;
void ExibeLista(NohPtr inicio);
NohPtr Insercao(NohPtr inicio,int valor);
NohPtr Remocao(NohPtr inicio,int valor);
int main(){
setlocale(LC_ALL,"");
int valor,escolhaMenu;
NohPtr inicio = NULL;
MENU:
printf("\n+++++++++++++++++++++++");
printf("\n+\tEscolha uma operação ==>");
printf("\n+\t\t0 - Encerra o programa");
printf("\n+\t\t1 - Exibir lista circular");
printf("\n+\t\t2 - Inserção");
printf("\n+\t\t3 - Remoção");
printf("\n>> ");
scanf("%d",&escolhaMenu);
switch(escolhaMenu){
case 0:{
printf("\n\nFechando programa...");
return 0;
}
case 1:{
if(inicio == NULL) printf("\nNenhum elemento a ser exibido.\nRetornando ao menu...");
else ExibeLista(inicio);
break;
}
case 2:{
NohPtr p=inicio;
printf("\nDigite um inteiro a ser inserido na lista: ");
scanf("%d",&valor);
if(p == NULL){
inicio = Insercao(inicio,valor);
break;
}
else if((*p).valor == valor){
printf("\nElemento já inserido na lista.\nRetornando ao menu...");
break;
}
else{
p = inicio;
while((*p).prox != inicio){
if(valor == (*p).valor){
printf("\nElemento já inserido, favor inserir outro.\nRetornando ao menu...");
break;
}
else p = (*p).prox;
}
printf("\nIniciando inserção.");
inicio = Insercao(inicio,valor);
}
break;
}
case 3:{
if(inicio == NULL) printf("\nNenhum elemento a ser removido.\nRetornando ao menu...");
else{
printf("\nDigite o elemento a ser removido da lista: ");
scanf("%d",&valor);
NohPtr p=inicio;
if((*p).valor == valor){
printf("\nIniciando remoção.");
inicio = Remocao(inicio,valor);
break;
}
else{
while((*p).valor != valor){
p = (*p).prox;
if((*p).valor == valor){
printf("\nIniciando remoção.");
inicio = Remocao(inicio,valor);
break;
}
else if(p == inicio){
printf("\nElemento não encontrado.");
break;
}
}
}
}
break;
}
default:{
printf("\nInválido. Retornando ao Menu...");
break;
}
}
goto MENU;
}
void ExibeLista(NohPtr inicio){
NohPtr p;
p = inicio;
printf("\nImprimindo lista circular:\n");
do{
printf("%d\t",(*p).valor);
p = (*p).prox;
}while((*p).prox != (*inicio).prox); // QUANDO O PRÓXIMO ELEMENTO FOR DIFERENTE DO PRÓXIMO DO INÍCIO. kjkjkjk
}
NohPtr Insercao(NohPtr inicio,int valor){
NohPtr p,novoNoh;
if(inicio == NULL){
novoNoh = (NohPtr)malloc(sizeof(SNoh));
(*novoNoh).valor = valor;
(*novoNoh).prox = novoNoh;
inicio = novoNoh;
printf("\nPrimeiro elemento inserido.\nRetornando ao menu...");
return inicio;
}
else{
p = inicio;
while((*p).prox != inicio) // PERCORRE ATÉ O FINAL DA LISTA
p = (*p).prox;
if(valor > (*p).valor){ // VALOR É O MAIOR DO QUE O ÚLTIMO ELEMENTO DA LISTA ?
novoNoh = (NohPtr)malloc(sizeof(SNoh));
(*novoNoh).valor = valor;
(*novoNoh).prox = inicio; // lista circular
(*p).prox = novoNoh; // o anterior passa a ter como próximo o novoNoh
printf("\nElemento inserido ao final da lista.\nRetornando ao menu...");
}
else{ // DO CONTRÁRIO...
p = inicio; // VOLTANDO AO PRIMEIRO ELEMENTO
if(valor < (*p).valor){ // VALOR É O MENOR DA LISTA? (ENQUEUE)
novoNoh = (NohPtr)malloc(sizeof(SNoh));
(*novoNoh).valor = valor;
(*novoNoh).prox = p;
NohPtr aux;
aux = inicio; // AGORA PRECISA PERCORRER ATÉ O FINAL ...
while((*aux).prox != inicio)
aux = (*aux).prox;
(*aux).prox = novoNoh; // ... INDICAR QUE O PRÓXIMO É O NOVO ELEMENTO ...
inicio = novoNoh; // ... E ATUALIZAR O INICIO
printf("\nElemento inserido ao início da lista.\nRetornando ao menu...");
}
else{ // NÃO É O MENOR NEM O MAIOR DA LISTA
NohPtr nohAtual,nohAnterior;
nohAtual = inicio;
while(valor > (*nohAtual).valor){
if((*nohAtual).prox != inicio){
nohAnterior = nohAtual; //salvando o nó anterior
nohAtual = (*nohAtual).prox; // passando o próximo
}
} // quando sair, o valor terá encontrado um elemento maior que ele da lista
novoNoh = (NohPtr)malloc(sizeof(SNoh));
(*novoNoh).valor = valor;
(*novoNoh).prox = nohAtual; // inserindo no meio ...
(*nohAnterior).prox = novoNoh; // ... e apontando o anterior para o novo
printf("\nElemento inserido ao meio da lista.\nRetornando ao menu...");
}
}
}
return inicio;
}
NohPtr Remocao(NohPtr inicio,int valor){
if((*inicio).prox == inicio){
free(inicio);
inicio = NULL;
printf("\nRemovido único elemento da lista.\nRetornando ao menu...");
}
else{
NohPtr nohAtual;
nohAtual = inicio;
if((*inicio).valor == valor){ // é o primeiro?
nohAtual = (*nohAtual).prox;
free(inicio);
inicio = nohAtual;
(*nohAtual).prox = inicio;
printf("\nRemovido primeiro elemento da lista.\nRetornando ao menu..."); // YEEEEEEEEEEEEEEEEEEEEESSSSSSSSSSSSSSSSSSSSSSSSSSSS
}
else{
NohPtr nohAnterior;
while((*nohAtual).prox != inicio){
nohAnterior = nohAtual; //salvando o nó anterior
nohAtual = (*nohAtual).prox; // passando o próximo
} // quando sair, o nohAtual será o último (antes do inicio)
if((*nohAtual).valor == valor){ // é o último?
free(nohAtual); // liberamos o último
(*nohAnterior).prox = inicio; // e o anterior, agora último, será apontado para o começo
printf("\nRemovido último elemento da lista.\nRetornando ao menu...");
}
else{ // é remoção no meio
nohAtual = inicio;
while(valor != (*nohAtual).valor){
if((*nohAtual).prox != inicio){
nohAnterior = nohAtual; //salvando o nó anterior
nohAtual = (*nohAtual).prox; // passando o próximo
}
} // quando sair, o valor terá encontrado o elemento igual a ele na lista
(*nohAnterior).prox = (*nohAtual).prox;
free(nohAtual);
printf("\nElemento removido ao meio da lista.\nRetornando ao menu...");
}
}
}
return inicio;
}