-
Notifications
You must be signed in to change notification settings - Fork 0
/
ListaEnlazadaRango.h
374 lines (341 loc) · 8.76 KB
/
ListaEnlazadaRango.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
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
#include <stdio.h>
#include <stdlib.h>
/*------------- estructura de datos -------------*/
typedef struct nodoGenerico
{
int inicio; //inicio de rango
int fin; //fin de rango
struct nodoGenerico* siguiente;
}nodo;
typedef struct listaGenerica
{
nodo* inicio;
}TDAlista;
/*------------- operaciones -------------*/
//crea una lista vacia
TDAlista* crearListaVacia()
{
TDAlista* lista=(TDAlista*)malloc(sizeof(TDAlista));
lista->inicio=NULL;
return lista;
}
//verificar si es lista vacia, retorna 1 si es vacia, 0 si no
int esListaVacia(TDAlista* lista)
{
if (lista->inicio == NULL)
return 1;
else
return 0;
}
//Muestra en pantalla los nodos.
void recorrerLista(TDAlista* lista)
{
if (!esListaVacia(lista))
{
nodo* auxiliar=lista->inicio;
while (auxiliar!=NULL)
{
printf("%d ",auxiliar->inicio);
printf("%d ",auxiliar->fin);
printf("\n");
auxiliar=auxiliar->siguiente;
}
}
else
printf("La lista esta vacia\n");
}
//Inserta un nodo al inicio de la lista
void insertarInicio(TDAlista* lista, int dato1, int dato2)
{
nodo* nuevo=(nodo*)malloc(sizeof(nodo));
nuevo->inicio=dato1;
nuevo->fin=dato2;
nuevo->siguiente = lista->inicio;
lista->inicio=nuevo;
}
//Insertar nodo al final de la lista
void insertarNodoFinal(TDAlista* lista, int dato1, int dato2){
if (!esListaVacia(lista)){
nodo* auxiliar=lista->inicio;
//insertar nodo al final de lista
while (auxiliar->siguiente!=NULL){
auxiliar=auxiliar->siguiente;
}
nodo* nuevo=(nodo*)malloc(sizeof(nodo));
nuevo->inicio=dato1;
nuevo->fin=dato2;
nuevo->siguiente=NULL;
auxiliar->siguiente=nuevo;
}
else{
insertarInicio(lista,dato1, dato2);
}
}
//eliminar el primer nodo de la lista
void eliminarInicio(TDAlista* lista)
{
nodo* auxiliar;
if(!esListaVacia(lista))
{
auxiliar=lista->inicio;
lista->inicio=lista->inicio->siguiente;
free(auxiliar);
}
}
//Eliminar nodo al final de la lista.
void eliminarFinal(TDAlista* lista){
if (!esListaVacia(lista)){
nodo* auxiliar=lista->inicio;
while (auxiliar->siguiente->siguiente!=NULL){
auxiliar=auxiliar->siguiente;
}
free(auxiliar->siguiente);
auxiliar->siguiente=NULL;
}
else{
printf("La lista esta vacia\n");
}
}
//liberar la lista
void liberarLista(TDAlista* lista){
while(!esListaVacia(lista)){
eliminarInicio(lista);
}
}
//buscar por fin de rango el valor dado
int buscarPorFin(TDAlista* lista, int dato){
if (!esListaVacia(lista))
{
nodo* auxiliar=lista->inicio;
while (auxiliar!=NULL)
{
if (dato==auxiliar->fin){
return 1;
}
auxiliar=auxiliar->siguiente;
}
free(auxiliar);
}
else{
printf("La lista esta vacia\n");
}
return 0;
}
//Obtener cantidad de nodos totales de la lista
int obtenerNumeroNodos(TDAlista* lista){
int contador=0;
if (!esListaVacia(lista))
{
nodo* auxiliar=lista->inicio;
while (auxiliar!=NULL)
{
contador++;
auxiliar=auxiliar->siguiente;
}
return contador;
}
else
printf("La lista esta vacia\n");
return 0;
}
//Insertar nodo despues del final de un rango especifico
void insertarNodoDespuesPorFin(TDAlista* lista, int inicio, int fin, int datoAnterior){
if (!esListaVacia(lista)){
nodo* auxiliar=lista->inicio;
//insertar nodo despues de un dato
while (auxiliar->fin!=datoAnterior){
auxiliar=auxiliar->siguiente;
//si estamos al final y no se encuentra el dato hacer break
if (auxiliar==NULL){
printf("**Error en funcion insertarNodoDespues, no se ha encontrado el datoAnterior.\n");
break;
}
}
nodo* nuevo=(nodo*)malloc(sizeof(nodo));
nuevo->inicio=inicio;
nuevo->fin=fin;
nuevo->siguiente=auxiliar->siguiente;
auxiliar->siguiente=nuevo;
}
else{
//insertarInicio(lista,dato);
printf("**Error en funcion insertarNodoDespues, la lista esta vacia.\n");
}
}
//Eliminar nodo que contanga un inicio de rango especificado.
void eliminarDatoPorInicio(TDAlista* lista, int dato){
if (!esListaVacia(lista)){
if(obtenerNumeroNodos(lista) >= 2){
//Se recorre con 2 punteros, contiguos.
nodo* auxiliar=lista->inicio;
nodo* siguiente = auxiliar->siguiente;
//eliminar nodo con dato coincidente
//En caso que este al inicio
if(auxiliar->inicio == dato){
eliminarInicio(lista);
}
//En otro caso
while (siguiente != NULL){
if (siguiente->inicio == dato){
auxiliar->siguiente = siguiente->siguiente;
siguiente = NULL;
printf("Se elimino el nodo con inicio %d\n",dato);
break;
}
auxiliar = siguiente;
siguiente = siguiente->siguiente;
}
}
}
else{
printf("La lista esta vacia\n");
}
}
//eliminar nodo que contenga un fin de rango especificado
void eliminarDatoPorFin(TDAlista* lista, int dato){
if (!esListaVacia(lista)){
if(obtenerNumeroNodos(lista) >= 2){
//Se recorre con 2 punteros, contiguos.
nodo* auxiliar=lista->inicio;
nodo* siguiente = auxiliar->siguiente;
//eliminar nodo con dato coincidente
//En caso que este al inicio
if(auxiliar->fin == dato){
eliminarInicio(lista);
}
//En otro caso
while (siguiente != NULL){
if (siguiente->fin == dato){
auxiliar->siguiente = siguiente->siguiente;
siguiente = NULL;
printf("Se elimino el nodo con fin %d \n",dato);
break;
}
auxiliar = siguiente;
siguiente = siguiente->siguiente;
}
}
}
else{
printf("La lista esta vacia\n");
}
}
//obtener nodo de una posición especificada (recordar igualar a otro nodo)
nodo* obtenerNodo(TDAlista* lista, int posicion){
if (!esListaVacia(lista)){
nodo* auxiliar=lista->inicio;
int contador=0;
while (auxiliar!=NULL){
if (contador==posicion-1){
return auxiliar;
}
contador++;
auxiliar=auxiliar->siguiente;
}
}
else{
printf("La lista esta vacia\n");
}
return NULL;
}
//crear una función de ordenamiento por selección.
void swap(nodo* nodo1, nodo* nodo2){
int iniaux= nodo2->inicio;
int finaux= nodo2->fin;
nodo2->inicio=nodo1->inicio;
nodo2->fin=nodo1->fin;
nodo1->inicio=iniaux;
nodo1->fin=finaux;
}
nodo* buscarMenorNodo(TDAlista* lista, int posini){
printf("Entrando a menor nodo\n");
if (!esListaVacia(lista)){
nodo* auxiliar=lista->inicio;
int contador=0;
printf("entrando al while de menor nodo\n");
while (contador!=posini){
printf("While\n");
contador++;
auxiliar=auxiliar->siguiente;
printf("Auxiliar: %d\n",auxiliar);
}
printf("Fuera del while\n");
//aqui llegamos a la posición inicial
nodo* menor = auxiliar;
while (auxiliar->siguiente!=NULL){
//inicio es el inicio del rango de tiempo
if (auxiliar->inicio < menor->inicio){
menor=auxiliar;
}
auxiliar=auxiliar->siguiente;
}
return menor;
}
else{
printf("La lista esta vacia\n");
}
return NULL;
}
void seleccion(TDAlista* lista){
nodo* temporal = lista->inicio;
nodo* minimo;
nodo* minimosig;
while (temporal!=NULL){ //designa el largo de la lista.
minimo=temporal;
minimosig= temporal->siguiente;
while (minimosig!=NULL){ //buscar el minimo de los nodos.
if(minimo->inicio>minimosig->inicio){ //comparación
minimo=minimosig;
}
minimosig=minimosig->siguiente;
}
swap(temporal,minimo); //cambio de nodos
temporal=temporal->siguiente;
}
}
/*
//Crear función para guardar todas las horas disponibles en una lista.
void guardarHoras(TDAlista* listaoriginal, TDAlista* nuevo){
nodo* temporal = listaoriginal->inicio;
int ini;
int fin;
int nodos= obtenerNumeroNodos(listaoriginal);
int i;
for i=0;i<nodos;i++{
ini= listaoriginal->inicio
fin->listaoriginal->fin;
temporal=temporal->siguiente;
}
}
*/
//crear función para abrir archivo.
void ingresardatos(char *nombrearchivo, TDAlista *lista){
FILE *archivo;
archivo = fopen(nombrearchivo, "r");
int dato1, dato2;
if(archivo == NULL){
printf("No se pudo abrir el archivo\n");
}else{
while(!feof(archivo)){
fscanf(archivo, "%d %d", &dato1, &dato2);
insertarNodoFinal(lista, dato1, dato2);
}
eliminarInicio(lista);
fclose(archivo);
}
}
//crear una función que escriba en un archivo los datos de la lista.
void escribirdatos(char *nombrearchivo, TDAlista *lista){
FILE *archivo;
archivo = fopen(nombrearchivo, "w");
nodo* temporal = lista->inicio;
if(archivo == NULL){
printf("No se pudo abrir el archivo\n");
}else{
while(temporal != NULL){
fprintf(archivo, "%d %d\n", temporal->inicio, temporal->fin);
temporal = temporal->siguiente;
}
fclose(archivo);
}
}