Invertir contenido de una lista enlazada simple con apuntadores

Iniciado por Beginner Web, 3 Septiembre 2018, 23:37 PM

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

Beginner Web

Bueno la verdad no se porrque no me realiza el cambio para poder asi invertir la lista con el metodo burbuja y otra cosilla, si hay alguna otra forma de invertir la lista sin acudir a otra y respetando que es lista simplemente enlazada con 2 apuntadores estaria muy agradecid

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

using namespace std;

typedef struct tnodo *pnodo;
typedef struct tnodo{
char dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
};
char matrix[4][4]={{'a','b','c','d'},{'e','f','g','h'},{'i','j','k','l'},{'m','n','o','p'}};

void inicia(tlista &lista);
void agregar_final(tlista &lista, pnodo nuevo);
void copiarContenido(tlista &lista);
void invertirLista(tlista &lista);
void mostrar(tlista lista);

int main()
{
tlista milista;
pnodo nuevonodo;
int opcion, num;
inicia(milista);
do{
system("cls");
cout << "*MATRIZ*" << endl;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
cout << matrix[i][j] << " ";
}
cout << endl;
}
cout << "1. Iniciar lista" << endl;
cout << "2. Copiar contenido de la matriz a la lista" << endl;
cout << "3. Invertir el orden de la lista" << endl;
cout << "4. Mostrar lista" << endl;
cout << "5. Salir" << endl;
cin >> opcion;
switch(opcion){
case 1: inicia(milista); break;
case 2: copiarContenido(milista); break;
case 3: invertirLista(milista); 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;

}

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

void copiarContenido(tlista &lista)
{
pnodo nuevo;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
nuevo=new tnodo;
if(nuevo!=NULL){
nuevo->dato=matrix[i][j];
nuevo->sig=NULL;
}
else{
cout << "MEMORIA INSUFICIENTE" << endl;
}
if(nuevo!=NULL){
agregar_final(lista,nuevo);
}
}
}
}

void invertirLista(tlista &lista)
{
pnodo i, j;
char buscado, aux;
bool ordenado=true;
buscado=lista.inicio->dato;
while(ordenado){
if(lista.inicio->dato==buscado){
ordenado=false;
}
else{
for(i=lista.inicio;i->sig!=NULL;i=i->sig){
j=i->sig;
aux=i->dato;
i->dato=j->dato;
j->dato=aux;
}
}
}
}

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


Y una ultiam cosilla, debo hacer otro modulo donde debo liberar el espacio de memoria de todos los nodos , al pareceer debo hacerlo nodo por nodo o liberar todo el espacio en memoria ocupado por la lista completea si alguien sabe ;)
7w7

MAFUS


Beginner Web

#2
Ninguno bro




Hola, miren he logrado invertir la lista utilizando otra auxiliar con este metodo pero no entiendo bien del todo como ocurre la magia si alguien me puede explicar
Código (cpp) [Seleccionar]
void invertirLista(tlista &lista)
{
pnodo aux;
tlista secundaria;
inicia(secundaria);
if(lista.inicio!=NULL){
while(lista.inicio!=NULL){
aux=quitar_inicio(lista);
agregar_inicio(secundaria,aux);
}
lista.inicio=secundaria.inicio;
lista.final=secundaria.final;
}
else{
cout << "LISTA VACIA" << endl;
}
}


Y este metodo lo he usado para liberar los nodos de la lista, en este solo diganme si esta bien nada mas, y si pueden hacerme saber como puede mostrar por pantalla por medio de un metodo o funcion interna que me diga cuanta memoria estoy ocupando , gracias

Código (cpp) [Seleccionar]

void liberar_memoria(tlista &lista)
{
pnodo borrado;
while(lista.inicio!=NULL){
borrado=lista.inicio;
lista.inicio=lista.inicio->sig;
delete(borrado);
}
}
;-)



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

MAFUS

Algo así debería devolverte en tamaño en bytes que ocupa la lista. No lo he probado.

Código (c++) [Seleccionar]
size_t lista_memoria_usada(tlista &lista) {
    size_t retval = 0;
    pnodo aux = lista.inicio;
   
    while(aux) {
        retval += sizeof(tlista);
        aux = aux->sig;
    }
   
    return retval;
}

Beginner Web

7w7

CalgaryCorpus

Creo que hay que sumar sizeof(tnodo) por cada item en la lista + sizeof(tlista) para la cabeza de ella.
Aqui mi perfil en LinkedIn, invitame un cafe aqui