-
Notifications
You must be signed in to change notification settings - Fork 0
/
celda.cpp
162 lines (145 loc) · 3.21 KB
/
celda.cpp
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
#include "celda.hh"
#include "columna.hh"
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
union _unionTipo {
int datoInt;
char *datoStr;
};
struct _strCelda {
tipoU dato;
Celda sig;
};
Celda crearCelda() {
Celda cel = new _strCelda();
cel->sig = NULL;
return cel;
}
Celda agregarCelda(Celda listaCel) {
Celda nueva = crearCelda();
nueva->sig = listaCel;
listaCel = nueva;
return listaCel;
}
void setDatoInt(Celda &cel, int dato) {
cel->dato.datoInt = dato;
}
void setDatoStr(Celda &cel, char *dato) {
cel->dato.datoStr = dato;
}
int getDatoInt(Celda cel) {
return cel->dato.datoInt;
}
char *getDatoStr(Celda cel) {
return cel->dato.datoStr;
}
Celda getCeldaSig(Celda cel) {
return cel->sig;
}
void setCeldaSig(Celda cel, Celda sig) {
cel->sig = sig;
}
bool pkDuplicada(Celda listaCel, char *dato) {
if (listaCel == NULL) {
return false;
} else if (listaCel->dato.datoStr == dato || listaCel->dato.datoInt == atoi(dato)) {
return true;
} else {
return pkDuplicada(listaCel->sig, dato);
}
}
void insertarCeldaIndice(Celda &listaCel, bool esEntero, char *dato, int indice) {
Celda actual = listaCel;
Celda anterior = NULL;
for (int i = indice; i > 0; i--) {
anterior = actual;
actual = actual->sig;
}
Celda nueva = crearCelda();
if (esEntero) {
setDatoInt(nueva, atoi(dato));
} else {
setDatoStr(nueva, dato);
}
if (anterior == NULL) {
setCeldaSig(nueva, actual);
listaCel = nueva;
} else {
setCeldaSig(anterior, nueva);
setCeldaSig(nueva, actual);
}
}
int insertarCeldaOrdenada(Celda &listaCel, bool esEntero, char *dato) {
Celda nueva = crearCelda();
if (esEntero) {
setDatoInt(nueva, atoi(dato));
} else {
setDatoStr(nueva, dato);
}
Celda actual = listaCel;
Celda anterior = NULL;
int indice = 0;
if (listaCel == NULL) {
listaCel = nueva;
} else {
if (esEntero) {
while (actual != NULL && getDatoInt(actual) < atoi(dato)) {
anterior = actual;
actual = getCeldaSig(actual);
indice++;
}
} else {
while (actual != NULL && strcmp(getDatoStr(actual), dato) < 0) {
anterior = actual;
actual = getCeldaSig(actual);
indice++;
}
}
if (anterior == NULL) {
setCeldaSig(nueva, actual);
listaCel = nueva;
} else {
setCeldaSig(anterior, nueva);
setCeldaSig(nueva, actual);
}
}
return indice;
}
int cantidadTuplas(Celda listaCel) {
if (listaCel != NULL) {
return 1 + cantidadTuplas(listaCel->sig);
} else {
return 0;
}
}
void eliminarCeldasCol(Celda &listaCel) {
if (listaCel != NULL) {
eliminarCeldasCol(listaCel->sig);
delete listaCel;
}
listaCel = NULL;
}
void eliminarCelda(Celda &cel, int indice) {
Celda aux = cel;
Celda anterior = NULL;
if (aux != NULL) {
for (int i = 0; i < indice; i++) {
anterior = aux;
aux = getCeldaSig(aux);
}
if (anterior == NULL) {
cel = getCeldaSig(cel);
delete aux;
} else {
if (getCeldaSig(aux) == NULL) {
setCeldaSig(anterior, NULL);
delete aux;
} else {
setCeldaSig(anterior, getCeldaSig(aux));
delete aux;
}
}
}
}