LISTAS EN C++
LISTAS
Como sabemos en programación secuencial hay agrupaciones de datos limitadas como son los vectores o matrices, las listas cambian esto, ya que se pueden crear dinámica-mente y existen varios manejos y se pueden llevar mas datos.
Y estos datos se llevan en nodos los cuales son los que llevan los datos, un ejemplo seria un vehículo que seria la lista los nodos serian las personas dentro del carro y las datos serian la edad, nombre, teléfono de la persona.
A continuación se puede ver algunos ejemplos
EXPLICACIÓN CÓDIGO
CÓDIGO EN EJECUCIÓN
CÓDIGO UTILIZADO
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
#include<iostream.h>
#include<string.h>
using namespace std;
struct nodo
{
int posicion; //para indicar en que posicion se creo
int cedula;
char nombre[20];
char apellido[20];
char sexo[20]; //cedula,nombre,apellido,sexo,edad,tel,correo,dir,semestre,programa
int edad;
int telefono;
char correo[30];
char direccion[30];
char semestre[30];
char programa[30];
struct nodo *siguiente;
};
typedef struct nodo *TipoLista; //estamos definiendo tipo de datos a struct nodo
//Funciones con listas
int Insertar(TipoLista &lista, int pos, int c, char *nom,char *ape, char *se, int ed, int te, char *co, char *di, char *sem, char *pro);
int EliminarRegistro(TipoLista &l, int pos);
int ListaVacia(TipoLista l);
void MostrarLista(TipoLista l);
void Modificar(TipoLista l, int d,int nd, char *cd, char *ncd, int bandera,int posi);
void borrar(TipoLista &l);
//*****************************
int main()
{
TipoLista lista = NULL;//ya habiamos declarado el tipo lista y lo ponemos null
int op,opc,pos=1,bpos; //op opc opciones de menus pos es la posicion en lista estudiante bpos posicion a buscar
int ced,ed,tel;
// cedula,edad,telefono
char nomb[20],apell[20],sexo[20],corr[30],dir[30],sem[30],pro[30]; //nombre,apellido,sexo,correo,dir,semestre,programa
TipoLista p;
do
{
system("cls");
printf("***MENU***\n\n");
printf("1. Agregar datos estudiante \n");
printf("2. Modificar datos de estudiante\n");
printf("3. Mostrar datos del estudiante\n");
printf("4. Eliminar datos estudiante\n");
printf("5. Vaciar lista\n");
printf("6. Salir\n\n");
printf("Digite la opcion: ");
scanf("%d",&op);
switch(op)
{
case 1:
do
{
system("cls");
printf("Digite Cero (0) en la cedula del estudiante para salir\n");
printf("Digite la cedula del estudiante # %d :",pos); //se ingresa datos del estudiante
scanf("%d",&ced);
if(ced==0) { printf("Digite una tecla para continuar..."); break; }
fflush(stdin);
printf("Digite el nombre del estudiante # %d :",pos);
gets(nomb);
fflush(stdin);
printf("Digite el apellido del estudiante # %d :",pos);
gets(apell);
fflush(stdin);
printf("Digite el sexo del estudiante # %d :",pos) ;
gets(sexo);
fflush(stdin);
printf("Digite la edad del estudiante # %d :",pos);
scanf("%d",&ed);
fflush(stdin);
printf("Digite el telefono del estudiante # %d :",pos) ;
scanf("%d",&tel);
fflush(stdin);
printf("Digite el correo del estudiante # %d :",pos);
gets(corr);
fflush(stdin);
printf("Digite el direccion del estudiante # %d :",pos) ;
gets(dir);
fflush(stdin);
printf("Digite el semestre del estudiante # %d :",pos);
gets(sem);
fflush(stdin);
printf("Digite el programa del estudiante# %d :",pos);
gets(pro);
fflush(stdin);
pos=Insertar(lista,pos,ced,nomb,apell,sexo,ed,tel,corr,dir,sem,pro);//le enviamos valores a lista
}while (ced!=0);
break;
case 2:
int dato,ndato;
char cdato[20], cndato[20];
MostrarLista(lista);
opc=0;
printf("\n Digite la posicion del estudiante en la lista: ");
scanf("%d",&bpos);
printf("\n Digite 1 (uno) si el dato que desea modificar es un numero o digite 2 (dos) si son letras: ");
scanf("%d",&opc);
if(opc==1)
{
printf("\n Digite el dato a modificar: ");
scanf("%d",&dato);
printf("\n Digite el dato nuevo: ");
scanf("%d",&ndato);
Modificar(lista,dato,ndato,"x","x",opc,bpos);
}
if(opc==2)
{
fflush(stdin);
printf("\n Digite el dato a modificar: ");
gets(cdato);
fflush(stdin);
printf("\n Digite el dato nuevo: ");
gets(cndato);
fflush(stdin);
Modificar(lista,0,0,cdato,cndato,opc,bpos);
}
if(opc!=1 && opc!=2)
{
printf("\n no ha elegido bien... debe ingresa de nuevo desde menu \n ");
}
system("pause");
break;
case 3:
MostrarLista(lista);
system("pause");
break;
case 4:
MostrarLista(lista);
printf("Digite la posicion del estudiante que desea eliminar:");
scanf("%d",&bpos);
pos=EliminarRegistro(lista,bpos);
system("pause");
break;
case 5:
printf("LA LISTA SERA BORRADA!\n");
borrar( lista);
MostrarLista(lista);
system("pause");
break;
case 6:
printf("ha salido del pograma\n");
system("pause");
break;
default:
printf("Opcion no valida!\n");
system("pause");
}
} while(op!=6);
printf("ha salido del pograma\n");
system("pause");
return 0;
}
//***********
//Lista Vacia
int ListaVacia(TipoLista lista)
{
return (lista == NULL);
}
//**************************
//Insertar registro
int Insertar(TipoLista &lista, int pos, int c, char *nom,char *ape, char *se, int ed, int te, char *co, char *di, char *sem, char *pro)//estamos embiando nul y un balor que es (x)
{
TipoLista nuevo , anterior;
nuevo = new(struct nodo);
nuevo->posicion=pos;
nuevo->cedula = c;
strcpy(nuevo->nombre,nom);
strcpy(nuevo->apellido,ape);
strcpy(nuevo->sexo,se);
nuevo->edad = ed;
nuevo->telefono = te;
strcpy(nuevo->correo,co);
strcpy(nuevo->direccion,di);
strcpy(nuevo->semestre,sem);
strcpy(nuevo->programa,pro);
//ordeno los elementos ingresados
if (ListaVacia(lista) || lista->cedula > c)
{
nuevo->siguiente = lista;
lista = nuevo;
}
else
{
anterior= lista;
while(anterior->siguiente && anterior->siguiente->cedula <= c)
anterior= anterior->siguiente;
nuevo->siguiente=anterior->siguiente;
anterior->siguiente=nuevo;
}
pos++;
return pos;
}
//**************************
//Imprimir lista
void MostrarLista(TipoLista lista)
{
// int a[];
TipoLista nodo = lista;
if(ListaVacia(nodo)) printf("Lista vacia\n");
else
{
while(nodo)
{
printf("posicion: %d \n", nodo->posicion);
printf("cedula: %d \n", nodo->cedula); //cedula,nombre,apellido,sexo,edad,tel,correo,dir,semestre,programa
printf("nombre: "); puts(nodo->nombre);
printf("apellido: "); puts(nodo->apellido);
printf("sexo: "); puts(nodo->sexo);
printf("edad: %d \n", nodo->edad);
printf("telefono: %d \n", nodo->telefono);
printf("correo: ");puts(nodo->correo);
printf("direccion: ");puts(nodo->direccion);
printf("semestre: ");puts(nodo->semestre);
printf("programa: ");puts(nodo->programa);
printf("- - - - - - - - -\n");
nodo = nodo->siguiente;
}
printf("\n");
}
}
//**************************
//Modificar
void Modificar(TipoLista lista, int d,int nd, char *cd, char *ncd, int bandera, int posi)
{
TipoLista nodo;
int ban = 0, bane = 0;
nodo = lista;
while(nodo)
{
if(nodo->posicion == posi)
{
if(bandera==1) //para modificar cedula edad telefono
{
if(nodo->cedula == d)
{
nodo->cedula=nd;
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
//break;
}
if(nodo->edad == d)
{
nodo->edad=nd;
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
//break;
}
if(nodo->telefono == d)
{
nodo->telefono=nd;
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);//estamos mostrando la lista
//break;
}
}
if(bandera==2) //modifica nombre,apellido,sexo,correo,dir,semestre,programa
{
if(strcmp(nodo->nombre,cd)==0)
{
strcpy(nodo->nombre,ncd);
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
break;
}
if(strcmp(nodo->apellido,cd)==0)
{
strcpy(nodo->apellido,ncd);
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
break;
}
if(strcmp(nodo->sexo,cd)==0)
{
strcpy(nodo->sexo,ncd);
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
break;
}
if(strcmp(nodo->correo,cd)==0)
{
strcpy(nodo->correo,ncd);
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
break;
}
if(strcmp(nodo->direccion,cd)==0)
{
strcpy(nodo->direccion,ncd);
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
break;
}
if(strcmp(nodo->semestre,cd)==0)
{
strcpy(nodo->semestre,ncd);
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
break;
}
if(strcmp(nodo->programa,cd)==0)
{
strcpy(nodo->programa,ncd);
ban=1;
printf("Registro Modificado\n");
MostrarLista(lista);
break;
}
}
bane=1;
}
nodo = nodo->siguiente;//nod es igual al nodo digiente ba aumentando posiciones
}
if(ban==0)
printf("No se encontro el registro\n");
if(bane==0)
printf("No se encontro el estudiante\n");
}
//**************************
//Eliminar
int EliminarRegistro(TipoLista &lista, int pos)//en la lista ba a borrar el valor ingresado que esta guarado en v
{
TipoLista nodo, anterior;//creamos dos nodos
nodo= lista;
int ban =0;
if(lista!=NULL)
{
while(nodo!=NULL)
{
if(nodo->posicion==pos)
{
ban=1;
printf("Registro del estudiante Eliminado\n");
if(nodo==lista)//para el ultimo valor
lista = lista->siguiente;//es igual al sigiente valor y como es el ultimo es null lista =null
else
anterior->siguiente = nodo->siguiente;// anterio apunta a sigiente y esto es = nodo sigiente apunta a sigiente//elimina la posicion y apunta a la sigiente posicion
delete(nodo);//y borramos nodo
pos--;
return pos;
}
anterior = nodo;// la posicion actual
nodo =nodo->siguiente;//pasa a la sigiente posicion
}
}
else
printf(" Lista vacia..!\n");
if(ban==0)
printf("No se encontro el registro del estudiante %d \n",pos);
return pos;
}
void borrar(TipoLista &lista)
{
TipoLista nodo , anterior;//creamos dos nodos
nodo= lista;
if(lista!=NULL)
{
while(lista!=NULL)
{
nodo=lista ;
lista = lista->siguiente;
delete(nodo);//y borramos nodo
}
}
}
No hay comentarios.:
Publicar un comentario