operaciones basicas con listas Simples y Dobles....

Iniciado por ANTÓN RAMIREZ, 14 Diciembre 2010, 21:10 PM

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

ANTÓN RAMIREZ

A continuación se presentan los algoritmos de operaciones con listas. La estructura es:
Para todas las acciones, Cab es un apuntador al primer nodo de la lista
Utilizaremos una notación para usarla en nuestros algoritmos de tal modo que estas sean independientes de cualquier lenguaje de programación.
Si P es un apuntador (puntero) del tipo NODO entonces P.Val hace referencia a la parte valor (información) del nodo apuntado por P de la misma manera P.Sgte hace referencia a la parte dirección siguiente del nodo apuntado por P..
En esta oportunidad implemento una lista dinamica, pero queda de antemano que existe la implementacion de lista estatica , osea usando vectores , haber si alguien lo obtine por alli , o mas aplicaciones de listes simples , hay tambien listas dobles y logicamente la lista circular , en esta oportunidad les dejo operaciones de listas simples.


ATTE : ANTON RAMIREZ , LEONARDO VLADIMIR  (ALUMNO UNI)

Crea una lista enlazada de simple anadiendo nodos de numeros pares al final de la lista.


[li]// Aqui NODO debe ser global porque pude declararse en cualquier parte del programa
struct NODO
{
int Val;
NODO *Sgte;
};

//Crea una lista vacia
void CrearLista (NODO **Cab, NODO **Final);

// Crea una Lista de numeros Pares anadiendo al final de la lista
void CrearLPares(NODO **Cab, NODO **Final);

// Muestra la Lista
void MostrarLPares(NODO *Cab);

// Predicado que devuelve verdad si X es Par y falso en otro caso
bool VrfcaPar(int x);

// Funcion principal
int main()
{
NODO *L1; // Apuntador de tipo NODO para apuntar al primer elemento de la lista
NODO *U1; // Apuntador de tipo NODO para apuntar al ultimo elemento de la lista
//Creamos la lista L1 vacia
CrearLista(&L1, &U1);
// Llenamos la lista L1 con elementos pares
CrearLPares(&L1, &U1);
//Mostramos la lista L1 de pares
MostrarLPares(L1);

system("PAUSE");
return(0);
}

void CrearLista (NODO **Cab, NODO **Final)
{
*Cab=NULL;
*Final=NULL;
}

void CrearLPares(NODO **Cab, NODO **Final)
{
int Num, Ctdor, i;
NODO *P;
Ctdor = 0; i = 1;
//system("CLS");
cout <<"Cuanto numeros pares desea ingresar " ;
cin >>Num;
while(Ctdor < Num)
{
if(VrfcaPar(i))
{
cout<<"Elemento ---> "<<i<<endl;
//P = new NODO; // Que pasa si no hay memoria suficiente ?
P = (NODO*)malloc(sizeof(NODO)); // Que pasa si no hay memoria suficiente ?
if(*Cab == NULL)
{
P->Val = i;
P->Sgte=NULL;
*Cab = P;
*Final =P;
}
else
{
P->Val = i;
P->Sgte=NULL;
(*Final)->Sgte = P;
}
*Final = P;
//(*Final)->Sgte = NULL;
Ctdor = Ctdor + 1;
}
i = i + 1;
}
system("PAUSE");
}


bool VrfcaPar(int x)
{
if(x%2 == 0)
{
return(true);
}
else
{
return(false);
}

}

void MostrarLPares(NODO *Cab)
{
//system("CLS");
// Utilizamos una variable auxiliar para desplazarnos en la lista
NODO *P;
printf("\nlista = < ");
P = Cab;
while(P != NULL)
{
cout<<P->Val<<" ";
P = P->Sgte;
}
cout<<">"<<endl;
system("PAUSE");
}[/color][/li]
[li][/li]
[/list]



// Listas Dobles
using namespace std;

typedef int TD;// crea un sinomino de int

struct NODO
{
TD val;
NODO *ante;
NODO *sgte;
};
void crearLista(NODO **Cabi, NODO **Cabu);// doble apúntador porque *cab es apuntador
void insertarIni(NODO **Cabi,NODO **Cabu, TD dato);
void mostrarNodos(NODO *Cabi);

int main()
{
NODO *ai, *au;
crearLista(&ai, &au);

insertarIni(&ai,&au, 10);
insertarIni(&ai,&au, 20);
insertarIni(&ai,&au, 30);

mostrarNodos(ai);


cout <<("\n\n");
system("pause");
return(0);
}

void crearLista(NODO **Cabi, NODO **Cabu)// doble apúntador porque *cab es apuntador
{
*Cabi=NULL;
*Cabu=NULL;

}

void insertarIni(NODO **Cabi,NODO **Cabu, TD dato)
{
NODO * p;

p=(NODO*)malloc(sizeof(NODO));//MALLOC DEVUELVE LA VARIABLE NO A VOID SINO A NODO

if(p==NULL){// hubo exito en la separacion de memoria
printf("nO HAY espacio en la RAM");
exit(0);
}
else{
p->val=dato;
p->ante=NULL;
p->sgte=NULL;
if(*Cabi==NULL){
*Cabi=p;
*Cabu=p;
}
else{
p->sgte=*Cabi;
(*Cabi)->ante=p;//ya que el * y -> tienen la misma prioridad.
*Cabi=p;
}
}
}
void mostrarNodos(NODO *Cabi)
{
NODO *p;
p=Cabi;
while(p!=NULL){//si pusiera p->sgte!=NULL no mostraria al 10 yaq psgte no existe
cout << p->val<<",";
p=p->sgte;
}
} [/code=c]