Вы находитесь на странице: 1из 8

Ejercicios Resueltos Listas Simples - Parte 1.

1. Analizar e indicar el objetivo de la funcin, sabiendo que DATO es tipo int y los datos
ledos por teclado corresponden a la secuencia 3, 32, 25, 1.
void FX(ptNODO &Lista, DATO X)
{
ptNODO A=NULL,N,B=Lista;
N=new(tipo_nodo);
N->Info=X;
N->Sig=NULL;
if(Lista==NULL) Lista=N;
else
{
while(X>=B->Info && B->Sig!=NULL)
{
A=B;
B=B->Sig;
}
if(X >= B->Info) A=B;
if(A==NULL)
{
N->Sig=Lista;
Lista=N;
}
else
{
N->Sig=A->Sig;
A->Sig=N;
}
}
}
2. Se usa una lista para almacenar un polinomio de orden "n":
a0*X0 + a1*X1 + a2*X2 + a3*X3 + + an*Xn
Cada nodo contiene un trmino del polinomio

Desarrolle un programa que permita leer los datos del polinomio, almacenarlos en una lista
enlazada y evaluar el polinomio para un valor de X ledo por teclado.
struct datos
{
int coef;
int expo;
};
typedef datos DATO;
struct NODO

DATO Info;
NODO * Sig;

};
typedef NODO* ptNODO;
// Procedimiento Insertar Ordenado segn el Exponente del Trmino
void INSERTAR_ORD(ptNODO &L, DATO X)
{
ptNODO A=NULL,N,B=L;
N=new(tipo_nodo);
N->Info=X;
N->Sig=NULL;
if(L==NULL) L=N;
else
{ while(X.expo>=B->Info.expo && B->Sig!=NULL)
{
A=B;
B=B->Sig;
}
if(X.expo>=B->Info.expo) A=B;
if(A==NULL)
{
N->Sig=L;
L=N; }
else
{
N->Sig=A->Sig;
A->Sig=N;
}
}
}
// Procedimiento Mostrar Polinomio
void MOSTRAR_POL(ptNODO Lis)
{
ptNODO P;
P=Lis;
cout<<endl;
while(P!=NULL)
{ cout<<showpos<<setw(3)<<P->Info.coef
<<"*X^"<<P->Info.expo;
P=P->Sig;
}
cout<<endl;
}
// Funcin Evaluar Polinomio
float EVAL_POL(ptNODO POL, float X)
{ float RES=0;
while(POL!=NULL)
{ RES=RES+POL->Info.coef*pow(X,POL->Info.expo);
POL=POL->Sig;
}
return RES;

}
//Programa Principal
void main(void)
{ ptNODO POL=NULL;
datos TER;
int i, n;
float X;
cout<<"Numero de trminos: ";
cin>>n;
for(i=1;i<=n; i++)
{ cout<<"T"<<i<<": coef = ";
cin>>TER.coef;
cout<<" expo = ";
cin>>TER.expo;
INSERTAR_ORD(POL,TER);
}
MOSTRAR_POL(POL);
cout<<"Valor de X =";
cin>>X;
cout<<endl;
cout<<"P("<<X<<") = "<<EVAL_POL(POL,X);
getch();
}

3. Implemente una funcin Conectar() que tome dos listas, L1 y L2 las enlace quedando solo
una lista. L1 debe quedar primero y L2 debe quedar como una lista vaca.
void Conectar(ptNODO &L1, ptNODO &L2)
{ ptNODO A;
if(L1==NULL) L1=L2;
else if(L2!=NULL)
{ A=L1;
while(A->Sig != NULL) A=A->Sig;
A->Sig = L2;
}
L2=NULL;
}
4. Disee una funcin SepararLista que reciba una lista y la separe en dos sub-listas. Con la
mitad del nmero de nodos en cada lista. Si el nmero de nodos es impar, el nodo extra debe
ir en la primera mitad. Por ejemplo si hacemos SepararLista() sobre la lista {7,10,12,8,17}
deber dar dos listas {7,10,12} y {8,17}.
void SepararLista(ptNODO &L, ptNODO &L1, ptNODO &L2)
{
int lon = LONGITUD(L); // Se utiliza la funcin genrica LONGITUD vista en clase
int i, cont;

ptNODO A=L;
if (lon < 2)
{
L1=L;
L2=NULL;
}
else
{
cont=(lon-1)/2;
for(i=0;i<cont;i++)
A=A->Sig;
L1=L;
L2=A->Sig;
A->Sig=NULL;
}
}
5. Disear una funcin que recibe un valor K, el cual representa la posicin de un nodo y
muestre la informacin de los dos nodos prximos anteriores y posteriores al nodo K.
void PreyPost(ptNODO Lista,int k)
{
ptNODO A=Lista, P,Q,S,T;
int cont=1;
if(A!=NULL)
{
while(A->Sig !=NULL && cont!=k)
{
cont++;
A=A->Sig;
}
}
if(cont==k)
{
cout<<"K es :"<<A->Info<<endl;
P=ANTERIOR(Lista,A), Q=ANTERIOR(Lista,P);
cout<<"ANTERIORES a nodo "<<k<<endl;
if(P==NULL && Q==NULL) cout<<"NO HAY ANTS "<<endl;
if(P!=NULL)cout<<setw(4)<<P->Info;
if(Q!=NULL)cout<<setw(4)<<Q->Info<<endl;
cout<<"POSTERIORES a nodo "<<k<<endl;
S=A->Sig;
if(S==NULL) T=NULL;
else T=S->Sig;
if(S==NULL && T==NULL) cout<<"NO HAY POSTS "<<endl;
if(S!=NULL) cout<<setw(4)<<S->Info;
if(T!=NULL) cout<<setw(4)<<T->Info<<endl;
}
else cout << "El elemento K NO existe" ;
}

