Pequeña duda sobre listas circulares simples

Iniciado por Beginner Web, 3 Septiembre 2018, 21:26 PM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

Hola chavales, queria que me dijeran que estoy haciendo mal en este programa, deseo eliminar el ultimo nodo de la lsita circular y creo, creo que mi error esta en no declarar bien los apuntadores de inicio y final de la lista y el metodo de borrar ultimo nodo tambien me falla al parecer  :huh:

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
int contador;
};
void inicia(tlista &lista);
void crear(pnodo &nuevo);
void agregar_inicio(tlista &lista, pnodo nuevo);
pnodo quitar_final(tlista &lista);
void mostrar(tlista lista);

int main()
{
tlista milista;
pnodo nuevonodo, eliminado;
int opcion, num;
inicia(milista);
do{
system("cls");
cout << "1. Iniciar lista" << endl;
cout << "2. Agregar al inicio" << endl;
cout << "3. Quitar al final" << endl;
cout << "4. Mostrar lista" << endl;
cout << "5. Salir" << endl;
cin >> opcion;
switch(opcion){
case 1: inicia(milista); break;
case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
case 3: eliminado=quitar_final(milista); if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;}break;
case 4: cout << "*** LISTA ***" << endl; mostrar(milista); break;
case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
default: cout << "Opcion incorrecta" << endl;
}
system("pause");
}while(opcion!=5);
}

void inicia(tlista &lista)
{
lista.inicio=NULL;
lista.final=NULL;
lista.contador=0;
}

void crear(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
cout << "Ingrese valor: "; cin >> nuevo->dato;
nuevo->sig=NULL;

}
else{
cout << "MEMORIA INSUFICIENTE" << endl;
}
}

void agregar_inicio(tlista &lista, pnodo nuevo)
{
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.final=nuevo;
}
else{
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}
lista.contador++;
}

pnodo quitar_final(tlista &lista)
{
pnodo borrado, i;
if(lista.inicio==NULL){
borrado=NULL;
}
else{
if(lista.inicio==lista.final){
borrado=lista.inicio;
lista.inicio=NULL;
lista.final=NULL;
}
else{
for(i=lista.inicio;(i->sig)->sig!=lista.final->sig;i=i->sig)
borrado=lista.final;
lista.final=i;
lista.final->sig=lista.inicio;
}
lista.contador--;
}
return borrado;
}

void mostrar(tlista lista)
{
pnodo i;
if(lista.inicio!=NULL){
for(i=lista.inicio;i!=lista.final->sig;i=i->sig){
cout << "Nodo: " << i->dato << endl;
}
cout << endl;
cout << "Cantidad de elementos: " << lista.contador << endl;
}
else{
cout << "LISTA VACIA" << endl;
}
}





Me he quemado la cabeza tratando de eliminar el ultimo elemento de la lista circular la logica la tengo pero no se como programarlo  :huh:
Y al mostrar lista queria hacerlo con un for pero tampoco pude asi que use un do{}while(); Si alguien sabe codificacion en C++ me dice como es la cosa con borrar ultimo elemento de la lista circular , no hace falta que me explique de logica, muchas gracias  ;-)

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
int contador;
};
void inicia(tlista &lista);
void crear(pnodo &nuevo);
void agregar_inicio(tlista &lista, pnodo nuevo);
pnodo quitar_final(tlista &lista);
void mostrar(tlista lista);

int main()
{
tlista milista;
pnodo nuevonodo, eliminado;
int opcion, num;
inicia(milista);
do{
system("cls");
cout << "1. Iniciar lista" << endl;
cout << "2. Agregar al inicio" << endl;
cout << "3. Quitar al final" << endl;
cout << "4. Mostrar lista" << endl;
cout << "5. Salir" << endl;
cin >> opcion;
switch(opcion){
case 1: inicia(milista); break;
case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
case 3: eliminado=quitar_final(milista);if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl; delete(eliminado);}; break;
case 4: cout << "*** LISTA ***" << endl; mostrar(milista); break;
case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
default: cout << "Opcion incorrecta" << endl;
}
system("pause");
}while(opcion!=5);
}

