Upload
independent
View
1
Download
0
Embed Size (px)
Citation preview
JEPA[Escriba el nombre de la compañía]
[Seleccione la fecha]
INSTITUTO TECNOLÓGICO SUPERIOR DE LA REGIÓN SIERRA
MATERIA: ESTRUCTURA DE DATOS
DOCENTE: JOSÉ DE JESÚS LENIN VALENCIA CRUZ
ALUMNO: JOSÉ EMMANUEL PÉREZ ALVARADO
NUMERO DE CONTROL: 14E30366
INGENIERÍA: INFORMÁTICA
FECHA DE ENTREGA: 27/NOV/2015
1
ÍNDICE
INTRODUCCIÓN……………………………………………………… pág.2
PILAS………………………………………………………………………. Pág.3
COLAS…………………………………………………………………….. pág.12
LISTAS ENLAZADAS…………………………………………………. Pág.26
CONCLUSIÓN………………………………………………………….. pág.52
BIBLIOGRAFÍA…………………………………………………………. Pág.53
2
Introducción
Como ya sabemos, las computadoras fueron diseñadas o ideadas como una herramienta mediante la cual podemos realizar operaciones de cálculo complicadas en un lapso de mínimo tiempo. Pero la mayoría de las aplicaciones de este fantástico invento del hombre, son las de almacenamiento y acceso de grandes cantidades de información.La información que se procesa en la computadora es un conjunto de datos, que pueden ser simples o estructurados. Los datos simples son aquellos que ocupan sólo una localidad de memoria, mientras que los estructurados son un conjunto de casillas de memoria a las cuales hacemos referencia mediante un identificador único.Debido a que por lo general tenemos que tratar con conjuntos de datos y no con datos simples (enteros, reales, booleanos, etc.) que por sí solos no nos dicen nada, ni nos sirven de mucho, es necesario tratar con estructuras de datos adecuadas a cada necesidad.Las estructuras de datos son una colección de datos cuya organización se caracteriza por las funciones de acceso que se usan para almacenar y acceder a elementos individuales de datos.Una estructura de datos se caracteriza por lo siguiente:
Pueden descomponerse en los elementos que la forman. La manera en que se colocan los elementos dentro de la estructura afectará
la forma en que se realicen los accesos a cada elemento. La colocación de los elementos y la manera en que se accede a ellos puede
ser encapsulada.
3
PILAS (STACK)
Una pila (stack en inglés) es una estructura de datos de tipo LIFO (del inglés Last
In First Out, último en entrar, primero en salir) que permite almacenar y
recuperar datos. Se aplica en multitud de ocasiones en informática debido a su
simplicidad y ordenación implícita en la propia estructura. Representación gráfica
de una pila
Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push),
que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop),
que retira el último elemento apilado.
En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al
último objeto apliado (denominado TOS, top of stack en inglés). La operación
retirar permite la obtención de este elemento, que es retirado de la pila
permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el
nuevo TOS.
Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un
plato sobre una pila de platos, y una operación retirar a retirarlo.
Las pilas suelen emplearse en los siguientes contextos:
Evaluación de expresiones en notación postfija (notación polaca inversa).
Reconocedores sintácticos de lenguajes independientes del contexto
Implementación de recursividad.
Ejemplo 1.
Forma principal
4
Procedimiento: Inserción de un elemento en Pila
Algoritmo
Inserción (Pila, Cima, Elemento)
1. [¿Pila llena?]
Si Cima = MaxPila, entonces:
- Escribir: Desbordamiento (Overflow) y Volver
Cima = Cima + 1;
Pila [Cima] = Elemento
Código
Void CmdInsercionClick(object sender, EventArgs e)
{
String elemento = txtElemento.Text;
txtElemento.Text = "";
txtElemento.Focus();
if (frmPrincipal.Cima == frmPrincipal.MaxPila)
5
{
MessageBox.Show("Pila llena (Overflow)");
return;
}
frmPrincipal.Cima = frmPrincipal.Cima + 1;
frmPrincipal.Pila[frmPrincipal.Cima] = elemento; // Inserta elemento en Pila
}
Corrida
Procedimiento: Recorrido de elementos en Pila
Algoritmo
RECORRIDO (Pila, Top)
1. Apuntador = Top
2. repetir paso 3 mientras Apuntador != nulo
3. imprimir Pila(Apunatdor)
4. Apuntador = Apuntador - 1.
Fin del ciclo.
6
5. Salir.
Código
Void CmdRecorrerClick(object sender, EventArgs e)
{
// Verifica si la Pila esta vacia
if (frmPrincipal.Cima == -1)
{
MessageBox.Show("Pila Vacia (Underflow)");
return;
}
int i = 0;
do
{
lsRecorrer.Items.Add(frmPrincipal.Pila[i]);
i = i + 1;
}
while (i <= frmPrincipal.Cima);
}
Corrida
7
Procedimiento: Búsqueda de un elemento en Pila
Algoritmo
BUSQUEDA (Pila, Top, Elemento)
1. Si Top != Nulo
Apuntador = Top
2. Repetir mientras Apuntador != Nulo
3. Si Pila[Apuntador] = Elemento
Imprimir “El Dato fue encontrado” y Salir
Apuntador = Apuntador - 1
Fin del ciclo
Si no:
Imprimir “El Dato no se encontró”
4. Salir.
Código
Void CmdBuscarClick(object sender, EventArgs e)
{
string elemento = txtElemento.Text;
txtElemento.Text = "";
8
txtElemento.Focus();
// Verifica si la pila esta vacia
if (frmPrincipal.Cima == -1)
{
MessageBox.Show("Pila vacia (Underflow)");
return;
}
int i = 0;
do
{
int res = string.Compare(elemento,frmPrincipal.Pila[i]);
if (res == 0)
{
lsRes.Items.Add(frmPrincipal.Pila[i]);
return;
}
i = i + 1;
}
while (i <= frmPrincipal.Cima);
9
MessageBox.Show("Elemento no encontrado en Pila");
}
Corrida
Procedimiento: Eliminación de elemento en Pila
Algoritmo
Eliminar (Pila, Cima, Elemento)
1. [¿Pila Vacía?]
Si Cima = -1, entonces:
Escribe: Subdesbordamiento (Underflow)
2. Elemento = Pila [Cima]
3. Cima = Cima - 1
código
Void CmdEliminarClick(object sender, EventArgs e)
10
{
if (frmPrincipal.Cima == -1) {
MessageBox.Show("Pila Vacia (Underflow)");
return;
}
string Elemento = frmPrincipal.Pila[frmPrincipal.Cima];
frmPrincipal.Cima = frmPrincipal.Cima - 1;
lsEliminados.Items.Add(Elemento);
}
Corrida
Ejemplo 2.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;// necesario para poder declarar un "STACK"
namespace ConsoleApplication1
{
class Program
{
11
static void Main(string[] args)
{
Stack pila = new Stack();//instancio un nuevo objeto stack(pila)
pila.Push(1);//agrego un elemento a la pila
pila.Push(4);
pila.Push(1);
pila.Push(6);
pila.Push(3);
pila.Push(5);
pila.Push(9);
for (int i = 0; i < 3; i++)//itera 3 veces para ir retirando elementos de la pila
{
//pila.pop saca elementos de la pila
Console.WriteLine("Elemento retirado de la pila:
" + pila.Pop());//imprime los elementos que va retirando el .pop
Console.WriteLine("el próximo elemento que queda en la pila es:
" + pila.Peek());//muestra el elemento siguiente en la pila sin eliminarlo
Console.WriteLine("");
}
Console.ReadKey();
}
}
}
12
COLAS
Una cola es una estructura de datos, caracterizada por ser una secuencia de
elementos en la que la operación de inserción push se realiza por un extremo y la
operación de extracción pop por el otro. También se le llama estructura fifo (del
inglés first in first out), debido a que el primer elemento en entrar será también el
primero en salir.
El tipo cola representa la idea que tenemos de cola en la vida real. la cola para
subir al autobús está compuesta de elementos (personas), que dispone de dos
extremos comienzo y fin. Por el comienzo se extraerá un elemento cuando haya
comprado el billete para su viaje, y si llega una nueva persona con intención de
usar el autobús, tendrá que colocarse al final y esperar que todos los elementos
situados antes que él abandonen la cola.
Ejemplo 1.
Código principal.
public partial class frmPrincipal
{
// Variables globales
public static string[] Cola;
public static int Frente;
public static int Final;
public static int N;
[STAThread]
public static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmPrincipal());
13
}
public frmPrincipal() // Constructor
{
InitializeComponent();
Cola = new string[5]; // Arreglo lineal de 5
N = 4;
Frente = -1;
Final = -1;
}
void CmdInsercionClick(object sender, System.EventArgs e)
{
frmInsercion Insercion = new frmInsercion();
Insercion.Show();
}
void CmdRecorridoClick(object sender, System.EventArgs e)
{
frmRecorrido Recorrido = new frmRecorrido();
Recorrido.Show();
}
void CmdBusquedaClick(object sender, EventArgs e)
{
frmBusqueda Busqueda = new frmBusqueda();
Busqueda.Show();
}
14
void CmdEliminacionClick(object sender, EventArgs e)
{
frmEliminacion Eliminar = new frmEliminacion();
Eliminar.Show();
}
}
Corrida
Procedimiento 1: Inserción de elemento en Cola
Algoritmo Insertar (Cola, N, Frente, Final, Elemento)
1. [¿La Cola está llena?]
Si Frente = 0 y Final = N
Escribir: Desbordamiento y Volver
Si Frente = Final + 1
Escribir: Desbordamiento y Volver
2. [Encontrar el nuevo valor de Final]
Si Frente = -1, entonces: [La cola está vacía]
15
Hacer Frente = 0 y Final = 0
Si no, Si Final = N, entonces:
Hacer Final = 0
Si no
Hacer Final = Final + 1
[Fin del condicional]
3. Hacer Cola [Final] = Elemento
CODIGO
void CmdInsertarClick(object sender, System.EventArgs e)
{
elemento = txtInsercion.Text;
// Se verifica que haya espacio en la Cola
If (frmPrincipal.Frente == 0 && frmPrincipal.Final == frmPrincipal.N)
{
MessageBox.Show("La Cola está llena"); // Desbordamiento (Overflow)
return;
}
if (frmPrincipal.Frente == frmPrincipal.Final + 1)
{
MessageBox.Show("La Cola está llena"); // Desbordamiento (Overflow)
return;
}
// Si la cola esta vacia se inicializan punteros
If (frmPrincipal.Frente == -1)
{
frmPrincipal.Frente = 0;
frmPrincipal.Final = 0;
}
16
else if (frmPrincipal.Final == frmPrincipal.N)
{
frmPrincipal.Final = 0;
}
else
{
frmPrincipal.Final = frmPrincipal.Final + 1;
}
// Se agrega elemento a la Cola
frmPrincipal.Cola[frmPrincipal.Final] = elemento;
txtInsercion.Text = "";
}
Corrida
Procedimiento 2: Recorrido de elementos en Cola
Algoritmo Recorrido (Cola, Frente, Final, N)
1. [¿Cola Vacía?]
Si Frente = -1 y Final = -1, entonces
Escribir: Cola Vacía (Underflow)
2. Si no, si Frente = Final, entonces:
17
Escribir: Cola [Frente]
3. Si no, si Final < Frente
Hacer i = Frente
Repetir Mientras i <= N
Escribir: Cola[i]
Hacer i = i + 1
Hacer j = 0
Repetir Mientras j <= Final
Escribir: Cola[j]
Hacer j = j + 1
4. Si no
Hacer i = Frente
Repetir Mientras i <= Final
Escribir: Cola[i]
Hacer i = i + 1
CODIGO
void CmdRecorridoClick(object sender, System.EventArgs e)
{
if (frmPrincipal.Frente == -1 && frmPrincipal.Final == -1)
{
MessageBox.Show("Cola Vacia");
return;
}
else if (frmPrincipal.Frente == frmPrincipal.Final)
{
18
lsElemCola.Items.Add(frmPrincipal.Cola[frmPrincipal.Frente]);
}
else if (frmPrincipal.Final < frmPrincipal.Frente)
{
int i = frmPrincipal.Frente;
do
{
lsElemCola.Items.Add(frmPrincipal.Cola[i]);
i = i + 1;
} while (i <= frmPrincipal.N);
int j = 0;
do
{
lsElemCola.Items.Add(frmPrincipal.Cola[j]);
j = j + 1;
} while (j <= frmPrincipal.Final);
}
else
{
int i = frmPrincipal.Frente;
do
{
lsElemCola.Items.Add(frmPrincipal.Cola[i]);
i = i + 1;
} while (i <= frmPrincipal.Final);
}
19
Procedimiento 3: Busqueda de elemento en cola
Algoritmo Búsqueda (Elemento, Cola, N, Frente, Final)
1. [¿Cola Vacía?]
Si Frente = -1 y Final = -1, entonces
Escribir: Cola Vacía (Underflow)
2. Si no, si Frente = Final, entonces:
Si Elemento = Cola[Frente]
Escribir: Cola[Frente] y Volver
3. Si no, si Final < Frente
Hacer i = Frente
Repetir Mientras i <= N
Si Elemento = Cola[i]
Escribir: Cola[i] y Volver
Si no
Hacer i = i + 1
Hacer j = 0
Repetir Mientras j <= Final
Si Elemento = Cola[j]
Escribir: Cola[j] y Volver
20
Si no
Hacer j = j + 1
4. Si no
Hacer i = Frente
Repetir Mientras i <= Final
Si Elemento = Cola[i]
Escribir: Cola[i] y Volver
Si no
Hacer i = i + 1
5. Escribir: “No se encuentra elemento en cola”
CODIGO
void CmdBuscarClick(object sender, EventArgs e)
{
string elemento = txtBuscar.Text;
txtBuscar.Text = "";
txtBuscar.Focus();
if (frmPrincipal.Frente == -1)
{
MessageBox.Show("Cola Vacía");
return;
}
if (frmPrincipal.Frente == frmPrincipal.Final)
{
int res =
string.Compare(elemento,frmPrincipal.Cola[frmPrincipal.Frente]);
if (res == 0)
{
21
lsBusqueda.Items.Add(frmPrincipal.Cola[frmPrincipal.Frente]);
return;
}
}
else if (frmPrincipal.Final < frmPrincipal.Frente)
{
int i = frmPrincipal.Frente;
do
{
int res = string.Compare(elemento,frmPrincipal.Cola[i]);
if (res == 0)
{
lsBusqueda.Items.Add(frmPrincipal.Cola[i]);
return;
}
else i = i + 1;
} while (i <= frmPrincipal.N);
int j = 0;
do
{
int res = string.Compare(elemento,frmPrincipal.Cola[j]);
if (res == 0)
{
lsBusqueda.Items.Add(frmPrincipal.Cola[j]);
return;
}
else j = j + 1;
} while (j <= frmPrincipal.Final);
22
}
else
{
int i = frmPrincipal.Frente;
do
{
int res = string.Compare(elemento,frmPrincipal.Cola[i]);
if (res == 0)
{
lsBusqueda.Items.Add(frmPrincipal.Cola[i]);
return;
}
else i = i + 1;
} while (i <= frmPrincipal.Final);
}
MessageBox.Show("No se encuentra elemento en cola");
Procedimiento 4: Eliminación de elemento en cola
Algoritmo Eliminación (Cola, Frente, Final, N)
1. [¿Cola Vacía?]
Si Frente = -1 entonces
Escribir: "Cola Vacía" (Underflow) y Volver
23
2. Hacer Elemento = Cola[Frente] 3. [Encontrar el nuevo valor de Frente]
Si Frente = Final, entonces [La cola solo tenía un elemento]
Hacer Frente = -1 y Final = -1
Si no, si Frente = N, entonces
Hacer Frente = 0
Si no
Hacer Frente = Frente + 1
[Fin de la condición]
4. Escribir: “Elemento eliminado (Elemento)” 5. Volver
Código
void CmdEliminarClick(object sender, EventArgs e)
{
if (frmPrincipal.Frente == -1)
{
MessageBox.Show("Cola Vacia");
return;
}
string elemento = frmPrincipal.Cola[frmPrincipal.Frente];
// si la cola tiene un solo elemento
if (frmPrincipal.Frente == frmPrincipal.Final)
{
frmPrincipal.Frente = -1;
frmPrincipal.Final = -1;
}
else if (frmPrincipal.Frente == frmPrincipal.N)
{
frmPrincipal.Frente = 0;
}
24
else
{
frmPrincipal.Frente = frmPrincipal.Frente + 1;
}
lsEliminado.Items.Add(elemento);
}
Ejemplo 2.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;// necesario para poder declarar un "Queue"
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Queue cola = new Queue();//instancio un nuevo objeto Queue(Cola)
cola.Enqueue("Perro");//agrego un elemento a la cola
cola.Enqueue("Gato");
cola.Enqueue("Loro");
cola.Enqueue("Tigre");
cola.Enqueue("Leon");
25
cola.Enqueue("Lobo");
cola.Enqueue("Zorro");
cola.Enqueue("Conejo");
for (int i = 0; i < 3; i++)//itera 3 veces para ir retirando elementos de la cola
{
Console.WriteLine("Elementos totales que se encuentran en la cola:
" + cola.Count);//.count cuenta la cantidad de elementos en la cola
Console.WriteLine("");
Console.WriteLine("Elemento retirado de la cola:
" +cola.Dequeue());//.dequeue() retira un elemento de la cola
Console.WriteLine("el proximo elemento que queda en la cola es:
" +cola.Peek());//.peek() muestra el proximo elemento de la cola, sin retirarlo
Console.WriteLine("");
Console.WriteLine("");
}
Console.WriteLine("Elementos totales que se encuentran en la cola:
" + cola.Count);
Console.ReadKey();
}
}
}
26
LISTAS ENLAZADAS
Una lista enlazada la constituye una colección lineal de elementos, llamados
nodos, donde el orden de los mismos se establece mediante punteros. Cada nodo
se divide en dos partes: una primera que contiene la información asociada al
elemento, y una segunda parte, llamada campo de enlace o campo al siguiente
puntero, que contiene la dirección del siguiente nodo de la lista.
Una lista enlazada es una colección lineal de elementos donde el orden de los
mismos se establece mediante punteros. La idea básica es que cada componente
de la lista incluya un puntero que indique donde puede encontrarse el siguiente
componente por lo que el orden relativo de estos puede ser fácilmente alterado
modificando los punteros lo que permite, a su vez, añadir o suprimir elementos de
la lista.
Una lista enlazada es una serie de nodos, conectados entre sí a través de una
referencia, en donde se almacena la información de los elementos de la lista. Por
lo tanto, los nodos de una lista enlazada se componen de dos partes principales:
Ventajas de usar listas: Las listas son dinámicas, es decir, podemos almacenar
en ellas tantos elementos como necesitemos, siempre y cuando haya espacio
suficiente espacio en memoria. Al insertar un elemento en la lista, la operación
tiene un tiempo constante independientemente de la posición en la que se inserte,
solo se debe crear el nodo y modificar los enlaces. Esto no es así en los arreglos,
ya que si el elemento lo insertamos al inicio o en medio, tenemos un tiempo lineal
debido a que se tienen que mover todos los elementos que se encuentran a la
derecha de la posición donde lo vamos a insertar y después insertar el elemento
en dicha posición; solo al insertar al final del arreglo se obtienen tiempos
constantes. Al eliminar un elemento paso lo mismo que se mencionó en el punto
anterior.
Desventajas de usar listas:
27
El acceso a un elemento es más lento, debido a que la información no está en
posiciones contiguas de memoria, por lo que no podemos acceder a un elemento
con base en su posición como se hace en los arreglos.
REPRESENTACION DE LISTAS ENLAZADAS EN MEMORIA
Sea LISTA una lista enlazada, salvo que se indique lo contrario.
Almacenaremos LISTA en memoria de la forma siguiente. Como
mínimo, LISTA estará compuesta por dos arrays lineales, a los que llamaremos
INFO y ENLACE, tales que INFO [K] y ENLACE [K] contienen la parte de
información y el campo de puntero de cada nodo de LISTA respectivamente.
Necesitamos también una variable especial llamada COMIENZO que contiene la
posición ocupada por el primer elemento de la lista, y una marca especial NULO
que indica el final de la misma. Puesto que los índices de los arrays INFO y
ENLACE serán habitualmente positivos, el valor NULO será el -999, salvo que
digamos lo contrario.
El siguiente ejemplo muestra la representación memoria de una lista enlazada en
la que cada nodo de la lista contiene un único carácter. Podemos obtener
la lista de caracteres o, en otras palabras, la cadena de la forma siguiente:
COMIENZO = 9, luego INFO [9] = N primer carácter.
ENLACE [9] = 3, luego INFO [3] = 0 segundo carácter.
ENLACE [3] = 6, luego INFO [6] = (carácter blanco) tercer carácter.
ENLACE [6] = 11, luego INFO [11] = E cuarto carácter.
ENLACE [11] = 7, luego INFO [7] = X quinto carácter.
ENLACE [7] = 10, luego INFO [10] = I sexto carácter.
ENLACE [10] = 4, luego INFO [4] = T séptimo carácter.
28
ENLACE [4] = -999 valor nulo, luego termina la lista.
FORMA PRINCIPAL DE LA LISTA ENLAZADA
Código
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Listas : Form
{
public Listas()
{
InitializeComponent();
}
public static int[] enlace = new int[10] { 2, 3, 4, 0, -999, 6, 7, 8, 9, -999 };
public static string[] alumno = new string[10] { "Jose", "Ana", "Rosa", "Beto",
"zeta", "", "", "", "", "" };
public static int comienzo = 1;
public static int disponible = 5;
private void cmdInsercion_Click(object sender, EventArgs e)
{
Insercion ins = new Insercion();
ins.Show();
}
29
private void cmdRecorrido_Click(object sender, EventArgs e)
{
Recorrer rec = new Recorrer();
rec.Show();
} private void cmdBusqueda_Click(object sender, EventArgs e) { Busqueda bus = new Busqueda(); bus.Show(); } private void cmdEliminacion_Click(object sender, EventArgs e) { Eliminacion eli = new Eliminacion(); eli.Show(); } }}
Corrida
RECORRIDO DE UNA LISTA ENLAZADA
Sea la lista enlazada, almacenada en memoria mediante dos arrays INFO
y ENLACE. Adicionalmente definimos la variable COMIENZO que apunta al primer
elemento de la lista y suponemos que el último nodo de la lista contiene en su
campo ENLACE el valor NULO. Supongamos que queremos
recorrer LISTA para procesar cada uno de sus nodos exactamente una vez. A
30
continuación te mostrare el algoritmo que realiza esta tarea y que utilizaremos en
otras aplicaciones.
Nuestro algoritmo utiliza una variable puntero PTR que apunta siempre al nodo
procesado en cada momento. Por ello ENLACE [PTR] indica el siguiente nodo a
ser procesado. De esta forma la asignación PTR:= ENLACE [PTR] Tiene el efecto
de mover el puntero al siguiente nodo de la lista.
La descripción del algoritmo es la siguiente. Inicializamos PTR a COMIENZO. A
continuación procesamos INFO [PTR], es decir, la información del primer nodo. En
el paso siguiente actualizamos PTR mediante la asignación PRT:
= ENLACE [PTR], lo que hace que PTR apunte ahora al segundo nodo.
Nuevamente tratamos de la información contenida en INFO [PTR] (segundo nodo)
y tras esto volvemos a actualizar PTR y procesamos INFO [PTR], y así
sucesivamente. Este proceso de actualización y procesamiento continuara hasta
que en una de las actualizaciones de PTR obtengamos que PTR = NULO, que
marca el final de la lista.
Una representación formal de algoritmo es la siguiente.
Algoritmo: Recorrido de una lista enlazada.
Sea LISTA una lista enlazada que almacenamos en memoria. El algoritmo
recorre LISTA realizando la operación PROCESO a cada elemento de LISTA. La
variable PTR, apunta en cada momento al nodo que se está tratando.
1. PTR: = COMIENZO. [inicializa el puntero].
2. repetir pasos 3 y 4 mientras PTR!= 0.
3. aplicar PROCESO a INFO [PTR].
4. PTR: = ENLACE [PTR]. [PTR apunta ahora al siguiente nodo]. [fin del ciclo
paso 2].
31
5. salir.
Codigo:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Recorrer : Form
{
public Recorrer()
{
InitializeComponent();
Recorrido();
}
private void cmdRecorrer_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
Recorrido();
}
private void Recorrido()
{
int ptr = Listas.comienzo;
32
while (ptr != -999)
{
listBox1.Items.Add(Listas.alumno[ptr]);
ptr = Listas.enlace[ptr];
}
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
Corrida
BUSQUEDA EN UNA LISTA ENLAZADA
Sea LISTA una lista enlazada, almacenada en memoria. En esta sección
discutimos dos algoritmos de búsqueda que localizan la posición del nodo (LUG)
en el cual un elemento dado (ELEMENTO) aparece por primera vez en la lista. El
primer algoritmo no necesita que la lista este ordenada, mientras que el segundo
si lo exige.
Si ELEMENTO es un valor de clave y buscamos en el archivo para encontrar el
registro que lo contiene, este solo puede aparecer una vez en la lista.
33
Lista no ordenadas
Supongamos que los datos de lista no están ordenados (necesariamente). En este
caso podremos localizar ELEMENTO sin más que recorrer LISTA utilizando el
puntero PTR y comparando ELEMENTO con el contenido INFO [PTR] de cada
nodo. Cada vez que actualicemos PTR mediante la asignación PTR:
= ENLACE [PTR], necesitamos dos comprobaciones. Primero necesitamos ver si
hemos alcanzado el final de la lista, es decir comprobamos si PTR = NULO, si no,
entonces comprobamos si INFO [PTR] = ELEMENTO.
Las dos comprobaciones no podemos realizarlas simultáneamente, puesto que si
PTR = NULO no existirá INFO [PTR]. De acuerdo con esto utilizamos la primera
comparación para controlar la ejecución de un ciclo y realizamos la segunda
comparación dentro de este.
Algoritmo: BUSQ(INFO, ENLACE, COMIENZO, ELEMENTO, LUG)
LISTA es una lista enlazada almacenada en memoria. el algoritmo encuentra la
posición LUG del nodo donde ELEMENTO aparece por primera vez en lista y
devuelve LUG = NULO.
1. PTR: = COMIENZO.
2. repetir paso 3 mientras PTR != NULO:
3. si ELEMENTO = INFO[PTR], entonces: LUG: = PTR y salir.
4. si no: PTR: = ENLACE [PTR]. [PTR apunta ahora al nodo siguiente].
5. [final de la estructura condicional].
6. [final del ciclo del paso 2].
7. [la búsqueda es fallida]. LUG: = NULO.
8. salir
Lista ordenada
34
Supongamos que los datos de LISTA están ordenados. De nuevo buscamos
ELEMENTO en la lista recorriendo la misma utilizando una variable puntero y
comparando ELEMENTO con el contenido de INFO [PTR] nodo a nodo. en este
caso, sin embargo, podremos finalizar la búsqueda una vez que ELEMENTO sea
mayor que INFO[PTR].
Algoritmo: BUSQ(INFO, ENLACE, COMIENZO, ELEMENTO, LUG)
LISTA es una lista ordenada que se encuentra en memoria. El algoritmo encuentra
la posición LUG del nodo donde se encuentra por primera vez ELEMENTO o bien
devuelve LUG = NULO.
1. PTR:= COMIENZO.
2. repetir paso 3 mientras PTR != NULO:
3. si ELEMENTO < INFO[PTR], entonces:
4. PTR: = ENLACE [PTR]. [PTR apunta al siguiente nodo].
5. si no, si ELEMENTO = INFO[PTR], entonces:
6. LUG = PTR y salir. [la busqueda es satisfactoria].
7. si no: LUG: = NULO y salir. [ELEMENTO es mayor que INFO[PTR.
8. [final de la estructura condicional]
9. [final del ciclo del paso 2]
10.LUG: = NULO.
11.salir.
Codigo:
using System;
using System.Collections.Generic;
using System.ComponentModel;
35
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Busqueda : Form
{
public Busqueda()
{
InitializeComponent();
}
private void cmdBuscar_Click(object sender, EventArgs e)
{
string elemento = txtbuscador.Text.ToString();
int lug = -999;
int ptr = Listas.comienzo;
if (ptr == -999) MessageBox.Show("Lista vacia", "Error");
while (ptr != -999)
{
if (Listas.alumno[ptr] == elemento)
{
lug = ptr;
MessageBox.Show("Elemento encontrado en \nposicion: " +
lug.ToString(), "Elemento Encontrado");
txtbuscador.Clear();
}
else ptr = Listas.enlace[ptr];
}
36
if (lug == -999) MessageBox.Show("Elemento no encontrado", "Error");
}
private void button1_Click(object sender, EventArgs e)
{
this.Hide();
}
}
}
Corrida
INSERCION EN UNA LISTA ENLAZADA
Sea LISTA una lista enlazada en la que los nodos A y B ocupan posiciones
sucesivas en el orden impuesto en la lista. Supongamos que queremos insertar en
ella un nodo N que debe ocupar un lugar entre A y B. Después de la operación el
nodo A apuntara al nodo N y este apuntara al nodo B, es decir, el nodo al que
apuntaba antes A.
Algoritmo de insercion
Tres son las situaciones más comunes que nos encontraremos cuando insertamos
nodos en una lista. Primero cuando queremos insertar un nodo al principio de la
lista, segundo cuando queramos insertar un nodo de tras de un determinado, y
tercero, cuando insertamos un nodo en una lista previamente ordenada. A
continuación discutimos los algoritmos que llevan a cabo estas tareas suponiendo
37
que la lista esta almacenada en memoria en la forma LISTA(INFO, ENLACE,
COMIENZO, DISP) y que la variable ELEMENTO contiene la información que
debe incorporarse a la lista.
Puesto que nuestros algoritmos de insercion utilizaran nodos de la lista de nodos
disponibles, todos ellos deben incluir los siguientes pasos:
Estudiar si existe espacio libre en la lista de espacio disponible. Si no es
así, es decir, si DISPONIBLE = NULO, el algoritmo debe imprimir el
mensaje OVERFLOW.
Extraer el primer nodo de la lista de disponible. Si utilizamos la variable
Nuevo, esta operación puede realizarse mediante dos asignaciones (en
este orden) NUEVO: = DISP. DISP: = ENLACE[DISP].
Incorporar la información a insertar en el nodo recien obtenido, es decir:
INFO [NUEVO] = ELEMENTO.
Insercion al principio de una lista
Supongamos que nuestra lista no está ordenada ni existe ninguna razón por la
cual cualquier nodo que insertemos deba ocupar una determinada posición. En
este caso lo más sencillo será insertar el nuevo nodo al comienzo de la misma. Un
algoritmo que realiza esta operación es el siguiente.
Algoritmo: INSPRIN (INFO, ENLACE, COMIENZO, DISP, ELEMENTO)
El algoritmo coloca ELEMENTO como primer componente de la lista.
1. [Overflow] si DISP = NULO, entonces: Escribir: OVERFLOW y salir.
2. [extrae el primer nodo de la lista DISP].
3. NUEVO: = DISP y DISP: = ENLACE [DISP].
4. INFO[NUEVO]: = ELEMENTO. [copia el dato en el nodo].
38
5. ENLACE [NUEVO]: = COMIENZO. [el nuevo nodo apunta ahora al que
ocupa antes la primera posición].
6. COMIENZO: = NUEVO. [COMIENZO apunta ahora al elemento que ocupa
la primera posición de la lista].
7. Salir.
Insercion a continuación de un nodo determinado
Supongamos en este caso que se nos da un valor LUG que o bien
representa la localización de un nodo A determinado o bien LUG = NULO.
El algoritmo siguiente inserta ELEMENTO en la lista a continuación de A o
bien coloca ELEMENTO como primer componente de la lista si LUG =
NULO.
Sea N el nuevo nodo (cuya posición es NUEVO). Si LUG = NULO, entonces el
nodo se coloca al comienzo de la lista. En otro caso hacemos que N apunte al
nodo B (que originalmente seguía a A). El proceso implica las siguientes
operaciones:
ENLACE [NUEVO]: = ENLACE[LUG]
Después del cual N apunta a B y
ENLACE [LUG]: = NUEVO
Tras el cual A apunta al nodo N.
Algoritmo: INSLUG (INFO, ENLACE, COMIENZO, DISP, LUG, ELEMENTO)
El algoritmo inserta ELEMENTO a continuación del nodo que ocupa la posición
LUG o coloca ELEMENTO como primer nodo si LUG=NULO
1. [Overflow] Si DISP = NULO, entonces: escribir: OVERFLOW y salir.
39
2. [Extrae el primer nodo de la lista de disponibles]
3. NUEVO: = DISP y DISP: = ENLACE [DISP].
4. INFO [NUEVO]: = ELEMENTO. [copia el dato en el nodo obtenido].
5. Si LUG = NULO, entonces [Lo inserta como primer nodo].
6. ENLACE [NUEVO]: = COMIENZO y COMIENZO: = NUEVO.
7. Si no: [Inserta de tras del nodo de posicion LUG].
8. ENLACE [NUEVO]: = ENLACE [LUG] y ENLACE [LUG]: = NUEVO.
9. [Final de la estructura condicional]
10.Salir.
Insercion de una lista enlazada y ordenada
Supongamos que queremos insertar ELEMENTO en una lista enlazada y
ordenada y que ELEMENTO cumple que INFO(a) <ELEMENTO⇐INFO (b). Por
tanto ELEMENTO debe insertarse en un nuevo nodo entre A y B. El procedimiento
siguiente calcula la posicion LUG que ocupa el nodo A, es decir, la posicion del
nodo que precederá a ELEMENTO en la lista.
Para ello utiliza dos punteros PTR y AUX. Con PTR recorre la lista y va
comparando ELEMENTO con INFO [PTR] para todos los nodos que visita.
Después de cada comparación actualiza el valor de ambos punteros, de tl forma
que AUX:= PTR y posteriormente PTR:= ENLACE [PTR]. Con este mecanismo
garantizamos que AUX siempre apunta al nodo que precede al que está siendo
apuntado por PTR. El recorrido de la lista continua hast que INFO [PTR] >
ELEMENTO, o en otras palabras, la busqueda finaliza cuando ELEMENTO ⇐
INFO [PTR].
Una representación formal del procedimiento es el siguiente. En dicho
procedimiento se contemplan por separado los casos en que la lista esta vacia o
bien cuando ELEMENTO < INFO [COMIENZO] debido a que no precisan el uso
de la variable AUX.
40
Procedimiento: ENCA (INFO, ENLACE, COMIENZO, ELEMENTO, LUG)
El procedimiento encuentra la posicion LUG del ultimo nodo para el que INFO
[LUG] < ELEMENTO o hace LUG = NULO.
1. [¿Lista vacia?] Si COMIENZO = NULO, entonces: LUG = NULO y retornar.
2. [¿caso especial?] Si ELEMENTO < INFO [COMIENZO]. entonces: LUG: =
NULO y retornar.
3. AUX: = COMIENZO y PTR: = ENLACE [COMIENZO]. [Inicializamos los
punteros].
4. Repetir pasos 5 y 6 mientras PTR!= NULO.
5. Si ELEMENTO < INFO [PTR]. entonces:
6. LUG: = AUX y retornar.
7. [Final de la estructura condicional].
8. AUX: = PTR y PTR: = ENLACE [PTR]. [Actualiza los punteros].
9. LUG: = AUX.
10.Salir.
Después de esto ya tenemos las herramientas necesarias para diseñar un
algoritmo que nos inserte ELEMENTO en una lista enlazada.
Algoritmo: INSERT (INFO, ENLACE, COMIENZO, DISP, ELEMENTO)
El algoritmo inserta ELEMENTO en una lista enlazada ordenada.
1. [Utilizamos el procedimiento 6 para encontrar la posicion del nodo que
precederá a ELEMENTO.]
2. Llamar ENCA (INFO, ENLACE, COMIENZO, ELEMENTO, LUG)
41
3. [Utilizaremos el algoritmo 5 para insertar ELEMENTO a continuacion del
nodo que ocupa la posicion LUG.]
4. Llamar INSLUG(INFO, ENLACE, COMIENZO, DISP, LUG, ELEMENTO)
5. Salir.
Codigo:
Using System;
Using System.Collections.Generic;
Using System.ComponentModel;
Using System.Data;
Using System.Drawing;
Using System.Text;
Using System.Windows.Forms;
Namespace WindowsApplication1
{
Public partial class Insercion: Form
{
Public Insercion ()
{
InitializeComponent ();
}
Private void cdmInserta_Click(object sender, EventArgs e)
{
String elemento = txtInser.Text;
txtInser.Clear();
42
If (Listas.disponible == -999)
{
MessageBox.Show ("Lista llena", "Error", MessageBoxButtons.OK);
}
else
{
Int anterior = -999;
Int ptr = Listas.comienzo;
Int i = 0, nuevo;
Nuevo = Listas.disponible;
bool aux = false;
Listas.disponible = Listas.enlace[nuevo];
Listas.alumno[nuevo] = elemento;
while (ptr != -999 && aux == false)
{
If (Listas.alumno [ptr].Length < elemento.Length)
{
i = Listas.alumno [Listas.comienzo].Length;
}
Else
{
i = elemento.Length;
}
int h = 0;
for (h=0; h < i; h++)
{
If (Listas.alumno [ptr][h] == elemento[h])
{
}
If (Listas.alumno [ptr][h] < elemento[h])
{ Anterior = ptr;
43
h = i;
}
else
{
h = i;
Aux = true;
}
}
ptr = Listas.enlace [ptr];
}
If (anterior == -999)
{
Listas.enlace [nuevo] = Listas.comienzo;
Listas.comienzo = nuevo;
}
Else
{
Listas.enlace [nuevo] = Listas.enlace [anterior];
Listas.enlace [anterior] = nuevo;
}
button1.Text = "Cerrar";
}
}
Private void button1_Click (object sender, EventArgs e)
{
this.Hide ();
}
}
}
Corrida
44
ELIMINACION DE UN ELEMENTO DE UNA LISTA ENLAZADA
Sea lista una lista enlazada en la cual el nodo N se encuentra entre los nodos A y
B. Supongamos que queremos eliminar el nodo N de la lista. La eliminación se
produce tan pronto como el puntero de enlace siguiente del nodo A apunte al nodo
B. (por ello cuando realizamos eliminaciones debemos almacenar de alguna forma
la dirección del nodo que precede al que vamos a borrar.)
Supongamos que la lista enlazada se mantiene en memoria en la forma siguiente:
LISTA (INFO, ENLACE, COMIENZO, DISP)
Cuando eliminamos el nodo N de la lista debemos devolverlo inmediatamente a la
lista de espacio disponible. Por facilidad en el proceso esta devolución se realiza
insertando el nodo devuelto al principio de la lista DISP. Obsérvese que esta
operación implica cambiar tres punteros de la forma siguiente:
el puntero siguiente del nodo A debe cambiarse para apuntar al nodo B, al
que apuntaba previamente N.
el puntero del nodo N se cambia y se le hace apuntar al primer nodo de la
lista de nodos disponibles.
El puntero DISP se cambia y pasa de apuntar al antiguo primer nodo de la
lista de disponibles para apuntar a N que será el nuevo primer nodo.
Existen dos casos especiales que implican actuaciones distintas. Si el nodo N que
eliminamos es el primero de la lista, el puntero COMIENZO deberá cambiarse
45
para apuntar al nodo B. En cambio, si N es el último de la lista, entonces el
puntero A deberá ponerse a NULO.
Algoritmos de eliminación
Los algoritmos que eliminan nodos de una lista son utilizados en distintas
situaciones. En este epígrafe discutiremos dos de ellas. La primera situación es la
que implica borrar el nodo siguiente a uno dado. La segunda situación implica
borrar un nodo que contiene un determinado elemento. En todos los algoritmos
suponemos que la lista enlazada se almacena en memoria de la forma
LISTA (INFO, ENLACE, COMIENZO, DISP).
También en todos ellos devolvemos el nodo eliminado a la lista de nodos
disponibles, insertándolos al principio de esta. Por ello nuestros algoritmos
incluirán las siguientes asignaciones, donde LUG es la posición del nodo N
borrado: ENLACE [LUG]: = DISP y DISP: = LUG.
Algunos de nuestros algoritmos pueden borrar o bien el primer elemento de la lista
o bien el ultimo. Cualquier algoritmo que haga esto debe analizar primero si existe
algún elemento en la lista. Si no existe ningún, si COMIENZO = NULO, el
algoritmo imprimirá el mensaje UNDERFLOW.
Eliminacion del nodo sucesor de uno determinado
Sea LISTA una lista enlazada almacenada en memoria. Supongamos que
queremos eliminar de LISTA el nodo N que ocupa el lugar LUG y que conocemos
el lugar LUGP del nodo que precede a N en la lista o bien si el nodo N es el primer
LUG = NULO. El algoritmo siguiente elimina N de la lista.
Algoritmo: BOR (INFO, ENLACE, COMIENZO, DISP, LUG, LUGP)
46
El algoritmo elimina de la lista el nodo N que ocupa la posición LUG, siendo LUGP
la posición del nodo que precede a N o bien LUGP = 0 si N es el primero de la
lista.
1. si LUGP = NULO. Entonces:
2. COMIENZO: = ENLACE [COMIENZO]. [Elimina el primer nodo].
3. Si no:
4. ENLACE [LUGP]: = ENLACE [LUG]. [Elimina el nodo N].
5. [Final de la estructura condicional].
6. [Devolvemos el nodo a la lista DISP].
7. ENLACE [LUG]: = DISP Y DISP: = LUG.
8. Salir.
Eliminacion de un nodo que contiene un determinado elemento de información
Sea LISTA una lista enlazada almacenada en memoria. Supongamos que
queremos eliminar de la lista el primer nodo N que contenga la información
ELEMENTO. (Si ELEMENTO es un valor de clave, solo puede contenerlo un único
nodo.) Recuérdese que antes de borrar el nodo N que contiene a ELEMENTO
debemos conocer que nodo precede a N en la lista. Por ello veremos previamente
un procedimiento que localiza la posicion LUG del nodo N que contiene a
ELEMENTO y la posicion LUGP del nodo que precede a N. En el caso de que N
sea el primer nodo de la lista, el procedimiento devuelve LUGP = NULO y en caso
de que ELEMENTO no se encuentre en la lista devolverá LUG = NULO. (Como
puede verse el procedimiento es similar al procedimiento)
Procedimiento: ENCB (INFO, ENLACE, COMIENZO, ELEMENTO, LUG, LUGP)
47
El procedimiento encuentra la posicion LUG del primer nodo N que contiene a
ELEMENTO y la posicion LUGP del nodo anterior a N. Si ELEMENTO no se
encuentra en la lista, el procedimiento devuelve LUG = NULO y si ELEMENTO se
encuentra en el primer nodo, entonces hace LUGP = NULO.
1. [¿Lista vacia?] Si COMIENZO: = NULO, entonces:
2. LUG: = NULO Y LUGP: = NULO y Retornar.
3. [Final de la estructura condicional].
4. [¿Se encuentra ELEMENTO en el primer nodo?]
5. Si INFO[COMIENZO] = ELEMENTO, entonces
6. LUG: = COMIENZO y LUGP = NULO y Retornar.
7. [Final de la estructura condicional].
8. AUX: = COMIENZO y PTR: = ENLACE [COMIENZO]. [Inicializamos los
punteros].
9. Repetir mientras PTR!= NULO.
10.Si INFO[PTR] = ELEMENTO, entonces:
11.LUG: = PTR y LUGP: = AUX y Retornar.
12. [Final de la estructura condicional].
13.AUX: = PTR y PTR: = ENLACE [PTR]. [Actualizamos los punteros]:
14. [Final del ciclo].
15.LUG: = NULO [Busqueda fallida].
16.Retornar.
El procedimiento recorre la lista utilizando dos punteros PTR y AUX. Con PTR
recorremos la lista y comparamos sucesivamente ELEMENTO con INFO [PTR].
En cada momento AUX apunta al nodo anterior al apuntado por PTR. Por ello
después de cada fallida actualizamos ambas de la siguiente forma:
AUX: = PTR y PTR: = ENLACE [PTR]
48
El recorrido de la lista continua mientras que INFO [PTR]!= ELEMENTO o, en
otras palabras, la busqueda terminara cuando INFO [PTR]=ELEMENTO. En este
momento PTR = LUG o dirección del nodo N buscado y AUX apuntara al nodo
anterior.
La formalización de este procedimiento se establece a continuacion. En ella se
puede observar que se tratan por separado los casos en que la lista esta vacia y el
caso en que N es el primer nodo. Esto se hace así debido a que ambos casos no
precisan la utilización de la variable AUX.
Después de desarrollar este procedimiento estamos en condiciones de diseñar un
algoritmo muy sencillo que elimina de una lista enlazada aquel nodo N en el que
aparece por primera vez la información ELEMENTO. La simplicidad de este
algoritmo estriba en que la localización de N y de su predecesor pueda realizarse
utilizando el procedimiento anterior.
Algoritmo: ELIMINAR (INFO, ENLACE, COMIENZO, DISP, ELEMENTO)
El algoritmo elimina de la lista enlazada el primer nodo N que contiene la
información ELEMENTO.
1. [Utilizamos el procedimiento anterior para encontrar la posicion de N y su
predecesor en la lista.]
2. Llamar ENCB (INFO, ENLACE, COMIENZO, ELEMENTO, LUG, LUGP).
3. Si LUG: = NULO, entonces: Escribir: ELEMENTO no se encuentra en la
lista y salir.
4. [Eliminamos el nodo].
5. Si LUGP = NULO, entonces:
6. COMIENZO: = ENLACE [COMIENZO]. [Eliminamos el primer nodo].
7. Si no:
8. ENLACE [LUGP]: = ENLACE [LUG].
49
9. [Final de la estructura condicional].
10. [Devolvemos el nodo eliminado a la lista de nodos disponibles].
11.ENLACE [LUG]: = DISP y DISP: = LUG.
12.Salir.
Codigo:
Using System;
Using System.Collections.Generic;
Using System.ComponentModel;
Using System.Data;
Using System.Drawing;
Using System.Text;
Using System.Windows.Forms;
Namespace WindowsApplication1
{
Public partial class Eliminacion: Form
{
Public Eliminacion ()
{
InitializeComponent ();
}
Private void cmdEliminar_Click (object sender, EventArgs e)
{
String elemento = txtdato.Text;
Int aux, lug = -999, lugp = 0, ptr;
txtdato.Clear ();
50
If (Listas.comienzo == -999)
{
Lug = -999;
Lugp = -999;
MessageBox.Show ("La lista esta vacia", "Error");
Return;
}
If (Listas.alumno [Listas.comienzo] == elemento)
{
Lug = Listas.comienzo;
Lugp = -999;
Listas.comienzo = Listas.enlace [Listas.comienzo];
}
Else
{
Aux = Listas.comienzo;
Ptr = Listas.enlace [Listas.comienzo];
While (ptr!= -999)
{
If (Listas.alumno [ptr] == elemento) {lug = ptr; lugp = aux; }
Aux = ptr; ptr = Listas.enlace [ptr];
}
}
If (lug == -999) {MessageBox.Show ("Elemento no encontrado", "Error",
MessageBoxButtons.OK); return;}
If (lugp == -999) {Listas.comienzo = Listas.enlace [Listas.comienzo]; }
Else {Listas.enlace [lugp] = Listas.enlace [lug];}
Listas.enlace [lug] = Listas.disponible; Listas.disponible = lug;
MessageBox.Show ("Elemento borrado", "Proceso Completado");
button1.Text = "Cerrar";
}
51
Private void button1_Click (object sender, EventArgs e)
{
this.Close ();
}
}
}
Corrida
52
CONCLUSIÓN
El tener claros los conceptos y la información a trabajar, además de generar un análisis exhaustivo de las necesidades que debe cumplir el programa y por qué medio se van a cumplir, son características fundamentales previo a la creación de código, si no se tiene claro que se va a diseñar, no se puede tener claro cómo se va a realizar.
El tener un lenguaje correcto para aplicar a los programas es parte integral de estos, las desventajas de desconocer un lenguaje o no conocer lo que lo distingue de otros lenguajes es un desfavorecimiento para el programador. Por eso se usa C# lenguaje de programación, debido a que permite tener una compilación mucho más rápida y un uso para el usuario nada tedioso. Aunque no se genera un entorno gráfico muy cómodo para el usuario, este solo se encarga de ingresar la información para obtener el informe que necesita por lo cual en realidad no es un punto en contra el del lenguaje.
El uso de las mutualistas favorecen las labores de programación, con estas se agiliza profundamente el tener que hacer validaciones para el ingreso de datos y demás líneas de código que solo generan acumulación, además de hacer que el programa sea compilado mucho más lento.
53
BIBLIOGRAFÍA
Pila: http://www.programacionfacil.com/estructura_datos_csharp/pilas.html
http://pro-gramadores.blogspot.mx/2012/10/stack-pila-en-c.html
Colas: http://www.programacionfacil.com/estructura_datos_csharp/colas.html
http://pro-gramadores.blogspot.mx/2012/10/queue-cola-en-c.html
Listas enlazadas: http://www.programacionfacil.com/estructura_datos_csharp/listas_enlazadas.html