-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathList.c
141 lines (114 loc) · 3.83 KB
/
List.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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include "List.h"
void createL(LIST** list)
{
*list = NULL;
return;
}
int isin(char nombre[], LIST** list)
{
LIST* lst_aux = (*list);
// Ya sabemos que la primer letra es la misma que la del nombre; por haber usado un vector con cada nombre que inicie ordenado por codigo ASCII de la letra.
while (lst_aux != NULL && lst_aux->valor.nombre[2] < nombre[2]) {
lst_aux = lst_aux->next;
}
while (lst_aux != NULL && lst_aux->valor.nombre[2] == nombre[2] && lst_aux->valor.nombre[3] < nombre[3]) {
lst_aux = lst_aux->next;
}
while (lst_aux != NULL && strcmp(lst_aux->valor.nombre, nombre) < 0) {
lst_aux = lst_aux->next;
}
if (lst_aux != NULL && strcmp(lst_aux->valor.nombre, nombre) == 0) { // Se encontraba en la lista:
return lst_aux->valor.id;
}
return -1;
}
void insertOrdered(ID_X_NOMBRE valor, LIST** list)
{
LIST* newNode = malloc(sizeof(LIST));
newNode->valor = valor;
newNode->next = NULL;
LIST* auxList = *list;
LIST* prevNode = NULL;
// Ya sabemos que la primer letra es la misma que la del nombre; por haber usado un vector con cada nombre que inicie ordenado por codigo ASCII de la letra.
while (auxList != NULL && auxList->valor.nombre[2] < valor.nombre[2]) {
prevNode = auxList;
auxList = auxList->next;
}
while (auxList != NULL && auxList->valor.nombre[2] == valor.nombre[2] && auxList->valor.nombre[3] < valor.nombre[3]) {
prevNode = auxList;
auxList = auxList->next;
}
while (auxList != NULL && strcmp(auxList->valor.nombre, valor.nombre) < 0) {
prevNode = auxList;
auxList = auxList->next;
}
if (prevNode != NULL) {
prevNode->next = newNode;
} else {
*list = newNode;
}
newNode->next = auxList;
return;
}
int deleteByName(char nombre[], LIST** list)
{
LIST* auxList = (*list);
LIST* prevNode = NULL;
// Ya sabemos que la primer letra es la misma que la del nombre; por haber usado un vector con cada nombre que inicie ordenado por codigo ASCII de la letra.
while (auxList != NULL && auxList->valor.nombre[2] < nombre[2]) {
prevNode = auxList;
auxList = auxList->next;
}
while (auxList != NULL && auxList->valor.nombre[2] == nombre[2] && auxList->valor.nombre[3] < nombre[3]) {
prevNode = auxList;
auxList = auxList->next;
}
while (auxList != NULL && strcmp(auxList->valor.nombre, nombre) < 0) {
prevNode = auxList;
auxList = auxList->next;
}
// Si strcmp(auxList->valor.nombre, nombre) es >= 0 Y auxList->valor.nombre != nombre, el nombre no se encontraba en la base de datos.
if (auxList == NULL || strcmp(auxList->valor.nombre, nombre) != 0) {
return -1;
} // Sino, se elimina el valor de la lista:
int id = auxList->valor.id;
if (prevNode != NULL) {
prevNode->next = auxList->next;
} else {
*list = auxList->next;
}
free(auxList);
// Y se retorna la ID buscada:
return id;
}
void modifyName(char nombre[], char nuevoNombre[], LIST** list)
{
LIST* lst_aux = (*list);
// Ya sabemos que la primer letra es la misma que la del nombre; por haber usado un vector con cada nombre que inicie ordenado por codigo ASCII de la letra.
while (lst_aux != NULL && lst_aux->valor.nombre[2] < nombre[2]) {
lst_aux = lst_aux->next;
}
while (lst_aux != NULL && lst_aux->valor.nombre[2] == nombre[2] && lst_aux->valor.nombre[3] < nombre[3]) {
lst_aux = lst_aux->next;
}
while (lst_aux != NULL && strcmp(lst_aux->valor.nombre, nombre) < 0) {
lst_aux = lst_aux->next;
}
// Ya sabemos que lo va a encontrar porque fue comprobado antes de ejecutar esta funcion.
strcpy(lst_aux->valor.nombre, nuevoNombre);
return;
}
void clearL(LIST** list)
{
LIST* recNode;
while (*list != NULL) {
recNode = *list;
*list = (*list)->next;
free(recNode);
}
return;
}