void inicia(tlista &lista)
{
lista.inicio=NULL;
lista.final=NULL;
lista.contador=0;
}

void crear(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
cout << "Ingrese valor: "; cin >> nuevo->dato;
nuevo->sig=NULL;

}
else{
cout << "MEMORIA INSUFICIENTE" << endl;
}
}

void agregar_inicio(tlista &lista, pnodo nuevo)
{
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.final=nuevo;
lista.final->sig=lista.inicio;
}
else{
lista.final->sig=nuevo;
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}
lista.contador++;
}

pnodo quitar_final(tlista &lista)
{
pnodo borrado, i;
if(lista.inicio==NULL){
borrado=NULL;
}
else{
if(lista.inicio==lista.final){
borrado=lista.inicio;
lista.inicio=NULL;
lista.final=NULL;
}
else{
for(i=lista.inicio;i!=lista.final;i=i->sig);
borrado=lista.final;
i->sig=lista.inicio;
lista.final=i;
}
lista.contador--;
}
return borrado;
}

void mostrar(tlista lista)
{
pnodo i;
bool seguir=true;
if(lista.inicio!=NULL){
i=lista.inicio;
while(seguir){
cout << "Nodo: " << i->dato << endl;
if(i==lista.final){
seguir=false;
}
i=i->sig;
}
}
else{
cout << "LISTA VACIA" << endl;
}
}





Chicos lo acabo de resolver miren, porque nadie me lo dijo antes?

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
int contador;
};
void inicia(tlista &lista);
void crear(pnodo &nuevo);
void agregar_inicio(tlista &lista, pnodo nuevo);
pnodo quitar_final(tlista &lista);
void mostrar(tlista lista);

int main()
{
tlista milista;
pnodo nuevonodo, eliminado;
int opcion, num;
inicia(milista);
do{
system("cls");
cout << "1. Iniciar lista" << endl;
cout << "2. Agregar al inicio" << endl;
cout << "3. Quitar al final" << endl;
cout << "4. Mostrar lista" << endl;
cout << "5. Salir" << endl;
cin >> opcion;
switch(opcion){
case 1: inicia(milista); break;
case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
case 3: eliminado=quitar_final(milista);if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl; delete(eliminado);}; break;
case 4: cout << "*** LISTA ***" << endl; mostrar(milista); break;
case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
default: cout << "Opcion incorrecta" << endl;
}
system("pause");
}while(opcion!=5);
}

void inicia(tlista &lista)
{
lista.inicio=NULL;
lista.final=NULL;
lista.contador=0;
}

void crear(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
cout << "Ingrese valor: "; cin >> nuevo->dato;
nuevo->sig=NULL;
}
else{
cout << "MEMORIA INSUFICIENTE" << endl;
}
}

void agregar_inicio(tlista &lista, pnodo nuevo)
{
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.final=nuevo;
nuevo->sig=nuevo;//Hasta aca se que esta bien;
}
else{
lista.final->sig=nuevo;
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}
lista.contador++;
}

pnodo quitar_final(tlista &lista)
{
pnodo borrado, i;
if(lista.inicio==NULL){
borrado=NULL;
}
else{
if(lista.inicio==lista.final){
borrado=lista.inicio;
lista.inicio=NULL;
lista.final=NULL;
}
else{
for(i=lista.inicio;(i->sig)->sig!=lista.inicio;i=i->sig);
borrado=lista.final;
lista.final=i;
lista.final->sig=lista.inicio;
}
lista.contador--;
}
return borrado;
}

void mostrar(tlista lista)
{
pnodo i;
bool seguir=true;
if(lista.inicio!=NULL){
i=lista.inicio;
while(seguir){
cout << "Nodo: " << i->dato << endl;
if(i==lista.final){
seguir=false;
}
i=i->sig;
}
}
else{
cout << "LISTA VACIA" << endl;
}
}





Mod: Prohibido el doble o triple post. Usa el botón "Modificar".
7w7