6. Parte de un sistema de administracin de un hospital X, controla las especialidades que se


atienden en dicho hospital, los mdicos de la especialidad y la cantidad de pacientes que
examina cada mdico. Usando listas enlazadas escribir un algoritmo que permita:

1) Agregar mdicos a cualquier especialidad.


2) Eliminar un mdico.
3) Mostrar mdico de una especialidad existente, con mayor cantidad de pacientes

#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<iomanip.h>
# define TOPE 6
struct datos
{
char nombre[15];
int pac;
};
typedef datos DATO;
struct NODO
{
DATO info;
NODO *sig;
};
typedef NODO* ptNODO;
struct tipo_espec
{
char especialidad [15];
ptNODO Lista_med;
};
void IniLista(tipo_espec ESP[])
{
int i;
for(i=0;i<TOPE;i++)
{
cout<<"NOMBRE DE LA ESPECIALIDAD (Mayusc) :";
cin>>ESP[i].especialidad;
ESP[i].Lista_med=NULL;
}
}
int BuscaEspecial(tipo_espec ESP[], char Espe[])
{
int pos=0;
while(strcmp(Espe,ESP[pos].especialidad) && pos<TOPE) pos++;
if(strcmp(Espe,ESP[pos].especialidad)) return -1;
else return pos;

}
void InsertarIni(ptNODO &Lis, datos Elem)
{
ptNODO A;
A=new(tipo_nodo);
A->info=Elem;
A->sig=NULL;
if(Lis==NULL)
Lis=A;
else
{
A->sig=Lis;
Lis=A;
}
}
void MostrarLista(ptNODO Lista)
{
ptNODO A=Lista;
if (A != NULL)
{
while (A!= NULL)
{
cout<<setw(15)<<A->info.nombre;
cout<<setw(4)<<A->info.pac<<endl;
A= A->sig;
}
getch();
}
else cout<<"Lista Vacia ";
cout<<endl;
}
ptNODO Anterior(ptNODO L, ptNODO P)
{
if(ListaVacia(L) | P==NULL | L==P) return NULL;
else
{
while(L->sig!=P & L->sig!=NULL) L=L->sig;
if(L->sig==P) return L;
else return NULL;
}
}
void Borrar(ptNODO &L, char elem[])
{
ptNODO A;
A=Busqueda(L,elem);
if(A!=NULL)
{
if(A==L) L=L->sig;
else Anterior(L,A)->sig=A->sig;
delete(A);
}
else cout<<"NO EXISTE ESE NOMBRE"<<endl;
}
void MostrarMayor(ptNODO Lista)
{
ptNODO P=Lista;
int mayor=0;
char doc[15] ;
while(P!=NULL)
{ if(P->info.pac>mayor)

mayor=P->info.pac;
strcpy(doc,P->info.nombre);

}
else
P=P->sig;
}
cout<<"El Medico con mas pacientes es :"<<doc;
}
int ListaVacia(ptNODO Lista)
{
if(Lista==NULL) return 1;
else return 0;
}
void main()
{
tipo_espec ESP[TOPE];
ptNODO P;
tipo_info Medico;
char Espe[15], Nombre[15];
int opc=1 , pos=0,error;
clrscr();
IniLista(ESP);
while(opc<4)
{
clrscr();
cout<<"[1] Agregar Medico"<<endl;
cout<<"[2] Eliminar Medico"<<endl;
cout<<"[3] Medico con + Pacientes/Epecialidad"<<endl;
cout<<"[4] Salir "<<endl;
cout<<"Opcion :";
cin >> opc;
switch (opc)
{
case 1:
cout<<"Indique Especialidad: ;
cin>>Espe;
pos=BuscaEspecial(ESP,Espe);
if (pos>=0)
{
cout<<"Nombre del Medico: ";
cin>>Medico.nombre;
cout<<"Cantidad Pacientes: ";
cin>>Medico.pac;
InsertarIni(ESP[pos].Lista_med,Medico);
MostrarLista(ESP[pos].Lista_med);
}
else cout<<"NO EXISTE ESPECIALIDAD..."<<Espe;
break;
case 2:
cout<<"Indique Epecialidad: ";
cin>>Espe;
pos=BuscaEspecial(ESP,Espe);
if(pos>=0)
{
cout<<"Nombre del Medico: ";

cin>>Nombre;
Borrar(ESP[pos].Lista_med, Nombre);
}
else cout<<"NO EXISTE ESPECIALIDAD..."<<Espe;
break;
case 3:
cout<<"Indique Epecialidad: ";
cin>>Espe;
pos=BuscaEspecial(ESP,Espe);
if(pos>=0)
MostrarMayor(ESP[pos].Lista_med);
else cout<<"NO EXISTE "<<Espe;
getch();
break;
}
}
}

Вам также может понравиться