-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathuColaIntegerMod.pas
173 lines (144 loc) · 4.98 KB
/
uColaIntegerMod.pas
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
unit uColaIntegerMod;
interface
type
// Estructura del nodo
nodo = record
info: integer; // Información almacenada en el nodo
sig: ^nodo; // Puntero al siguiente nodo
end;
// Estructura de la cola
tCola = record
first, last: ^nodo; // Punteros al primer y último nodo
{Ejercicio 2.1: Modificar la definición de la cola}
size: integer; // Tamaño de la cola
end;
{ --- Operaciones básicas de la cola --- }
procedure initialize_queue(var c: tCola);
function empty_queue(c: tCola): boolean;
function first(c: tCola): integer;
function last(c: tCola): integer;
procedure enqueue(var c: tCola; x: integer);
procedure dequeue(var c: tCola);
{ --- Operaciones adicionales de la cola --- }
function toString(c: tCola): string;
procedure clear(var c: tCola);
function num_elems(c: tCola): integer;
procedure copy(c : tCola; var c2: tCola);
implementation
uses SysUtils;
{ Implementación de las operaciones básicas de la cola }
// Inicializar la cola
procedure initialize_queue(var c: tCola);
begin
c.first := nil; // Establecer el primer nodo a nil
c.last := nil; // Establecer el último nodo a nil
{Ejercicio 2.2: Modificar funciones y procedimientos}
c.size := 0; // Inicializar el tamaño de la cola
end;
// Verificar si la cola está vacía
function empty_queue(c: tCola): boolean;
begin
empty_queue := c.first = nil; // Devolver true si el primer nodo es nil
end;
// Obtener el primer elemento de la cola
function first(c: tCola): integer;
begin
if not empty_queue(c) then
first := c.first^.info // Devolver la información del primer nodo
end;
// Obtener el último elemento de la cola
function last(c: tCola): integer;
begin
if not empty_queue(c) then
last := c.last^.info // Devolver la información del último nodo
end;
// Agregar un elemento a la cola
procedure enqueue(var c: tCola; x: integer);
var
nuevo: ^nodo; // Nuevo nodo
begin
new(nuevo); // Asignar memoria para el nuevo nodo
nuevo^.info := x; // Establecer la información del nuevo nodo
nuevo^.sig := nil; // Establecer el siguiente nodo a nil
if empty_queue(c) then
c.first := nuevo // Establecer el primer nodo al nuevo nodo
else
c.last^.sig := nuevo; // Establecer el siguiente nodo del último nodo al nuevo nodo
c.last := nuevo; // Establecer el último nodo al nuevo nodo
{Ejercicio 2.2: Modificar funciones y procedimientos}
c.size := c.size + 1; // Incrementar el tamaño de la cola
end;
// Eliminar un elemento de la cola
procedure dequeue(var c: tCola);
var
aux: ^nodo; // Nodo auxiliar
begin
if not empty_queue(c) then
begin
aux := c.first; // Establecer el nodo auxiliar al primer nodo
c.first := c.first^.sig; // Establecer el primer nodo al siguiente nodo
dispose(aux); // Liberar la memoria del nodo auxiliar
if c.first = nil then
c.last := nil; // Establecer el último nodo a nil si la cola está vacía
{Ejercicio 2.2: Modificar funciones y procedimientos}
c.size := c.size - 1; // Decrementar el tamaño de la cola
end;
end;
{ Implementación de las operaciones adicionales de la cola }
// Convertir la cola a una cadena de caracteres
function toString(c: tCola): string;
var
aux: ^nodo; // Nodo auxiliar
s: string; // Cadena de caracteres
begin
aux := c.first; // Establecer el nodo auxiliar al primer nodo
s := '['; // Inicializar la cadena de caracteres
while aux <> nil do
begin
s := s + IntToStr(aux^.info); // Agregar la información del nodo a la cadena
aux := aux^.sig; // Avanzar al siguiente nodo
if aux <> nil then
s := s + ', '; // Agregar una coma si no es el último nodo
end;
s := s + ']'; // Agregar el corchete de cierre
toString := s; // Devolver la cadena de caracteres
end;
// Limpiar la cola
procedure clear(var c: tCola);
begin
while not empty_queue(c) do
dequeue(c); // Eliminar todos los elementos de la cola
end;
// Contar el número de elementos de la cola
function num_elems(c: tCola): integer;
{var
aux: ^nodo; // Nodo auxiliar
count: integer; // Contador
begin
aux := c.first; // Establecer el nodo auxiliar al primer nodo
count := 0; // Inicializar el contador
while aux <> nil do
begin
count := count + 1; // Incrementar el contador
aux := aux^.sig; // Avanzar al siguiente nodo
end;
num_elems := count; // Devolver el contador
}
begin
{Ejercicio 2.3: Implementar la función `num_elems`}
num_elems := c.size; // Devolver el tamaño de la cola
end;
// Copiar una cola
procedure copy(c : tCola; var c2: tCola);
var
aux: ^nodo; // Nodo auxiliar
begin
initialize_queue(c2); // Inicializar la cola c2
aux := c.first; // Establecer el nodo auxiliar al primer nodo de c
while aux <> nil do
begin
enqueue(c2, aux^.info); // Agregar el elemento del nodo auxiliar a c2
aux := aux^.sig; // Avanzar al siguiente nodo
end;
end;
end.