Listas simplemente enlasadas
Leo
Posted on November 10, 2024
Insercción, eliminación y lectura de listas simplemente enlazadas
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
typedef int TipoDato;
struct nodo{
TipoDato Info;
struct nodo *Liga;
};
typedef struct nodo *TipoLista;
void InicializarLista(TipoLista &P){
P=NULL;
}
bool ListaVacia(TipoLista P){
return (P==NULL);
}
void CrearInicio( TipoLista &P ){
TipoLista Q;
int Res;
if ( ListaVacia(P) ) {
P= new nodo;
cout << "Escriba un valor del nodo: ";
cin >> P-> Info;
P->Liga=NULL;
} else {
Q=new nodo;
cout << "Escriba valor del nodo: ";
cin >> Q ->Info;
Q->Liga=P;
P=Q;
}
cout << "Desea anexar mas nodos a la lista? 1=Si 2=No " << endl;
cin >>Res;
while(Res==1){
Q=new nodo;
cout << "Escriba valor del nodo: ";
cin >> Q ->Info;
Q->Liga=P;
P=Q;
cout << "Desea anexar mas nodos a la lista? 1=Si 2=No " << endl;
cin >>Res;
}
}
void Recorre_iterativo(TipoLista P){
TipoLista Q=P;
while(Q!=NULL){
cout<< Q->Info << " ";
Q=Q->Liga;
}
}
void Recorre_recursivo(TipoLista P){
if(P!=NULL){
cout<< P->Info << " ";
Recorre_recursivo(P->Liga);
}
}
void InsertarInicio ( TipoLista &P, TipoDato Dato ){
TipoLista Q;
Q = new nodo;
Q -> Info = Dato;
Q -> Liga = P;
P = Q;
}
void InsertarFinal ( TipoLista &P, TipoDato Dato ){
TipoLista Q, T;
Q = new nodo;
Q -> Info = Dato;
Q -> Liga = NULL;
if ( !ListaVacia( P ) ) {
T = P;
while ( T -> Liga != NULL )
T = T -> Liga;
T -> Liga = Q;
} else P = Q;
}
void InsertarAntes ( TipoLista &P, TipoDato Dato, TipoDato Ref ) {
if( !ListaVacia(P) ){
TipoLista Q = P, T;
while( Q != NULL && Q -> Info != Ref ){
T = Q;
Q = Q -> Liga;
}
if( Q != NULL){
TipoLista X = new nodo;
X-> Info = Dato;
if( Q == P ){
X->Liga = P;
P = X;
} else{
T->Liga = X;
X->Liga = Q;
}
} else cout << "\n\tLa referencia "<< Ref << " no existe!\n" << endl;
} else cout << "\n\tLista vacia, ingrese datos\n";
}
void InsertarDespues ( TipoLista &P, TipoDato Dato, TipoDato Ref ){
if ( !ListaVacia(P) ){
TipoLista Q = P;
while ( Q != NULL && Q -> Info != Ref ) Q = Q -> Liga;
if ( Q -> Liga != NULL ){
TipoLista X = new nodo;
X -> Info = Dato;
X -> Liga = Q -> Liga;
Q -> Liga = X;
} else cout << "\n\tLa referencia " << Ref << " no existe!\n";
} else cout << "\n\tLista vacia, ingrese datos\n";
}
void EliminarInicio( TipoLista &P){
if ( !ListaVacia(P) ){
TipoLista Q = P;
P = P -> Liga;
delete Q;
} else cout << "\n\tLista vacia. \n";
}
void EliminarUltimo( TipoLista &P ){
if ( !ListaVacia(P) ){
if ( P -> Liga == NULL ) delete P;
else {
TipoLista Q = P, T;
while (Q->Liga != NULL){
T = Q;
Q = Q->Liga;
} T->Liga = NULL; delete Q;
}
} else cout << "\n\tLista vacia. \n";
}
void EliminarNodo( TipoLista &P, TipoDato X ){
if( !ListaVacia(P) ){
TipoLista Q = P, T;
while ( Q != NULL && Q -> Info != X ){
T = Q;
Q = Q -> Liga;
}
if ( Q != NULL ){
if ( P == Q ) P = Q -> Liga;
else T -> Liga = Q -> Liga;
delete Q;
} else cout << "\n\tLa referencia "<< X << " no existe!\n" << endl;
} else cout << " \n\tLista vacia. \nNo existe " << X << endl;
}
void EliminarAntes( TipoLista &P, TipoDato X ){
if( !ListaVacia(P) ){
TipoLista Q = P, T, R;
while( Q != NULL && Q -> Info != X ){
R = T;
T = Q;
Q = Q -> Liga;
}
if( Q != NULL){
if( T != NULL ){
if( R == NULL ) P = T->Liga;
else R->Liga = T->Liga;
delete T;
} else cout << "\nNo existe nodo antes del nodo con la referencia " << X << " (es el primer nodo).\n"<< endl;
} else cout << "\n\tLa referencia "<< X << " no existe!\n" << endl;
} else cout << "\n\tLista vacia, ingrese datos. \n";
}
void EliminarDespues( TipoLista &P, TipoDato X ){
if( !ListaVacia(P) ){
TipoLista Q = P, T;
while ( Q != NULL && Q->Info != X ) {
T = Q;
Q = Q->Liga;
}
if( Q != NULL ){
if( Q->Liga != NULL ){
if ( P == Q ) {
T = P->Liga;
P->Liga = T->Liga;
} else {
T = Q->Liga;
Q -> Liga = T -> Liga;
}
delete T;
} else cout << "\n\tLa referencia " << X << " no tiene nodo siguiente!\n" << endl;
} else cout << "\n\tLa referencia " << X << " no existe!\n" << endl;
} else cout << "\n\tLista vacia, primero ingrese datos.\n";
}
void menuPrincipal(){
TipoDato X, Ref, Opc;
TipoLista P;
InicializarLista (P);
do {
system ("cls");
cout << " \n\t>> Listas simplemente enlasadas <<" << endl;
cout << "\t\tby Neftali Leobardo Vazquez Castillo\n" << endl;
cout << "\t\tMenu\n" << endl;
cout << "1. Introducir valores manualmente, insertando al inicio. " << endl;
cout << "2. Introducir valores impares del 1 al 99 insertando al inicio." << endl;
cout << "3. Introducir valores impares del 1 al 99 insertando al final.\n" << endl;
cout << "4. Mostrar Arreglo Recursivo. " << endl;
cout << "5. Mostrar Arreglo Iterativo. " << endl;
cout << "\n6. Limpiar Lista. " << endl;
cout << "\n\tInsercion\n" << endl;
cout << "7. Insertar al inicio. " << endl;
cout << "8. Insertar al final. " << endl;
cout << "9. Insertar antes de la referencia. " << endl;
cout << "10. Insertar despues de la referencia. " << endl;
cout << "\n\tEliminacion\n" << endl;
cout << "11. Eliminar al inicio. " << endl;
cout << "12. Eliminar al final. " << endl;
cout << "13. Eliminar nodo. " << endl;
cout << "14. Eliminar antes de la referencia" << endl;
cout << "15. Eliminar despues de la referenccia" << endl;
cout << "\n\t0. Salir" << endl;
cout << "\n\tOpcion: "; cin >> Opc;
switch(Opc){
case 1: CrearInicio(P); break;
case 2: for (int i=1; i<=100; i=i+2) InsertarInicio( P, i);
Recorre_recursivo(P); cout << endl; system("pause"); break;
case 3: for (int i=1; i<=100; i=i+2) InsertarFinal( P, i);
Recorre_recursivo(P); cout<< endl; system("pause"); break;
case 4: Recorre_recursivo(P); cout<< endl; system("pause"); break;
case 5: Recorre_iterativo(P); cout<< endl; system("pause"); break;
case 6: while ( P != NULL ) EliminarInicio(P); break;
case 7: cout<< "Ingrese dato a insertar: "; cin >> X; InsertarInicio(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
case 8: cout<< "Ingrese dato a insertar: "; cin >> X; InsertarFinal(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
case 9: cout<< "Ingrese dato a insertar: "; cin >> X; cout<< "Ingrese referencia: "; cin>>Ref; InsertarAntes(P, X, Ref); Recorre_recursivo(P); cout << endl; system("pause"); break;
case 10: cout<< "Ingrese dato a insertar: "; cin >> X; cout << "Ingrese referencia: "; cin>>Ref; InsertarDespues(P, X, Ref); Recorre_recursivo(P); cout << endl; system("pause"); break;
case 11: EliminarInicio(P); Recorre_recursivo(P); cout<< endl; system("pause"); break;
case 12: EliminarUltimo(P); Recorre_recursivo(P); cout<< endl; system("pause"); break;
case 13: cout<< "Ingrese dato a eliminar: "; cin >> X; EliminarNodo(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
case 14: cout<< "Ingrese referencia: "; cin>>X; EliminarAntes(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
case 15: cout<< "Ingrese referencia: "; cin>>X; EliminarDespues(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
}
} while (Opc != 0);
system("cls");
cout << "\n\n\tGracias por usar mi programa, puedes usarlo cuando gustes!\n" << endl;
cout << "\t\t\t\tby ImNot Leo :D\n\n" << endl;
}
int main()
{
menuPrincipal();
return 0;
}
💖 💪 🙅 🚩
Leo
Posted on November 10, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.