-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharreglo.h
153 lines (123 loc) · 3.35 KB
/
arreglo.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
#ifndef ARREGLO_H
#define ARREGLO_H
/** Declaración **/
#include <iostream>
template <class T> // Declaramos la plantilla
class Arreglo {
private:
T *arreglo; // arreglo de tipo plantilla
size_t tam; // tamaño
size_t cont; // contador
const static size_t TAM_MAX = 100; // total arreglo
void expandir(); // expande arreglo
public:
Arreglo(); // constructor
~Arreglo(); // destructor
size_t size(); // trae tamaño arreglo
/* Inserciones al arreglo */
void insertar(const T&, size_t);
void insertarInicio(const T&);
void insertarFinal(const T&);
/* Eliminaciones al arreglo */
void eliminar(size_t);
void eliminarInicio();
void eliminarFinal();
/* Operadores logicos */
T operator[](size_t p) {
return arreglo[p];
}
};
/** Implementación **/
using namespace std;
template <class T>
void Arreglo<T>::expandir() {
T *nuevo = new T[tam+TAM_MAX];
/* Respaldamos al nuevo arreglo */
for(size_t i=0;i<cont;i++) {
nuevo[i] = arreglo[i];
}
delete[] arreglo; // borramos el arreglo viejo
arreglo = nuevo; // copia direcciones de memoria
tam+=TAM_MAX; // duplicamos tamaño
}
template <class T>
Arreglo<T>::Arreglo() {
arreglo = new T[TAM_MAX];
cont = 0;
tam = TAM_MAX;
}
template <class T>
Arreglo<T>::~Arreglo() {
delete[] arreglo;
}
template <class T>
void Arreglo<T>::insertar(const T &s, size_t p) {
if(p>=cont) { // ¿Posición valida?
cout << "Posicion ivalida" << endl;
return; // terminamos la función
}
if(cont==tam) { // ¿Esta lleno?
expandir(); // expandimos arreglo
}
for(size_t i=cont;i>p;i--) { // movemos arreglo
arreglo[i] = arreglo[i-1]; // movemos el elemento para liberar pos
}
arreglo[p] = s; // asignamos el elemento
cont++;
}
template <class T>
void Arreglo<T>::insertarInicio(const T &s) {
if(cont==tam) { // ¿Esta lleno?
expandir(); // expandimos arreglo
}
/* Insertamos al inicio */
for(size_t i=cont;i>0;i--) { // movemos arreglo
arreglo[i] = arreglo[i-1]; // hacia derecha
}
arreglo[0] = s;
cont++;
}
template <class T>
void Arreglo<T>::insertarFinal(const T &s) {
if(cont==tam) { // ¿Esta lleno?
expandir(); // expandimos arreglo
}
/* Insertamos al final */
arreglo[cont] = s;
cont++;
}
template <class T>
void Arreglo<T>::eliminar(size_t p) {
if(cont==0) { // ¿Esta vacio?
cout << "Arreglo vacio" << endl;
return; // terminamos la funcion
}
for(size_t i=p;i<cont-1;i++) { // movemos el arreglo
arreglo[i] = arreglo[i+1]; // copiamos la la posicion a la derecha
}
cont--; // reducimos contador
}
template <class T>
void Arreglo<T>::eliminarInicio() {
if(cont==0) { // ¿Esta vacio?
cout << "Arreglo vacio" << endl;
return; // terminamos la funcion
}
for(size_t i=0;i<cont-1;i++) { // movemos arreglo
arreglo[i] = arreglo[i+1]; // limpiamos pos a la izquierda
}
cont --; // reducimos contador
}
template <class T>
void Arreglo<T>::eliminarFinal() {
if(cont==0) { // ¿Esta vacio?
cout << "Arreglo vacio" << endl;
return; // terminamos la funcion
}
cont--; // reducimos el contador
}
template <class T>
size_t Arreglo<T>::size() {
return cont; // Elementos del arreglo
}
#endif