Está en la página 1de 99

VctorSanchez2 http://www.victorsanchez2.

com
Ejercicios y prcticas resuletas sobre
PROGRAMACIN AVANZADA EN
Copyright (c) 2008 Vctor Snchez Snchez.
Permission is granted to copy, distribte and!or modi"y this
docment nder the terms o" the #$% &ree 'ocmentation (icense,
Version ).* or any +ater ,ersion pb+ished by the &ree So"t-are
&ondation. -ith no /n,ariant Sections, no &ront0Co,er 1e2ts, and no
3ac40Co,er 1e2ts. 5 copy o" the +icense is inc+ded in the section
entit+ed 6#$% &ree 'ocmentation (icense6.
000
1his program is "ree so"t-are7 yo can redistribte it and!or
modi"y it nder the terms o" the #$% #enera+ Pb+ic (icense as
pb+ished by the &ree So"t-are &ondation, either ,ersion * o" the
(icense, or any +ater ,ersion.
1his program is distribted in the hope that it -i++ be se"+,
bt 8/19:%1 5$; 85<<5$1;. -ithot e,en the imp+ied -arranty o"
=><C95$153/(/1; or &/1$>SS &:< 5 P5<1/C%(5< P%<P:S>. See the #$%
#enera+ Pb+ic (icense "or more detai+s.
;o sho+d ha,e recei,ed a copy o" the #$% #enera+ Pb+ic
(icense a+ong -ith this program. /" not, see
?http7!!---.gn.org!+icenses!@.
!a "ocumentaci#n y los pro$ramas %ue"an licencia"os bajo las licencias &'(! y &)!.
Versi#n *.+ ,-+**+./
0utor: Vctor Snchez
2
1eb: www.victorsanchez2.com
orreo: victorsanchez22$mail.com
3abber: victorsanchez22jabberes.or$
Se recomien"a utilizar el compila"or $cc y el sistema operativo &N4/!inu5. En la
carrera vais a tener %ue utilizarlo in6ini"a" "e veces7 as %ue mejor comenzar ahora. Es
el mejor compila"or %ue e5iste y est arropa"o por la in6ini"a" "e pro$ramas "e $ran
cali"a" "el mun"o &N4/!inu5. )ara la carrera po"8is utilizar 0njuta para e"itar los
pro$ramas y el ((( para corre$ir vuestros bu$s.
*
VctorSanchez2 http://www.victorsanchez2.com
PRCTICA 1:
El objetivo "e esta prctica es a6ianzar ciertos conceptos bsicos "e la pro$ramaci#n en
len$uaje :
9ucles y tablas.
Entra"a y sali"a "e "atos.
)aso "e ar$umentos a un pro$rama.
:anejo "e archivos.
'unciones.
4so "e memoria "inmica.
EJERCICIOS
1.
Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue pi"a por tecla"o una serie "e
n;meros enteros7 los almacene en una tabla esttica y posteriormente escriba por
pantalla to"os los n;meros intro"uci"os in"ican"o a"ems cual es el mayor y el menor.
!o primero %ue "ebe hacer el pro$rama es pre$untar al usuario cuantos n;meros se van
a intro"ucir y comprobar %ue "icha canti"a" es menor %ue la "imensi#n "e la tabla. )ara
"icha "imensi#n "ebe "e6inirse una constante ,por ejemplo :0<=(>:ENS>?N/ a la
cual se pue"e asi$nar un valor razonable ,por ejemplo7 *++/.
'unciones a utilizar:
scanf: para leer n;meros intro"uci"os por el tecla"o.
printf: para imprimir por pantalla.
Ejemplo "e ejecuci#n: lo %ue se vera por pantalla "ebe ser al$o as como
>ntro"uce la canti"a" "e n;meros:
3
Introduce los nmeros:
5
7
2
Los nmeros introducidos son:
5
7
2
El mayor es el 7.
2
VctorSanchez2 http://www.victorsanchez2.com
El menor es el 2.
/*********************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
*
**********************************************************/

)include *stdio.h+
)include *stdli".h+
)include *strin(.h+
)de,ine -. /
)de,ine E00 1/222/
)de,ine 3A456I3 /22
int enteros73A456I389 /* Array #ara (uardar los enteros */
int num5total9
int lectura:%oid;9
int sacar#antalla:int ma<= int min= int num5total;9
int calcular:int *ma<= int *min= int total;9
int es5di(ito:char caracter78;9
int main:;
>
int menor9 /* ?umero menor */
int mayor9 /* ?umero mayor */
i, :lectura:; @@ E00;
>
#rint,:AError al leer el numero de terminos.BnA;9
return E009
C

i, :calcular:Dmayor= Dmenor= num5total; @@ E00;
>
#rint,:AError al intentar calcular el mayor y el menorA;9
return E009
C

i, :sacar#antalla:mayor= menor= num5total; @@ E00;
>
#rint,:AError al mostrar #or #antalla.BnA;9
return E009
C
return -.9
C
/*********************************************************
* Euncion: int lectura:int *total;
*
* I?: Foma una %aria"le ti#o int.
* -GF: 6e%uel%e -. si se ha leido correctamente= E00 si hay al(un ,allo.
* 3A.E: -"tiene los numeros Hue introduce el usuario y los (uarda
* en un array de enteros
**********************************************************/
int lectura:%oid;
>
int continuar @ -.9
int n9
char numeros73A456I389

,or :n @ 29 n * :int; strlen:numeros;9 nII;
-
VctorSanchez2 http://www.victorsanchez2.com
numeros7n8 @ J2J9
#rint,:ABn&uantos numeros %a a introducirK 11+ A;9
do >
(ets:numeros;9
continuar @ -.9
i, ::num5total @ es5di(ito:numeros;; @@ E00;
continuar @ E009
i, :num5total *@ 2;
>
#rint,:A6e"e introducir un numero #ositi%o.BnA;9
continuar @ E009
C
C $hile :continuar L@ -.;9

#rint,:ABnIntroduca los numeros: BnA;9
,or :n @ 29 n * num5total9 nII;
>
(ets:numeros;9
i, ::enteros7n8 @ es5di(ito:numeros;; @@ E00;
>
#rint,:AError al leer el numero= #or ,a%or re#ita introduccion.BnA;9
n119
C
C
return -.9
C
/*********************************************************
* Euncion: int calcular:int *ma<= int *min= int num5total;
*
* I?: *ma< y *min Hue acumulan el numero mayor y menor. num5total
* acumula la cantidad de numeros Hue se %an a introducir.
* -GF: -. si se ha realiado correctamente o E00 si hay ,allos.
* 3A.E: Encuentra el minimo y el ma<imo de los numeros introducidos
*
**********************************************************/
int calcular:int *ma<= int *min= int total;
>
int n9
*min @ *ma< @ enteros7289 /* Lo inicialiamos */

,or :n @ /9 n * total9 nII;
>
i, :*min + enteros7n8;
*min @ enteros7n89
i, :*ma< * enteros7n8;
*ma< @ enteros7n89
C
return -.9
C
/*********************************************************
* Euncion: int sacar#antalla:int ma<= int min= int num5total;
*
* I?: toma el %alor ma<imo=minimo y total de elementos
* -GF: de%uelde E00 si no #uede y -. si #uede
* 3A.E: ?ada
*
**********************************************************/
int sacar#antalla:int ma<= int min= int num5total;
>

int n9
#rint,:ALos numeros introducidos son: A;9

@
VctorSanchez2 http://www.victorsanchez2.com
,or :n @ 29 n * num5total9 nII;
#rint,:AMd= A= enteros7n8;9
#rint,:ABn3inimo: MdA= min;9
#rint,:ABn3a<imo: MdBnA= ma<;9
return -.9
C
/*********************************************************
* Euncion: int es5di(ito:char caracter;
*
* I?: Se le da una serie de caracteres #ara Hue se #asen a numero
* -GF: ?os de%ol%era E00 si se #roduce un eroor
* 3A.E: &om#rue"a la inte(ridad de los datos
*
**********************************************************/
int es5di(ito:char caracter78;
>
int i9
int num @ 29
int ran(o9
/* Si la cadena esta %acia */
i, :caracter728 @@ 2;
return E009

i, :caracter728 @@ J1J; /* Si se ha introducido un numero ne(ati%o */
>
i @ /9
/* Em#eamos el "ucle #ara %er si es caracter desde el si(uiente caracter */
ran(o @ 59
C
else /* 6e"e ser un numero #ositi%o o hay al(un error */
>
i @ 29
ran(o @ N9
C
/* &om#ro"amos Hue todos los elementos sean di(itos */
/* El mayor numero Hue #ermitimos es OOOO */
i, ::int; strlen:caracter; + ran(o;
>
#rint,:A?o #uede introducir esa cantidad de numerosLLLBnA;9
#rint,:AEs demasiado (rande. Introduca numeros entre 1OOOO y OOOOBnA;9
return E009
C
,or :i @ i9 i * :int; strlen:caracter;9 iII;
i, :caracter7i8 * J2J PP caracter7i8 + JOJ;
>
#rint,:ABnIntroduca unicamente di(itos= #or ,a%or.BnA;9
return E009
C

/* Si solo se ha introducido un caracter */
i, :strlen:caracter; @@ /;
return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */

/* Si hay mas de un caracter */
,or :i @ 29 i L@ :int; strlen:caracter;9 iII;
num @ :num * /2; I :caracter7i8 1 J2J;9
return num9
A
VctorSanchez2 http://www.victorsanchez2.com
C
2.
Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue lea el conteni"o "e un archivo "e
te5to y lo vuel%ue por pantalla7 in"ican"o posteriormente la lon$itu" "e la lnea ms
lar$a. El pro$rama "ebe recibir el nombre "el archivo como ar$umento7 no tenien"o %ue
intro"ucirse 8ste por pantalla. )ara ello la 6unci#n main "ebe tener el prototipo estn"ar
int main(int argc, char *argv[].
'unciones a utilizar:
fopen: para abrir un archivo.
fclose: para cerrar un archivo.
fgets: para leer una lnea "e un archivo.
strlen: para obtener la lon$itu" "e una ca"ena.
/*****************************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
* 3aQe: Este al(oritmo lee un archi%o introducido #or el usuario
* y calcula cual es el numero de caracteres de la linea mayor.
*****************************************************************************/

)include *stdio.h+
)include *strin(.h+
)de,ine E00 1/
)de,ine -. /
)de,ine 3A456I3 R2 /* 3a<ima lon(itud de la linea */
)de,ine mayor:a=";::a; + :"; K :a;::";;
char *,(ets:char *linea= int ma<= EILE * ,#;9
int mayor5linea:%oid;9
int leer5archi%o:char *archi%o78;9
%oid ayuda:%oid;9
EILE * ,#9
int ma< @ 3A456I39
int main:int ar(c= char *ar(%78;
>
/* 6e"e introducir *nom"re del eSecuta"le+ *nom"re del archi%o+ */
i, :ar(c L@ 2;
>
ayuda:;9
return E009
C
i, :leer5archi%o:Dar(%7/8; @@ E00;
return E009

#rint,:ABnLa linea mas lar(a tiene Md caracteres.BnA= mayor5linea:;;9
,close:,#;9
return -.9
C
B
VctorSanchez2 http://www.victorsanchez2.com
/*****************************************************************************
* Euncion: int leer5archi%o:char *archi%o78;
*
* I?: ?om"re del archi%o
* -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo
* 3A.E: Lee un archi%o introducido #or el usuario.
*
*****************************************************************************/
int leer5archi%o:char *archi%o78;
>

i, ::,# @ ,o#en:archi%o728= ArA;; @@ ?GLL;
>
#rint,:AError al intentar a"rir el archi%oBnA;9
return E009
C
return -.9
C
/*****************************************************************************
* Euncion: int mayor5linea:%oid;
*
* I?:
* -GF: Fama(no de la linea de mayor lon(itud del archi%o.
* 3A.E: &alcula el tama(no de la linea mas lar(a.
*
*****************************************************************************/
int mayor5linea:%oid;
>

char cad73A456I389
int mayor5cad @ 29 /* Inicialiamos el %alor de la cadena */
$hile :L,eo,:,#;;
>
,(ets:cad= 3A456I3= ,#;9
mayor5cad @ mayor:mayor5cad= :int; strlen:cad;;9
C

return mayor5cad9
C
/*****************************************************************************
* Euncion: %oid ayuda:%oid;
*
* I?:
* -GF: 3ensaSe de ayuda #ara el usuario.
* 3A.E: 3uestra ayuda al usuario #ara Hue introduca los datos
correctamente.
*
*****************************************************************************/
%oid ayuda:%oid;
>
#rint,:ABn6e"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+BnA;9
C
!.
El n;mero e ,2.C*.-.../ se pue"e apro5imar me"iante la suma:
C
VctorSanchez2 http://www.victorsanchez2.com
Sumatorio "e */nD "es"e nE+ hasta nEN
En esta e5presi#n la precisi#n %ue"a "etermina"a por el valor N. El valor n! representa
el 6actorial "e n ,*F2F...F,n G*/Fn/. Hecor"emos %ue7 por "e6inici#n7 +DE*.
Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue permita calcular la apro5imaci#n
al n;mero e "a"a por N ,valor pre$unta"o al usuario/. (ebe utilizarse una 6unci#n
au5iliar "e prototipo "#$at %act$ria# (int n& "icha 6unci#n "ebe ser una 6unci#n
recursiva7 puesto %ue nDEnF,nG*/D.
/*********************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
*
* 3A.E: Este #ro(rama realia la a#ro<imacion al numero e.
* Lo hemos realiado de 2 maneras:
* 1 0ecursi%amente.
* 1 Eorma mas e,iciente :sin usar recursi%idad;.
*
* Gn eSem#lo: :introduciendo /2222 terminos;
* 1 0ecursi%idad: /2 se(undos a#ro<imadamente
* 1 E,icientemente: Se o"tiene el resultado instantaneamente.
*
**********************************************************/

)include *stdio.h+
)include *strin(.h+
)de,ine -. /
)de,ine E00 1/222/
)de,ine ?- 2
)de,ine 3A45FE03 /222222
,loat n5term9
int e,iciente9
int lectura:int *e,iciente= ,loat *n5term;9
,loat calcular:,loat n5term;9
int sacar#antalla:,loat numeroe;9
,loat ,actorial:int n;9
int es5di(ito:char caracter78;9
int main:;
>
i, :lectura:De,iciente= Dn5term; @@ E00;
>
#rint,:AError al leer el numero de terminosBnA;9
return E009
C
i, :sacar#antalla:calcular:n5term;; @@ E00;
>
#rint,:AError al sacar #or #antalla/calcular el numeroBnA;9
return E009
C
return -.9
C
/*********************************************************
.
VctorSanchez2 http://www.victorsanchez2.com
* Euncion: int sacar#antalla:,loat numeroe;
*
* I?: Foma la %aria"le numeroe de ti#o ,loat.
* -GF: 6e%uel%e -. si lo consi(ue= E00 si hay al(un
* 3A.E: Saca #or #antalla el resultado. ?o modi,ica nin(una %aria"le.
*
**********************************************************/
int sacar#antalla:,loat numeroe;
>

#rint,:ABnEl %alor de la a#ro<imacion al numero e es: M,BnBnA= numeroe;9
return -.9
C
/*********************************************************
* Euncion: int lectura:int *e,iciente= ,loat *n5term;
*
* I?: Foma la direccion de la %aria"le e,iciente= y el numero de tTrminos
* -GF: ?os de%uel%e -. si lo consi(ue E00 si hay al(un ,allo.
* 3A.E: Se encar(a de leer el numero de terminos a calcular. 3odi,ica
* n5term y e,iciente.
*
**********************************************************/
int lectura:int *e,iciente= ,loat *n5term;
>
char numero7589
char tem# @ 29
int continuar @ ?-9

do >
#rint,:ABnIntroduca el numero de terminos a calcular del numero e: A;9
(ets:numero;9
C $hile ::*n5term @ es5di(ito:numero;; @@ E00 PP :*n5term * /;;9
do >
#rint,:A6esea usar el modo de calculo ra#idoK 7S=?8:BtA;9
,,lush:stdin;9
,,lush:stdout;9
scan,:AMcA= Dtem#;9
,,lush:stdin;9
i, ::tem# @@ JSJ; PP :tem# @@ J?J; PP :tem# @@ JsJ; PP :tem# @@ JnJ;;
>
continuar @ -.9
i, ::tem# @@ JSJ; PP :tem# @@ JsJ;;
*e,iciente @ -.9
else
>
*e,iciente @ ?-9
i, :strlen:numero; + N; /* Uermitimos hasta el numero OOOO */
>
#rint,:ABnSi desea calcular este numero con recursi%idad #uede
ocasionar #ro"lemas.A;9
#rint,:ABnIntentelo con la manera e,iciente.BnA;9
return E009
C
C
C
else
>
continuar @ ?-9
#rint,:AUor ,a%or introduca un %alor %alidoLLL BnA;9
C
C $hile :continuar L@ -.;9
return -.9
C
I
VctorSanchez2 http://www.victorsanchez2.com
/*********************************************************
* Euncion: ,loat calcular:,loat terminos;
*
* I?: ?umero de terminos #ara realiar la a#ro<imacion.
* -GF: La a#ro<imacion al numero e si es correcto o E00 si ha ha"ido un
* ,allo.
* 3A.E: &alcula la serie: / entre el ,actorial de un numero dado.
*
**********************************************************/
,loat calcular:,loat terminos;
>
,loat e @ 29
,loat ,acto @ /9 /* Va a ir acumulando el %alor del ,actorial cuando
se haya
seleccionado Ae,icienteA */
int n9
i, :e,iciente @@ -.;
>
#rint,:ABnSe esta calculando el numero e de la manera mas e,iciente.A;9
e @ /9
,or :n @ /9 n * :int; terminos9 IIn;
>
,acto *@ n9
e I@ / / ,acto9
C

return e9
C
else /* &alculamos la serie usando recursi%idad */
>
do >
e I@ :/ / ,actorial::int; terminos11;;9
C $hile :terminos +@ 2;9

#rint,:ABnSe esta calculando el numero e usando recursi%idad.A;9
C
return e9
C
/*********************************************************
* Euncion: ,loat ,actorial :int n;
*
* I?: ?umero de terminos de los Hue se calcularan sucesi%os ,actoriales
* -GF: El ,actorial del numero o E00 si ha ha"ido al(un error.
* 3A.E: &alcula el ,actorial de un numero dado.
*
**********************************************************/
,loat ,actorial:int n;
>
i, :n @@ 2;
return /9
else
return :n * ,actorial:n 1 /;;9
C
/*********************************************************
* Euncion: int es5di(ito:char caracter;
*
* I?: Se le da una serie de caracteres #ara Hue se #asen a numero
* -GF: ?os de%ol%era E00 si se #roduce un eroor
* 3A.E: &om#rue"a la inte(ridad de los datos
*
**********************************************************/
int es5di(ito:char caracter78;
*+
VctorSanchez2 http://www.victorsanchez2.com
>
int i9
int num @ 29
int ran(o9
/* Si la cadena esta %acVa */
i, :caracter728 @@ 2;
return E009
i, :caracter728 @@ J1J; /* Si se ha introducido un numero ne(ati%o */
>
i @ /9
/* Em#eamos el "ucle #ara %er si es caracter desde el si(uiente caracter */
ran(o @ 79
C
else /* 6e"e un numero #ositi%o o hay al(un error */
>
i @ 29
ran(o @ 79
C

/* &om#ro"amos Hue todos los elementos sean di(itos */
/* El mayor numero #ermitido es OOOOOOO */
i, ::int; strlen:caracter; + ran(o;
>
#rint,:A?o #uede introducir esa cantidad de numerosLLLBnA;9
#rint,:AEs demasiado (rande. 0an(o: 1OOOOOOO y OOOOOOOBnA;9
return E009
C
,or :i @ i9 i * :int; strlen:caracter;9 iII;
i, :caracter7i8 * J2J PP caracter7i8 + JOJ;
>
#rint,:ABnIntroduca unicamente di(itos= #or ,a%or.BnA;9
return E009
C
/* Si solo se ha introducido un caracter */
i, :strlen:caracter; @@ /;
return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */
/* Si hay mas de un caracter */
,or :i @ 29 i L@ :int; strlen:caracter;9 iII;
num @ :num * /2; I :caracter7i8 1 J2J;9
return num9
C
'.
:o"i6icar el pro$rama "el ejercicio * para %ue en lu$ar "e utilizar una tabla esttica
utilice una tabla aloca"a "inmicamente. !a tabla "ebe alocarse una vez %ue el usuario
ha in"ica"o el n;mero "e elementos y "ebe liberarse al 6inalizar el pro$rama.
'unciones a utilizar:
malloc: para alocar memoria "inmicamente.
free: para liberar memoria previamente aloca"a.
/*****************************************************************************
**
VctorSanchez2 http://www.victorsanchez2.com
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
*
*****************************************************************************/

)include *stdio.h+
)include *alloc.h+
)include *stdli".h+
)include *strin(.h+
)de,ine -. /
)de,ine E00 1/222/
)de,ine ?- 2
)de,ine 3A456I3 OOOO
int crearta"la:int **#ta"la= int *numero;9
int rellenarta"la:int *ta"la= int numero;9
int controldeerrores:int numero;9
int calcular:int *ta"la= int numero= int *ma<= int *min;9
int mostrar%alores:int *ta"la= int numero= int ma<= int min;9
int es5di(ito:char caracter78;9
int *ta"la @ ?GLL9
int numero= ma<= min9
int main:%oid;
>
i, :crearta"la:Dta"la= Dnumero; @@ E00;
return E009
i, :rellenarta"la:ta"la= numero; @@ E00;
return E009
calcular:ta"la= numero= Dma<= Dmin;9
mostrar%alores:ta"la= numero= ma<= min;9
return -.9
C
/*****************************************************************************
* Euncion: int crearta"la:int **#ta"la= int *numero;
*
* I?: la direccion de un #untero y la direccion del numero de elementos a
* (uardar
* -GF: -. si se consi(ue= E00 si se ,alla
* 3A.E: &rea una ta"la dinamica de enteros en donde se (uardaran los numeros
* introducidos
*
*****************************************************************************/
int crearta"la:int **#ta"la= int *numero;
>
int continuar9
char elementos73A456I389
do >
continuar @ -.9
#rint,:AUor ,a%or introduca el numero de elementos: A;9
(ets:elementos;9
/* Si esta %acio= es ne(ati%o o 2... */
i, :elementos728 @@ 2 PP elementos728 @@ J1J PP elementos728 @@ J2J;
continuar @ E009
i, ::*numero @ es5di(ito:elementos;; @@ E00;
continuar @ E009
C $hile :continuar L@ -.;9

*#ta"la @ :int *; malloc:*numero * sieo,:int;;9

*2
VctorSanchez2 http://www.victorsanchez2.com
i, :*#ta"la @@ ?GLL;
return E009

return -.9
C
/
******************************************************************************
* Euncion: int rellenarta"la:int *ta"la= int numero;
*
* I?: la direccion de la ta"la= el numero de enteros a (uardar
* -GF: -. si se consi(ue E00 si se ,alla
* 3A.E: rellena la ta"la con los numero Hue introduca el usuario
*
*****************************************************************************/
int rellenarta"la:int *ta"la= int numero;
>

int i= continuar9
char num73A456I389
#rint,:AUor ,a%or introduca los numeros: BnA;9
,or :i @ 29 i * numero9 IIi;
>
continuar @ -.9
(ets:num;9
i, :num728 @@ 2;
>
#rint,:A6e"eria introducir al(un di(ito.BnA;9
continuar @ E009
C
i, ::*ta"laII @ es5di(ito:num;; @@ E00;
>
#rint,:AError al leer el numero.BnA;9
continuar @ E009
C
i, :continuar @@ E00;
i119
C
return -.9
C
/
******************************************************************************
* Euncion: int calcular:int *ta"la= int numero= int *ma<= int *min;
*
* I?: La direccion de la ta"la= el numero de elementos= y la direccion del
* numero mas (rande y mas #eHueWo
* -GF: -. si se consi(ue E00 si ,alla
* 3A.E: calcula el numero mas (rande y el mas #eHueWo
*
*****************************************************************************/
int calcular:int *ta"la= int numero= int *ma<= int *min;
>
int i9
*ma< @ *min @ ta"la7/89
,or :i @ 29 i * numero9 iII;
>
i, :ta"la7i8 + *ma<;
*ma< @ ta"la7i89
i, :ta"la7i8 * *min;
*min @ ta"la7i89
C

*-
VctorSanchez2 http://www.victorsanchez2.com
return -.9
C
/
******************************************************************************
* Euncion: int mostrar%alores:int *ta"la= int numero= int ma<= int min;
*
* I?: La direccion de la ta"la y los %alores del numero ma<imo= minimo y
* numero de enteros
* -GF: -. si se consi(ue E00 si ,alla
* 3A.E: mostrar #or #antalla los %alores
*
*****************************************************************************/
int mostrar%alores:int *ta"la= int numero= int ma<= int min;
>

int i9
#rint,:ALos %alores introducidos han sido:BtA;9

,or :i @ 29 i * numero9 iII;
#rint,:AMdBtA= ta"la7i8;9

,ree:ta"la;9

#rint,:ABnEl %alor ma<imo ha sido:BtMdA= ma<;9
#rint,:ABnEl %alor minimo ha sido:BtMdA= min;9
#rint,:ABnEl numero de terminos introducidos ha sido: MdBtBnA= numero;9

return -.9
C
/*********************************************************
* Euncion: int es5di(ito:char caracter;
*
* I?: una cadena de caracters
* -GF: el %alor del numero
* 3A.E: nada
*
**********************************************************/
int es5di(ito:char caracter78;
>

int i9
int num @ 29
int ran(o9
i, :caracter728 @@ J1J; /* Si se ha introducido un numero ne(ati%o */
>
i @ /9
/* Em#eamos el "ucle #ara %er si es caracter desde el si(uiente caracter */
ran(o @ 59
C
else /* 6e"e un numero #ositi%o o hay al(un error */
>
i @ 29
ran(o @ N9
C

/* &om#ro"amos Hue todos los elementos sean di(itos */
i, ::int; strlen:caracter; + ran(o;
/* El mayor numero Hue #ermitimos es OOOO */
>
#rint,:A?o #uede introducir esa cantidad de numerosLLLBnA;9
#rint,:AEs demasiado (rande. Introduca numeros entre 1OOOO y OOOOBnA;9
return E009
C
*@
VctorSanchez2 http://www.victorsanchez2.com
,or :i @ i9 i * :int; strlen:caracter;9 iII;
i, :caracter7i8 * J2J PP caracter7i8 + JOJ;
>
#rint,:ABnIntroduca unicamente di(itos= #or ,a%or.BnA;9
return E009
C
/* Si solo se ha introducido un caracter */
i, :strlen:caracter; @@ /;
return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */

/* Si hay mas de un caracter */
,or :i @ 29 i L@ :int; strlen:caracter;9 iII;
num @ :num * /2; I :caracter7i8 1 J2J;9
return num9
C
PRCTICA 2:
?93EJ>V?S
El objetivo "e esta prctica es a6ianzar ciertos conceptos bsicos "e la pro$ramaci#n en
len$uaje :
Estructuras y tipos "e "atos "e6ini"os.
)unteros.
4so "e memoria "inmica.
omparaciones entre variables7 ca"enas7 punteros.

1.
(e6inir un tipo "e "atos %ue represente a una persona7 sien"o sus campos: el nombre
,char K/7 el apelli"o ,char K/7 el ni6 ,char L*+M/ y la e"a" ,int/. !lamar )EHS?N0 a este
tipo "e "atos. Escribir un pro$rama %ue pi"a por pantalla esos "atos y rellene una
variable "e tipo )EHS?N0. )restar atenci#n al hecho "e %ue los miembros nombre y
apelli"o "eben alocarse "inmicamente7 y liberarse posteriormente. Escribir una 6unci#n
au5iliar "e prototipo voi" !iberar)ersona,)EHS?N0/N %ue libere "ichos punteros.
Funciones C a utilizar:
typedef : para definir un tipo de datos.
gets: para leer una lnea del teclado.
malloc y free: para alocar y liberar memoria.
/*****************************************************************************
*
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
* 3aQe: Este #ro(rama #ide los datos #or #antalla de una estructura en la
* Hue se (uardaran: nom"re= a#ellido= ni, y edad. El nom"re y el
* a#ellido son alocados dinamicamente y #osteriormente li"erados.
*
*A
VctorSanchez2 http://www.victorsanchez2.com
*****************************************************************************/
)include *stdio.h+
)include *alloc.h+
)include *stdli".h+
)include *strin(.h+
)de,ine 3A45L-?X5?IE /2 /* Lon(itud ma<ima del ?IE */
)de,ine 3A4LE? R2 /* Lon(itud ma<ima de las cadenas Hue leemos */
ty#ede, struct
>
char *nom"re9
char *a#ellido9
char ni,73A45L-?X5?IE89
int edad9
C UE0S-?A9
UE0S-?A #ersona= *#Uersona@?GLL9
ty#ede, enum > -. @ /= E00 @ 2C status9
status Leer6atos:UE0S-?A *##;9
%oid 3ostrar6atos:UE0S-?A *;9
status Es6i(ito:char *caracter;9
status &adenaVacia:char caracter78;9
int UasaAEntero:char caracter78= int ma<imo;9
status Li"erarUersona:UE0S-?A *;9
int main:%oid;
>
#Uersona @ D#ersona9
i, :Leer6atos:#Uersona; @@ E00;
>
Li"erarUersona:#Uersona;9
return E009
C
3ostrar6atos:#Uersona;9
Li"erarUersona:#Uersona;9
return -.9
C
/*****************************************************************************
* Euncion: status Leer6atos:UE0S-?A *##;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A. Varia"le: *##
* -GF: -. si se leen los datos correctamente= E00 si hay al(un ,allo
* 3A.E: Uide los datos de la #ersona al usuario y lo (uarda en la estructura
*
*****************************************************************************/
status Leer6atos:UE0S-?A *##;
>
)de,ine L-?X5?IE R /* ?umero de di(itos Hue de"e tener el ?IE */
)de,ine L-?X5&A6E?A Y2
char tem#73A4LE?89
int i9
#rint,:AIntroduca los datos de la #ersona:BnA;9
#rint,:ABn?om"re: A;9
(ets:tem#;9
##1+nom"re @ :char *; malloc::strlen:tem#; I /; * sieo,:char;;9
i, :&adenaVacia:tem#; @@ -.;
return E009
else i, :strlen:tem#; + L-?X5&A6E?A;
>
*B
VctorSanchez2 http://www.victorsanchez2.com
#rint,:ALa lon(itud de la cadena es demasiado lar(aA;9
return E009
C
else
strc#y:##1+nom"re= tem#;9
,,lush:stdout;9
#rint,:AA#ellido: A;9
(ets:tem#;9
##1+a#ellido @ :char *; malloc::strlen:tem#; I /; * sieo,:char;;9
i, :&adenaVacia:tem#; @@ -.;
return E009
else
strc#y:##1+a#ellido= tem#;9
,or :i@29 i*strlen:##1+a#ellido;9 iII;
>
i, :##1+a#ellido7i8 @@ J J;
>
#rint,:AIntroduca un a#ellido unicamente y no deSe es#acios.A;9
return E009
C
C
#rint,:A?IE :R di(itos= comience con 2 si es necesario;: A;9
(ets:tem#;9
i, :strlen:tem#; L@ L-?X5?IE;
>
#rint,:AEl ?IE de"e tener R di(itos.BnA;9
return E009
C
i, :Es6i(ito:tem#; @@ -.;
>
,or :i@29 i*strlen:tem#;9 iII;
##1+ni,7i8 @ tem#7i89
C
else
return E009
#rint,:AEdad: A;9
(ets:tem#;9
i, :Es6i(ito:tem#; @@ E00;
return E009
##1+edad@UasaAEntero:tem#= 2;9
i, :##1+edad @@ E00;
>
#rint,:ABnError al intentar leer la edad.A;9
#rint,:ABnLa edad de"e estar entre / y OO.BnA;9
return E009
C
return -.9
C
/*****************************************************************************
* Euncion: %oid 3ostrar6atos:UE0S-?A *##;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A
* -GF:
* 3A.E: 3uestra los datos de la estructura #or #antalla
*
*****************************************************************************/
%oid 3ostrar6atos:UE0S-?A *##;
>
#rint,:ABnLos datos o"tenidos son:BnA;9
#rint,:ABn?om"re: MsA= ##1+nom"re;9
*C
VctorSanchez2 http://www.victorsanchez2.com
#rint,:ABnA#ellido: MsA= ##1+a#ellido;9
#rint,:ABn?IE: MsA= ##1+ni,;9
#rint,:ABnEdad: MdA= ##1+edad;9
C
/*********************************************************
* Euncion: int Es6i(ito:char *caracter;
*
* I?: Se le da una serie de caracteres #ara Hue se com#rue"e si es un numero
* -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si ha ido todo "ien
* 3A.E: &om#rue"a la inte(ridad de los datos
*
**********************************************************/
status Es6i(ito:char *caracter;
>
int i9
&adenaVacia:caracter;9
,or :i @ 29 i * :int; strlen:caracter;9 iII;
i, :caracter7i8 * J2J PP caracter7i8 + JOJ;
>
#rint,:ABnIntroduca unicamente di(itos= #or ,a%or.BnA;9
return E009
C
return -.9
C
/*****************************************************************************
* Euncion: status &adenaVacia:char caracter78;
*
* I?: Gna cadena de caracteres
* -GF: E00 si la cadena no esta %acia= -. si la cadena esta %acia
* 3A.E: &om#rue"a si una cadena esta o no %acia
*
*****************************************************************************/
status &adenaVacia:char caracter78;
>
i, :caracter728 @@ 2;
>
#rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosBnA;9
return -.9
C
return E009
C
/*****************************************************************************
* Euncion: int UasaAEntero:char caracter78= int ma<imo;
*
* I?: cadena de caracteres Hue tenemos Hue #asar a entero y ma<imo de
* di(itos #ermitidos.
* -GF: El numero #asado a entero o E00 si hay al(un ,allo
* 3A.E: Uasa una cadena de caracteres a entero
*
*****************************************************************************/
int UasaAEntero:char caracter78= int ma<imo;
>
int num@29
int i9
i, :strlen:caracter; + ma<imo;
>
*.
VctorSanchez2 http://www.victorsanchez2.com
#rint,:ABn6ato erroneo.A;9
return E009
C
/* Si solo se ha introducido un caracter */
i, :strlen:caracter; @@ /;
return num @ caracter728 1 J2J9 /* 6e%ol%emos el di(ito */
/* Si hay mas de un caracter */
,or :i @ 29 i L@ :int; strlen:caracter;9 iII;
num @ :num * /2; I :caracter7i8 1 J2J;9 /* Lo de%ol%emos #asado a numero
*/
return num9
C
/*****************************************************************************
* Euncion: status Li"erarUersona:UE0S-?A *##;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A
* -GF: -.
* 3A.E: Li"era la memoria Hue ha"iamos reser%ado #re%iamente
*
*****************************************************************************/
status Li"erarUersona:UE0S-?A *##;
>
,ree:##1+nom"re;9
,ree:##1+a#ellido;9
return -.9
C
2.
Escribir un pro$rama ,es "ecir una 6unci#n main/ %ue lea el conteni"o "e un archivo "e
te5to en el %ue ca"a lnea conten$a los "atos %ue "e6inen a una persona7 y rellene "e esa
6orma una tabla "e variables "e tipo )EHS?N0. El pro$rama "ebe recibir el nombre "el
archivo como ar$umento7 no tenien"o %ue intro"ucirse 8ste por pantalla. )ara ello la
6unci#n main "ebe tener el prototipo estn"ar int main(int argc, char *argv[]. El
pro$rama "ebe comprobar %ue el n;mero "e lneas %ue se van leyen"o no supera la
"imensi#n "e la tabla "e6ini"a. 4na vez termina"o "e leer el archivo "ebe imprimirse
por pantalla los "atos "e to"as las personas ,una por lnea/7 y liberarse to"a la memoria
aloca"a "inmicamente.
'unciones a utilizar:
fopen: para abrir un archivo.
fclose: para cerrar un archivo.
fgets: para leer una lnea "e un archivo
/*****************************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
* 3aQe: Este #ro(rama lee el contenido de un archi%o de te<to en el Hue cada
* linea contiene los datos Hue de,inen a una #ersona y rellena una
*I
VctorSanchez2 http://www.victorsanchez2.com
* ta"la de ti#o UE0S-?A. El nom"re del archi%o se reci"e como
* ar(umento. &uando se ha terminado de leer el archi%o se muestran #or
* #antalla los datos de las di,erentes #ersonas.
*
*****************************************************************************/
)include *stdio.h+
)include *stdli".h+
)include *strin(.h+
)include *cty#e.h+
)include *conio.h+
)de,ine 3A45LE? R2
)de,ine 3A45UE0S 222
)de,ine 3A45L-?X5?IE /2
ty#ede, struct
>
char *nom"re9
char *a#ellido9
char ni,73A45L-?X5?IE89
int edad9
C UE0S-?A9
UE0S-?A #ersona73A45UE0S8= *#Uersona@?GLL9
ty#ede, enum > -. @ /= E00 @ 2C status9
%oid ayuda:%oid;9
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9
status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char
*#Edad;9
status &adenaVacia:char *caracter;9
status Es6i(ito:char *caracter= int lon(itud;9
int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;9
%oid 3ostrar6atos:UE0S-?A *##= int linea;9
status Li"erarUersona:UE0S-?A *;9
status Li"erarArray:UE0S-?A *##= int *to#;9
int main:int ar(c= char *ar(%78;
>
int to#@29 /* ?umero de #ersonas leidas */
clrscr:;9
#Uersona @ #ersona9 /* Uuntero Hue a#unta a una estructura de ti#o UE0S-?A */
/* Se de"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+ */
i, :ar(c L@ 2;
>
ayuda:;9 /* 3ensaSe de ayuda #ara el usuario */
return E009
C
i, :LeerArchi%o:Dar(%7/8= #Uersona= Dto#; @@ E00;
>
#rint,:ABn0e%ise el ,ichero= se #roduSo un ,allo al intentar leerle.BnA;9
return E009
C
return -.9
C
/*****************************************************************************
* Euncion: %oid ayuda:%oid;
*
* I?:
* -GF: 3ensaSe de ayuda #ara el usuario.
2+
VctorSanchez2 http://www.victorsanchez2.com
* 3A.E: 3uestra ayuda al usuario #ara Hue introduca los datos
* correctamente.
*
*****************************************************************************/
%oid ayuda:%oid;
>
#rint,:AGso del #ro(rama: *nom"re del eSecuta"le+ *nom"re del archi%o+A;9
C
/*****************************************************************************
* Euncion: status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;
*
* I?: ?om"re del archi%o= #untero a una estructura de ti#o UE0S-?A y ma<imo
* numero de #ersonas.
* -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo
* 3A.E: Lee un archi%o introducido #or el usuario.
*
*****************************************************************************/
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;
>
EILE *,#9
int inicio@29 /* Uosicion en el array de estructuras */
char cad73A45LE?89 /* &adena con la Hue leemos las lineas del ,ichero */
char nom"re73A45LE?89
char a#ellido73A45LE?89
char ni,73A45LE?89
char edad73A45LE?89
i, :L:,# @ ,o#en:archi%o728= ArA;;;
>
#rint,:ABnError al intentar a"rir el archi%oBnA;9
return E009
C
$hile :L,eo,:,#;;
>
i, :*#Fo# @@ 3A45UE0S;
/* Si se %a a su#erar la dimension de la ta"la de,inida*/
>
#rint,:ABnBnSe ha so"re#asado el limite de UE0S-?AS.BnA;9
return E009
C
##@D#ersona7inicio89
,(ets:cad= 3A45LE?= ,#;9
i, :cad728@@JBnJ;
>
#rint,:ABnBn?o #uede deSar lineas en "lanco.A;9
return E009
C
sscan,:cad= AMs Ms Ms MsA= nom"re= a#ellido= ni,= edad;9
i,:&ontrolErrores:nom"re= a#ellido= ni,= edad; @@ E00;
>
#rint,:ABnZa ocurrido un error al leer los datos.BnA;9
return E009
C
/* 0eser%amos memoria y asi(namos los %alores */
##1+nom"re @ :char *; malloc::strlen:nom"re; I /; * sieo,:char;;9
strc#y:##1+nom"re= nom"re;9
##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * sieo,:char;;9
strc#y:##1+a#ellido= a#ellido;9
strc#y:##1+ni,= ni,;9
i, :L,eo,:,#;; /* Si no hemos lle(ado al ,inal del archi%o... */
2*
VctorSanchez2 http://www.victorsanchez2.com
>
##1+edad @ UasaAEntero:edad= 2= ##;9
i, :##1+edad @@ E00;
return E009
3ostrar6atos:##= inicio;9
inicioII9 /* Uasamos a la si(uiente estructura de ti#o UE0S-?A */
:*#Fo#;II9
C
C
i, :Li"erarArray:##= #Fo#; @@ E00;
return E009
,close:,#;9
return -.9
C
/*****************************************************************************
* Euncion: status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,=
* char *#Edad;
*
* I?: ?om"re= A#ellido= ?IE y Edad como cadena de caracteres
* -GF: -. si las cadenas no contienen ,allos= E00 si e<iste al(un error
* 3A.E: &heHuea Hue las cadenas no conten(an datos no #ermitidos.
*
*****************************************************************************/
status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad;
>
)de,ine L-?X5?IE R
/*Gnico %alor #ermitido #ara el numero de di(itos del ?IE */
)de,ine 3A45L-?X56AF-S /7 /* Lon(itud ma<ima del nom"re y del a#ellido */
int i9
i, :strlen:#?om"re; + 3A45L-?X56AF-S;
>
#rint,:ABnBnLa lon(itud del nom"re Hue se esta"a leyendo es demasidado
(rande.A;9
return E009
C
i, :strlen:#A#ellido; + 3A45L-?X56AF-S;
>
#rint,:ABnBnLa lon(itud del a#ellido Hue se esta"a leyendo es demasidado
(rande.A;9
return E009
C
i, :strlen:#?i,; L@ L-?X5?IE;
>
#rint,:ABnBnEl ?IE de"e tener R di(itos.A;9
return E009
C
i,:Es6i(ito:#?i,= :int; strlen:#?i,;; @@ E00;
>
#rint,:ABnBnError al leer el ?IE de Ms Ms.A= #?om"re= #A#ellido;9
return E009
C
i, :*#Edad @@ J2J;
>
#rint,:ABnBnSe ha leido una edad incorrecta. ?o #uede tener 2 aWos.A;9
return E009
C
,or :i@29 i*strlen:#Edad;9 iII;
>
i, :Lisdi(it:#Edad7i8;;
22
VctorSanchez2 http://www.victorsanchez2.com
>
#rint,:ABnBnSe realio una o#eracion no %alida mientras se leia el
archi%o.BnA;9
return E009
C
C
return -.9
C
/*****************************************************************************
* Euncion: status &adenaVacia:char *caracter;
*
* I?: Gna cadena de caracteres
* -GF: -. si la cadena esta %acia= E00 si la cadena contiene al(un elemento
* 3A.E: &om#rue"a si la cadena esta %acia
*
*****************************************************************************/
status &adenaVacia:char *caracter;
>
i, :caracter728 @@ 2;
>
#rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosA;9
return -.9
C
return E009
C
/*********************************************************
* Euncion: status Es6i(ito:char *caracter= int lon(itud;
*
* I?: Se le da una serie de caracteres #ara Hue com#rue"e si es un numero
* -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si es correcto
* 3A.E: &om#rue"a la inte(ridad de los datos
*
**********************************************************/
status Es6i(ito:char *caracter= int lon(itud;
>
int i@29
i, :&adenaVacia:caracter; @@ -.;
return E009
/* &om#ro"amos Hue todos los elementos sean di(itos */
,or :i @ i9 i * lon(itud9 iII;
i, :caracter7i8 * J2J PP caracter7i8 + JOJ;
>
#rint,:ABnBnIntroduca unicamente di(itos= #or ,a%or.A;9
return E009
C
return -.9
C
/*****************************************************************************
* Euncion: int UasaAEntero:char *caracter= int ma<imo;
*
* I?: &adena de caracteres Hue tenemos Hue #asar a entero y ma<imo de
* di(itos #ermitidos.
* -GF: El numero #asado a entero o E00 si hay al(un ,allo.
* 3A.E: Uasa una cadena de caracteres a entero.
*
*****************************************************************************/
int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;
>
int num@29
2-
VctorSanchez2 http://www.victorsanchez2.com
int i9
i, :strlen:caracter; + ma<imo;
>
#rint,:ABnBnMs Ms es muy mayorLLLA= #6atos1+nom"re= #6atos1+a#ellido;9
return E009
C
/* Si solo se ha introducido un caracter */
i, :strlen:caracter; @@ /;
return num @ caracter728 1 J2J9 /*6e%ol%emos el di(ito */
/* Si hay mas de un caracter */
,or :i @ 29 i L@ :int; strlen:caracter;9 iII;
num @ :num * /2; I :caracter7i8 1 J2J;9
return num9
C
/*****************************************************************************
* Euncion: %oid 3ostrar6atos:UE0S-?A *##= int linea;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A y la linea en Hue de"emos
* ir escri"iendo.
* -GF:
* 3A.E: 3uestra #or #antalla los datos de la estructura.
*
*****************************************************************************/
%oid 3ostrar6atos:UE0S-?A *##= int linea;
>
(oto<y: 3=lineaI/;9 #rint,:AGSGA0I-: MsA= ##1+nom"re;9
(oto<y:32=lineaI/;9 #rint,:AMsA= ##1+a#ellido;9
(oto<y:52=lineaI/;9 #rint,:A?IE: MsA= ##1+ni,;9
(oto<y:72=lineaI/;9 #rint,:AE6A6: MdA= ##1+edad;9
C
/*****************************************************************************
* Euncion: int Li"erarUersona:UE0S-?A *##;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A.
* -GF: -. si se li"eran correctamente= E00 si hay al(un error.
* 3A.E: Li"era la memoria Hue reser%amos anteriormente.
*
*****************************************************************************/
status Li"erarUersona:UE0S-?A *##;
>
i,:L##1+nom"re PP L##1+a#ellido; /* Si al(uno es un #untero nulo */
>
#rint,:ABnBnError al li"erar el #unteroA;9
return E009
C
else
>
,ree:##1+nom"re;9
,ree:##1+a#ellido;9
C
return -.9
C
/*****************************************************************************
* Euncion: int Li"erarArray:UE0S-?A *##= int *#Fo#;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A y el numero de elementos.
* -GF: -.
* 3A.E: Li"era cada #arte de la estructura Hue le #asamos.
2@
VctorSanchez2 http://www.victorsanchez2.com
*
*****************************************************************************/
status Li"erarArray:UE0S-?A *##= int *#Fo#;
>
int i9
,or :i @ 29 i * *#Fo#9 iII;
>
Li"erarUersona:11##;9
C
return -.9
C
!.
:o"i6icar la "e6inici#n "el tipo )EHS?N0 "e 6orma tal %ue se aOa"a un campo %ue sea
un puntero a otra persona7 %ue llamaremos el Pami$oP. ?bservar %ue para eso "ebe
utilizarse la sentencia (tr)ct y no el tipo "e6ini"o. :o"i6icar el pro$rama "el ejercicio 2
para %ue "e manera aleatoria se asi$ne a ca"a una "e las personas "e la tabla un amigo7
y %ue este se imprima tambi8n por pantalla ,es "ecir al imprimir los "atos "e una
persona se imprime tambi8n el nombre y apelli"o "e su amigo/. 4na vez termina"o este
pro$rama mo"i6icarlo para %ue antes "e imprimir los "atos por pantalla libere la
memoria "e la se$un"a mita" "e las personas ,por ejemplo7 "el A al I si 6uesen *+ en
total/ e imprima solo los "atos "e la primera mita" ,en el ejemplo sera "el + al @/.
E5plicar lo %ue ocurre.
'unciones a utilizar:
rand: para $eneraci#n "e n;meros aleatorios.
/*****************************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
* 3aQe: Uro(rama Hue asi(na de manera aleatoria un ami(o a cada una de las
* #ersonas de la ta"la y lo im#rime #or #antalla. Gna %e reliado
* li"era la memoria de la se(unda mitad de las #ersonas e im#rime
* unicamente los datos de la #rimera mitad.
*
*****************************************************************************/
)include *stdio.h+
)include *stdli".h+
)include *strin(.h+
)include *cty#e.h+
)include *conio.h+
)include *time.h+
)de,ine 3A45L-?X5?IE /2
)de,ine 3A45LE? 25Y
)de,ine 3A45UE0S 222
struct #erson
>
char *nom"re9
char *a#ellido9
char ni,73A45L-?X5?IE89
int edad9
struct #erson *ami(o9
C9
ty#ede, struct #erson UE0S-?A9
UE0S-?A #ersona73A45UE0S8= *#Uersona9
int to#9
ty#ede, enum > -. @ /= E00 @ 2C status9
2A
VctorSanchez2 http://www.victorsanchez2.com
%oid ayuda:%oid;9
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9
status Asi(narAmi(os:UE0S-?A *##= int *to#;9
status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char
*#Edad;9
status &adenaVacia:char *caracter;9
status Es6i(ito:char *caracter= int lon(itud;9
int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;9
%oid 3ostrarUersona:UE0S-?A *##= int *linea;9
%oid 3ostrarAmi(o:UE0S-?A *##= int *linea;9
status AsesinarUersonas:UE0S-?A *##= int *to#;9
status Li"erarUersona:UE0S-?A *;9
int main:int ar(c= char *ar(%78;
>
int to# @ 29 /* ?umero de #ersonas en el archi%o */
int line/ @ /9
int line2 @ 29
int i9
clrscr:;9
#Uersona @ #ersona9
/* Se de"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+ */
i, :ar(c L@ 2;
>
ayuda:;9 /* 3ensaSe de ayuda #ara el usuario */
return E009
C
i, :LeerArchi%o:Dar(%7/8= #Uersona= Dto#; @@ E00;
>
#rint,:ABn0e%ise el ,ichero= se #roduSo un ,allo al intentar leerle.BnA;9
return E009
C
i, :Asi(narAmi(os:#ersona= Dto#; L@ -.;
return E009
#Uersona @ D#ersona7to#/289
i, :AsesinarUersonas:#Uersona= Dto#; @@ E00;
>
#rint,:ABnError al asesinar a las #ersonas.A;9
return E009
C
#rint,:ABnBnLa mitad de las #ersonas han sido li"eradas= #ulse #ara
continuar.BnA;9
(etch:;9
clrscr:;9
,or :i@29 i*to#9 iII;
>
#Uersona @ D#ersona7i89
3ostrarUersona:#Uersona= Dline/;9
3ostrarAmi(o:#Uersona= Dline2;9
C
return -.9
C
/*****************************************************************************
* Euncion: %oid ayuda:;
*
* I?:
* -GF: 3ensaSe de ayuda #ara el usuario.
2B
VctorSanchez2 http://www.victorsanchez2.com
* 3A.E: 3uestra ayuda #ara Hue se introducna los datos correctamente.
*
*****************************************************************************/
%oid ayuda:;
>
#rint,:AGso: *nom"re del eSecuta"le+ *nom"re del archi%o de te<to+BnA;9
C
/*****************************************************************************
* Euncion: int LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;
*
* I?: ?om"re del archi%o= #untero a una estructura de ti#o UE0S-?A y numero
* de #ersonas Hue hay.
* -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo.
* 3A.E: Lee un archi%o introducido #or el usuario y (uarda los datos en una
* estructura de ti#o UE0S-?A.
*
*****************************************************************************/
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;
>
EILE *,#9
int inicio@29 /* Uosicion en el array de estructuras */
int linea @ /9 /* ?os %a a ser%ir #ara mo%ernos #or la #antalla */
char cad73A45LE?89
char nom"re73A45LE?89
char a#ellido73A45LE?89
char ni,73A45LE?89
char edad73A45LE?89
i, :L:,# @ ,o#en:archi%o728= ArA;;;
>
#rint,:ABnError al intentar a"rir el archi%oBnA;9
return E009
C
$hile :L,eo,:,#;;
>
i, :*#Fo# @@ 3A45UE0S;
/* Si se %a a su#erar la dimension de la ta"la de,inida*/
>
#rint,:ABnBnSe so"re#aso el limite de UE0S-?AS.BnA;9
return E009
C
##@D#ersona7inicio89
,(ets:cad= 3A45LE?= ,#;9
i, :cad728@@JBnJ;
>
#rint,:ABnBn?o #uede deSar lineas en "lanco.A;9
return E009
C
sscan,:cad= AMs Ms Ms MsA= nom"re= a#ellido= ni,= edad;9
i,:&ontrolErrores:nom"re= a#ellido= ni,= edad; @@ E00;
>
#rint,:ABnZa ocurrido un error al leer los datos.BnA;9
return E009
C
/* 0eser%amos memoria y asi(namos los %alores */
##1+nom"re @ :char *; malloc::strlen:nom"re; I /; * sieo,:char;;9
strc#y:##1+nom"re= nom"re;9
##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * sieo,:char;;9
strc#y:##1+a#ellido= a#ellido;9
strc#y:##1+ni,= ni,;9
2C
VctorSanchez2 http://www.victorsanchez2.com
i, :L,eo,:,#;; /* Si no hemos lle(ado al ,inal del archi%o... */
>
##1+edad @ UasaAEntero:edad= 2= ##;9
i, :##1+edad @@ E00;
return E009
3ostrarUersona:##= Dlinea;9
/* Uasaremos a la si(uiente estructura de ti#o UE0S-?A */
inicioII9
:*#Fo#;II9
C
C
,close:,#;9
return -.9
C
/*****************************************************************************
* Euncion: status Asi(narAmi(os:UE0S-?A *##= int *to#;
*
* I?: Uuntero a una estructura y el numero de #ersonas.
* -GF: -.
* 3A.E: Asi(na una estructura llamada Aami(oA a cada #ersona.
*
*****************************************************************************/
status Asi(narAmi(os:UE0S-?A *##= int *to#;
>
int i9
int aleat9 /* ?umero aleatorio */
int linea @ 29
srand::unsi(ned int; time::time5t *;?GLL;;9
,or :i @ 29 i L@ *to#9 iII;
>
aleat @ rand:; M :*to#;9
##@D#ersona7i89
i, :i L@ aleat; /* Gna #ersona no #uede ser su #ro#io ami(o*/
>
##1+ami(o @ D#ersona7aleat89
3ostrarAmi(o:##= Dlinea;9
C
else
i119
C
return -.9
C
/*****************************************************************************
* Euncion: status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,=
* char *#Edad;
*
* I?: ?om"re= a#ellido= ?IE y edad de la #ersona Hue hemos leido.
* -GF: -. si los datos no contienen ,allos= E00 si se han encontrado
* errores.
* 3A.E: &heHuea Hue los datos leidos no conten(an errores.
*
*****************************************************************************/
status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad;
>
)de,ine L-?X5?IE R
/* Gnico %alor #ermitido #ara el numero de di(itos del ?IE */
)de,ine 3A45L-?X56AF-S /7 /* Lon(itud ma<ima del nom"re y del a#ellido */
int i9
i, :strlen:#?om"re; + 3A45L-?X56AF-S;
>
2.
VctorSanchez2 http://www.victorsanchez2.com
#rint,:ABnBnLa lon(itud del nom"re Hue se esta"a leyendo es demasidado
(rande.A;9
return E009
C
i, :strlen:#A#ellido; + 3A45L-?X56AF-S;
>
#rint,:ABnBnLa lon(itud del a#ellido Hue se esta"a leyendo es demasidado
(rande.A;9
return E009
C
i, :strlen:#?i,; L@ L-?X5?IE;
>
#rint,:ABnBnEl ?IE de"e tener R di(itos.A;9
return E009
C
i,:Es6i(ito:#?i,= :int; strlen:#?i,;; @@ E00;
>
#rint,:ABnBnError al leer el ?IE de Ms Ms.A= #?om"re= #A#ellido;9
return E009
C
i, :*#Edad @@ J2J;
>
#rint,:ABnBnSe ha leido una edad incorrecta. ?o #uede tener 2 aWos.A;9
return E009
C
,or :i@29 i*strlen:#Edad;9 iII;
>
i, :Lisdi(it:#Edad7i8;;
>
#rint,:ABnBnSe realio una o#eracion no %alida mientras se leia el
archi%o.BnA;9
return E009
C
C
return -.9
C
/*****************************************************************************
* Euncion: int &adenaVacia:char *caracter;
*
* I?: Gna cadena de caracteres.
* -GF: -. si la cadena esta %acia= E00 si la cadena contiene al(un elemento.
* 3A.E: &heHuea si la cadena introducida esta %acia.
*
*****************************************************************************/
status &adenaVacia:char *caracter;
>
i, :caracter728 @@ 2;
>
#rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosA;9
return -.9
C
return E009
C
/*********************************************************
* Euncion: status Es6i(ito:char *caracter= int lon(itud;
*
* I?: Se le da una serie de caracteres #ara Hue se com#rue"e si es un
* numero.
* -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si es correcto.
2I
VctorSanchez2 http://www.victorsanchez2.com
* 3A.E: &om#rue"a la inte(ridad de los datos.
*
**********************************************************/
status Es6i(ito:char *caracter= int lon(itud;
>
int i@29
i, :&adenaVacia:caracter; @@ -.;
return E009
/* &om#ro"amos Hue todos los elementos sean di(itos */
,or :i @ i9 i * lon(itud9 iII;
i, :caracter7i8 * J2J PP caracter7i8 + JOJ;
>
#rint,:ABnBnIntroduca unicamente di(itos= #or ,a%or.A;9
return E009
C
return -.9
C
/*****************************************************************************
* Euncion: int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;
*
* I?: Gna cadena de caracteres= el ma<imo de di(itos #ermitidos y un #untero
* a una estructura de ti#o UE0S-?A.
* -GF: El numero con%ertido a entero o E00 si hay al(un ,allo.
* 3A.E: Uasa una cadena de caracteres a entero.
*
*****************************************************************************/
int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;
>
int num@29
int i9
i, :strlen:caracter; + ma<imo;
>
#rint,:ABnBnMs Ms es muy mayorLLLA= #6atos1+nom"re= #6atos1+a#ellido;9
return E009
C
/* Si solo se ha introducido un caracter */
i, :strlen:caracter; @@ /;
return num @ caracter728 1 J2J9 /*6e%ol%emos el di(ito */
/* Si hay mas de un caracter */
,or :i @ 29 i L@ :int; strlen:caracter;9 iII;
num @ :num * /2; I :caracter7i8 1 J2J;9
return num9
C
/*****************************************************************************
* Euncion: %oid 3ostrar6atos:UE0S-?A *##= int *linea;
*
* I?: Gn #untero a una estructura y la linea donde escri"iremos en #antalla.
* -GF:
* 3A.E: 3uestra #or #antalla los datos de la estructura.
*
*****************************************************************************/
%oid 3ostrarUersona:UE0S-?A *##= int *linea;
>
(oto<y: 3= *linea;9 #rint,:AGSGA0I-: MsA= ##1+nom"re;9
(oto<y:32= *linea;9 #rint,:AMsA= ##1+a#ellido;9
(oto<y:52= *linea;9 #rint,:A?IE: MsA= ##1+ni,;9
(oto<y:72= *linea;9 #rint,:AE6A6: MdA= ##1+edad;9
-+
VctorSanchez2 http://www.victorsanchez2.com
*linea I@ 29
C
/*****************************************************************************
* Euncion: %oid 3ostrarAmi(o:UE0S-?A *##= int *linea;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A y la linea en la Hue %amos
* a escri"ir en la #antalla.
* -GF:
* 3A.E: 3uestra #or #antalla los datos del ami(o.
*
*****************************************************************************/
%oid 3ostrarAmi(o:UE0S-?A *##= int *linea;
>
(oto<y: 3= *linea;9 #rint,:AA3IX-: MsA= ##1+ami(o1+nom"re;9
(oto<y:32= *linea;9 #rint,:AMsA= ##1+ami(o1+a#ellido;9
*linea I@ 29
C
/*****************************************************************************
* Euncion: int Li"erarUersona:UE0S-?A *##;
*
* I?: Uuntero a la estructura.
* -GF: -. si todo es correcto= E00 si ha ocurrido al(un error.
* 3A.E: Li"era el nom"re y a#ellido de la estructura introducida.
*
*****************************************************************************/
status Li"erarUersona:UE0S-?A *##;
>
i,:L##1+nom"re PP L##1+a#ellido; /* Si al(uno es un #untero nulo */
>
#rint,:ABnBnError al li"erar el #unteroA;9
return E009
C
else
>
,ree:##1+nom"re;9
,ree:##1+a#ellido;9
C
return -.9
C
/*****************************************************************************
* Euncion: status AsesinarUersonas:UE0S-?A *##= int *to#;
*
* I?: Uuntero a una estructura y el numero de #ersonas.
* -GF: -.
* 3A.E: Li"era las #ersonas Hue estan desde la mitad hasta el ,inal.
*
*****************************************************************************/
status AsesinarUersonas:UE0S-?A *##= int *to#;
>
int i9
,or :i @ :*to#/2;9 i * *to#9 iII;
Li"erarUersona:##II;9
*to#@::int;*to#;/29
return -.9
C
'.
-*
VctorSanchez2 http://www.victorsanchez2.com
:o"i6icar el pro$rama "el ejercicio - para %ue una vez %ue ha le"o to"os los "atos7
bus%ue me"iante un bucle si hay "os personas %ue ten$an la misma e"a". Hepetir lo
mismo para buscar si hay "os personas con el mismo nombre7 apelli"o o ni6. Hepetir lo
mismo para buscar si hay "os personas %ue tienen el mismo amigo.
'unciones a utilizar:
strcmp: para comparar "os ca"enas "e caracteres.
/*****************************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
* 3aQe: Uro(rama Hue asi(na de manera aleatoria un ami(o a cada una de las
* #ersonas de la ta"la y lo im#rime #or #antalla. Gna %e reliado
* esto li"era la memoria de la se(unda mitad de las #ersonas e im#rime
* unicamente los datos de la #rimera mitad.
*
*****************************************************************************/
)include *stdio.h+
)include *stdli".h+
)include *strin(.h+
)include *cty#e.h+
)include *conio.h+
)include *time.h+
)de,ine 3A45L-?X5?IE /2
)de,ine 3A45LE? 25Y
)de,ine 3A45UE0S 222
struct #erson
>
char *nom"re9
char *a#ellido9
char ni,73A45L-?X5?IE89
int edad9
struct #erson *ami(o9
C9
ty#ede, struct #erson UE0S-?A9
UE0S-?A #ersona73A45UE0S8= *#Uersona9
int to#9
ty#ede, enum > -. @ /= E00 @ 2C status9
%oid ayuda:%oid;9
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;9
status Asi(narAmi(os:UE0S-?A *##= int *to#;9
status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char
*#Edad;9
status &adenaVacia:char *caracter;9
status Es6i(ito:char *caracter= int lon(itud;9
int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;9
%oid 3ostrarUersona:UE0S-?A *##= int *linea;9
%oid 3ostrarAmi(o:UE0S-?A *##= int *linea;9
status Li"erarArray:UE0S-?A *##= int to#;9
status Li"erarUersona:UE0S-?A *;9
status &om#ararUersonas:UE0S-?A #73A45UE0S8= int to#;9
int main:int ar(c= char *ar(%78;
>
int to# @ 29 /* ?umero de #ersonas en el archi%o */
int line/ @ /9
int line2 @ 29
int i9
clrscr:;9
-2
VctorSanchez2 http://www.victorsanchez2.com
#Uersona @ #ersona9
/* Se de"e introducir: *nom"re del eSecuta"le+ *nom"re del archi%o+ */
i, :ar(c L@ 2;
>
ayuda:;9 /* 3ensaSe de ayuda #ara el usuario */
return E009
C
i, :LLeerArchi%o:Dar(%7/8= #Uersona= Dto#;;
>
#rint,:ABn0e%ise el ,ichero= se #roduSo un ,allo al intentar leerle.BnA;9
return E009
C
i, :Asi(narAmi(os:#ersona= Dto#; L@ -.;
return E009
,or :i@29 i*to#9 iII;
>
#Uersona @ D#ersona7i89
3ostrarUersona:#Uersona= Dline/;9
3ostrarAmi(o:#Uersona= Dline2;9
C
i, :L&om#ararUersonas:#ersona= to#;;
return E009
#Uersona @ D#ersona7to#89
i, :Li"erarArray:#Uersona= to#; L@ -.;
return E009
return -.9
C
/*****************************************************************************
* Euncion: %oid ayuda:;
*
* I?:
* -GF: 3ensaSe de ayuda #ara el usuario.
* 3A.E: 3uestra ayuda al usuario #ara Hue introduca los datos
* correctamente.
*
*****************************************************************************/
%oid ayuda:;
>
#rint,:AGso: *nom"re del eSecuta"le+ *nom"re del archi%o de te<to+BnA;9
C
/*****************************************************************************
* Euncion: int LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;
*
* I?: ?om"re del archi%o= #untero a una estructura de ti#o UE0S-?A y numero
* de #ersonas Hue hay.
* -GF: -. si se ha leido correctamente= E00 si ha ha"ido al(un ,allo.
* 3A.E: Lee un archi%o introducido #or el usuario y (uarda los datos en una
* estructura de ti#o UE0S-?A.
*
*****************************************************************************/
status LeerArchi%o:char *archi%o78= UE0S-?A *##= int *#Fo#;
>
EILE *,#9
int inicio@29 /* Uosicion en el array de estructuras */
int linea @ /9 /* ?os %a a ser%ir #ara mo%ernos #or la #antalla */
char cad73A45LE?89
char nom"re73A45LE?89
--
VctorSanchez2 http://www.victorsanchez2.com
char a#ellido73A45LE?89
char ni,73A45LE?89
char edad73A45LE?89
i, :L:,# @ ,o#en:archi%o728= ArA;;;
>
#rint,:ABnError al intentar a"rir el archi%oBnA;9
return E009
C
$hile :L,eo,:,#;;
>
i, :*#Fo# @@ 3A45UE0S;
/* Si se %a a su#erar la dimension de la ta"la de,inida*/
>
#rint,:ABnBnSe so"re#aso el limite de UE0S-?AS.BnA;9
return E009
C
##@D#ersona7inicio89
,(ets:cad= 3A45LE?= ,#;9
i, :cad728@@JBnJ;
>
#rint,:ABnBn?o #uede deSar lineas en "lanco.A;9
return E009
C
sscan,:cad= AMs Ms Ms MsA= nom"re= a#ellido= ni,= edad;9
i,:L&ontrolErrores:nom"re= a#ellido= ni,= edad;;
>
#rint,:ABnZa ocurrido un error al leer los datos.BnA;9
return E009
C
/* 0eser%amos memoria y asi(namos los %alores */
##1+nom"re @ :char *; malloc::strlen:nom"re; I /; * sieo,:char;;9
strc#y:##1+nom"re= nom"re;9
##1+a#ellido @ :char *; malloc::strlen:a#ellido; I /; * sieo,:char;;9
strc#y:##1+a#ellido= a#ellido;9
strc#y:##1+ni,= ni,;9
i, :L,eo,:,#;; /* Si no hemos lle(ado al ,inal del archi%o... */
>
##1+edad @ UasaAEntero:edad= 2= ##;9
i, :##1+edad @@ E00;
return E009
3ostrarUersona:##= Dlinea;9
/* Uasaremos a la si(uiente estructura de ti#o UE0S-?A */
inicioII9
:*#Fo#;II9
C
C
,close:,#;9
return -.9
C
/*****************************************************************************
* Euncion: status Asi(narAmi(os:UE0S-?A *##= int *to#;
*
* I?: Uuntero a una estructura y el numero de #ersonas.
* -GF: -.
* 3A.E: Asi(na una estructura llamada Aami(oA a cada #ersona.
*
*****************************************************************************/
status Asi(narAmi(os:UE0S-?A *##= int *to#;
-@
VctorSanchez2 http://www.victorsanchez2.com
>
int i9
int aleat9 /* ?umero aleatorio */
int linea @ 29
srand::unsi(ned int; time::time5t *;?GLL;;9
,or :i @ 29 i L@ *to#9 iII;
>
aleat @ rand:; M :*to#;9
##@D#ersona7i89
i, :i L@ aleat; /* Gna #ersona no #uede ser su #ro#io ami(o*/
>
##1+ami(o @ D#ersona7aleat89
3ostrarAmi(o:##= Dlinea;9
C
else
i119
C
return -.9
C
/*****************************************************************************
* Euncion: status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,=
char *#Edad;
*
* I?: ?om"re= a#ellido= ?IE y edad de la #ersona Hue hemos leido.
* -GF: -. si los datos no contienen ,allos= E00 si se han encontrado
errores.
* 3A.E: &heHuea Hue los datos leidos no conten(an errores.
*
*****************************************************************************/
status &ontrolErrores:char *#?om"re= char *#A#ellido= char *#?i,= char *#Edad;
>
)de,ine L-?X5?IE R /* Gnico %alor #ermitido #ara el numero de
di(itos del ?IE */
)de,ine 3A45L-?X56AF-S /7 /* Lon(itud ma<ima del nom"re y del a#ellido */
int i9
i, :strlen:#?om"re; + 3A45L-?X56AF-S;
>
#rint,:ABnBnLa lon(itud del nom"re Hue se esta"a leyendo es demasidado
(rande.A;9
return E009
C
i, :strlen:#A#ellido; + 3A45L-?X56AF-S;
>
#rint,:ABnBnLa lon(itud del a#ellido Hue se esta"a leyendo es demasidado
(rande.A;9
return E009
C
i, :strlen:#?i,; L@ L-?X5?IE;
>
#rint,:ABnBnEl ?IE de"e tener R di(itos.A;9
return E009
C
i,:Es6i(ito:#?i,= :int; strlen:#?i,;; @@ E00;
>
#rint,:ABnBnError al leer el ?IE de Ms Ms.A= #?om"re= #A#ellido;9
return E009
C
i, :*#Edad @@ J2J;
>
-A
VctorSanchez2 http://www.victorsanchez2.com
#rint,:ABnBnSe ha leido una edad incorrecta. ?o #uede tener 2 aWos.A;9
return E009
C
,or :i@29 i*strlen:#Edad;9 iII;
>
i, :Lisdi(it:#Edad7i8;;
>
#rint,:ABnBnSe realio una o#eracion no %alida mientras se leia el
archi%o.BnA;9
return E009
C
C
return -.9
C
/*****************************************************************************
* Euncion: int &adenaVacia:char *caracter;
*
* I?: Gna cadena de caracteres.
* -GF: -. si la cadena esta %acia= E00 si la cadena contiene al(un elemento.
* 3A.E: &heHuea si la cadena introducida esta %acia.
*
*****************************************************************************/
status &adenaVacia:char *caracter;
>
i, :caracter728 @@ 2;
>
#rint,:ABn?o #uede deSarlo en "lanco= de"e introducir los datosA;9
return -.9
C
return E009
C
/*********************************************************
* Euncion: status Es6i(ito:char *caracter= int lon(itud;
*
* I?: Se le da una serie de caracteres #ara Hue se com#rue"e si es un
* numero.
* -GF: ?os de%ol%era E00 si se #roduce al(un ,allo= -. si es correcto.
* 3A.E: &om#rue"a la inte(ridad de los datos.
*
**********************************************************/
status Es6i(ito:char *caracter= int lon(itud;
>
int i@29
i, :&adenaVacia:caracter; @@ -.;
return E009
/* &om#ro"amos Hue todos los elementos sean di(itos */
,or :i @ i9 i * lon(itud9 iII;
i, :caracter7i8 * J2J PP caracter7i8 + JOJ;
>
#rint,:ABnBnIntroduca unicamente di(itos= #or ,a%or.A;9
return E009
C
return -.9
C
/*****************************************************************************
* Euncion: int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;
*
* I?: Gna cadena de caracteres= el ma<imo de di(itos #ermitidos y un #untero
* a una estructura de ti#o UE0S-?A.
-B
VctorSanchez2 http://www.victorsanchez2.com
* -GF: El numero con%ertido a entero o E00 si hay al(un ,allo.
* 3A.E: Uasa una cadena de caracteres a entero.
*
*****************************************************************************/
int UasaAEntero:char *caracter= int ma<imo= UE0S-?A *#6atos;
>
int num@29
int i9
i, :strlen:caracter; + ma<imo;
>
#rint,:ABnBnMs Ms es muy mayorLLLA= #6atos1+nom"re= #6atos1+a#ellido;9
return E009
C
/* Si solo se ha introducido un caracter */
i, :strlen:caracter; @@ /;
return num @ caracter728 1 J2J9 /*6e%ol%emos el di(ito */
/* Si hay mas de un caracter */
,or :i @ 29 i L@ :int; strlen:caracter;9 iII;
num @ :num * /2; I :caracter7i8 1 J2J;9
return num9
C
/*****************************************************************************
* Euncion: %oid 3ostrar6atos:UE0S-?A *##= int *linea;
*
* I?: Gn #untero a una estructura y la linea donde escri"iremos en #antalla.
* -GF:
* 3A.E: 3uestra #or #antalla los datos de la estructura.
*
*****************************************************************************/
%oid 3ostrarUersona:UE0S-?A *##= int *linea;
>
(oto<y: 3= *linea;9 #rint,:AGSGA0I-: MsA= ##1+nom"re;9
(oto<y:32= *linea;9 #rint,:AMsA= ##1+a#ellido;9
(oto<y:52= *linea;9 #rint,:A?IE: MsA= ##1+ni,;9
(oto<y:72= *linea;9 #rint,:AE6A6: MdA= ##1+edad;9
*linea I@ 29
C
/*****************************************************************************
* Euncion: %oid 3ostrarAmi(o:UE0S-?A *##= int *linea;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A y la linea en la Hue %amos
* a escri"ir en la #antalla.
* -GF:
* 3A.E: 3uestra #or #antalla los datos del ami(o.
*
*****************************************************************************/
%oid 3ostrarAmi(o:UE0S-?A *##= int *linea;
>
(oto<y: 3= *linea;9 #rint,:AA3IX-: MsA= ##1+ami(o1+nom"re;9
(oto<y:32= *linea;9 #rint,:AMsA= ##1+ami(o1+a#ellido;9
*linea I@ 29
C
/*****************************************************************************
* Euncion: int Li"erarUersona:UE0S-?A *##;
*
* I?: Uuntero a la estructura.
* -GF: -. si todo es correcto= E00 si ha ocurrido al(un error.
-C
VctorSanchez2 http://www.victorsanchez2.com
* 3A.E: Li"era el nom"re y a#ellido de la estructura introducida.
*
*****************************************************************************/
status Li"erarUersona:UE0S-?A *##;
>
i,:L##1+nom"re PP L##1+a#ellido; /* Si al(uno es un #untero nulo */
>
#rint,:ABn.A;9
return E009
C
else
>
,ree:##1+nom"re;9
,ree:##1+a#ellido;9
C
return -.9
C
/*****************************************************************************
* Euncion: int Li"erarArray:UE0S-?A *##;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A.
* -GF: -.
* 3A.E: Li"era el array de estructuras.
*
*****************************************************************************/
status Li"erarArray:UE0S-?A *##= int to#;
>
int i9
,or :i @ 29 i * to#9 iII;
>
Li"erarUersona:11##;9
C
return -.9
C
/*****************************************************************************
* Euncion: status &om#ararUersonas:UE0S-?A #73A45UE0S8= int to#;
*
* I?: Estructura con un tamaWo 73A45UE0S8= y el numero de #ersonas
* -GF: -.
* 3A.E: 3uestra #or #antalla las similitudes entre las #ersonas.
*
*****************************************************************************/
status &om#ararUersonas:UE0S-?A #73A45UE0S8= int to#;
>
int i= S9
#rint,:ABnBnVamos a %er las com#araciones. Uulse una tecla.A;9
(etch:;9
clrscr:;9
#rint,:ABnBnB A;9
,or :i@29 i*to#9 iII; >
,or:S@iI/9 S*to#9 SII; >
i, :iL@S; >
i, :#7i8.edad @@ #7S8.edad;
>
#rint,:ABn3isma edad:Md;: MsA= #7i8.edad= #7i8.nom"re;9
#rint,:ABn MsA= #7S8.nom"re;9
C
i, :Lstrcm#:#7i8.nom"re= #7S8.nom"re;;
>
#rint,:ABn3ismo nom"re:Ms;: MsA= #7i8.nom"re= #7i8.a#ellido;9
#rint,:ABn MsA= #7S8.a#ellido;9
-.
VctorSanchez2 http://www.victorsanchez2.com
C
i, :Lstrcm#:#7i8.a#ellido= #7S8.a#ellido;;
>
#rint,:ABn3ismo a#ellido :Ms;: MsA= #7i8.a#ellido= #7i8.nom"re;9
#rint,:ABn MsA= #7S8.nom"re;9
C
i, :Lstrcm#:#7i8.ni,= #7S8.ni,;;
>
#rint,:ABn3ismo ?IE :Ms;: MsA= #7i8.ni,= #7i8.nom"re;9
#rint,:ABn MsA= #7S8.nom"re;9
C
i, :#7i8.ami(o @@ #7S8.ami(o;
>
#rint,:ABn3ismo Ami(o: MsA= #7i8.ami(o1+nom"re;9
#rint,:ABn MsA= #7i8.nom"re;9
#rint,:ABn MsA= #7S8.nom"re;9
C
C
C
C
#rint,:ABnA;9
return -.9
C
PRCTICA !
O*JETI+OS
El objetivo "e esta prctica es implementar el tipo abstracto "e "atos ,J0(/ )>!0 y
realizar un ejercicio "e aplicaci#n "e "icho tipo "e "atos. El ejercicio consistir en
pro$ramar la resoluci#n "e laberintos: "a"o %ue el al$oritmo bsico para resolver un
laberinto consiste en ir proban"o movimientos y volver atrs cuan"o ya no hay sali"a
"esan"an"o el ;ltimo movimiento7 se presta a la utilizaci#n "e una pila ya %ue lo %ue
hay %ue hacer es ir almacenan"o los movimientos %ue se han e6ectua"o e irlos
recuperan"o en or"en inverso7 es "ecir si$uien"o el or"en !>'? ,!ast >n 'irst ?ut/.
!a implementaci#n "el tipo "e "ato ser una implementaci#n $en8rica7 es "ecir no
"epen"iente "el tipo "e elemento %ue se va a $uar"ar en la pila. Se va a utilizar el tipo
"e pila esttica. Esto %uiere "ecir %ue el espacio %ue reserva el "ato para almacenar los
elementos es "e un tamaOo "a"o %ue no se mo"i6ica posteriormente. Notemos %ue esto
no %uiere "ecir %ue "icho espacio no pue"a reservarse "inmicamente ,me"iante
malloc/7 sino %ue es un tamaOo %ue una vez aloca"o no se mo"i6ica ,y la pila "evuelve
error si se intenta rebasar "icho tamaOo/.
Si bien se incluyen en la prctica un par "e ejercicios au5iliares para comprobar la
implementaci#n "el tipo "e "atos )>!07 la cali6icaci#n "e la prctica estar basa"a
principalmente en el ejercicio n;mero @.
EJERCICIOS
1. >mplementar las 6unciones bsicas "el J0( )>!0. (ichas 6unciones estn
"e6ini"as en el archivo ,i#a.h %ue se a"junta7 y son las si$uientes:
ESTADO InicializaPila(PILA *pila): reserva memoria para el array de datos de la
pila, devuelve error si no ha conseguido alocar memoria.
BOOLEANO PilaVacia(PILA pila): indica si la pila est o no vaca.
-I
VctorSanchez2 http://www.victorsanchez2.com
BOOLEANO PilaLlena(PILA pila): indica si la pila est o no llena.
ESTADO Push(PILA *pila, TIPO_INFO_PILA a!"): introduce un elemento en la pila,
devuelve error si no ha sido posible (la pila est llena).
ESTADO P"p(PILA *pila, TIPO_INFO_PILA *a!"): saca un elemento de la pila,
devuelve error si no ha sido posible (la pila est vaca).
#"i Li$e%aPila(PILA *pila): libera la memoria alocada para el array interno de
datos de la pila.
En "icho archivo se "e6inen tanto los tipos "e "atos )>!07 J>)?=>N'?=)>!07
ESJ0(? y 9??!E0N?. El tipo "e "atos J>)?=>N'?=)>!0 se "e6ine inicialmente
como char7 es "ecir los elementos "e la pila en esta primera implementaci#n sern
caracteres.
!a implementaci#n "e las 6unciones "el J0( )>!0 "ebe realizarse en un archivo "e
nombre ,i#a.c.
2. Escribir un pro$rama "e prueba para comprobar el 6uncionamiento a"ecua"o "e
la implementaci#n "el tipo "e "atos )>!0. El pro$rama "ebe recibir como ar$umento
por la lnea "e coman"os una ca"ena "e caracteres e imprimir por pantalla "icha ca"ena
al rev8s. )ara ello "ebe intro"ucir to"os los caracteres en la pila y sacarlos a
continuaci#n ,en or"en inverso/. El c#"i$o 6uente "el pro$rama principal "eber estar
en un archivo "i6erente al "e las 6unciones "el J0( )>!07 "ebien"o $enerarse un
proyecto con el Jurbo para $enerar un ejecutable a partir "e "os archivos. Es
importante tambi8n %ue la utilizaci#n "e la pila se realice a trav8s "e las 6unciones
"e6ini"as en el ejercicio *7 y no a trav8s "e acceso "irecto a los miembros "e la
estructura "e "atos.
3. :o"i6icar el archivo ,i#a.h, "e 6orma %ue el J>)?=>N'?=)>!0 sea ahora un char KN
renombrar el archivo pila*.h. :o"i6icar el pro$rama "el ejercicio 2 para %ue reciba una
serie "e palabras como ar$umentos y las imprima en or"en inverso.
4. )ro$ramaci#n "el al$oritmo "e resoluci#n "e laberintos. )ara ello se co"i6icar
un laberinto como una matriz en la %ue ca"a casilla pue"e estar vaca ,Q Q/ o ocupa"a por
un muro ,Q<Q/N e5iste tambi8n una casilla "e entra"a ,QEQ/ y otra "e sali"a ,QSQ/. !os
laberintos ten"rn siempre 6orma rectan$ular7 y se po"rn escribir en archivos "e te5to7
tenien"o por lo tanto %ue escribirse una 6unci#n para leer el archivo y volcarlo a una
estructura "e "atos correspon"iente. En "icho archivo el 6inal "e una lnea se in"icar
con la letra Q'Q ,la cual no 6orma parte "el laberinto/ para "e este mo"o evitar
con6usiones conespacios enblanco o saltos "e lnea. !a "e6inici#n "e "icha estructura y
"e las 6unciones necesarias se encuentra en el archivo #a-.rint$.h7 y las repro"ucimos a
continuaci#n.

ty#ede, enum > ?I?XG?-= A00I[A= A[A\-= 6E0E&ZA= I]^GIE06A
C 3-VI3IE?F-9
)de,ine LA6-53A4 /22
ty#ede, struct >
@+
VctorSanchez2 http://www.victorsanchez2.com
char ma#a7LA6-53A487LA6-53A489
int ancho9
int alto9
C LA[E0I?F-9 /* de,inici_n del ti#o la"erinto */
ty#ede, struct >
int <9
int y9
C &--06E?A6A9
ESTADO lee_la$e%in!"(cha% *n"&$%e_'iche%", LABE(INTO *la$e%in!",
)OO(DENADA *p"sici"n_en!%aa): Se encar(a de %olcar los datos
desde el ,ichero a la estructura la"erinto. Adem`s= de%uel%e las
coordenadas < e y de la entrada al la"erinto. 6a E00-0 si hay
al(n #ro"lema.
#"i i&p%i&e_la$e%in!"(LABE(INTO *la$e%in!"): Im#rime el
la"erinto #or #antalla.
BOOLEANO es_casilla_pe%&i!ia(LABE(INTO la$e%in!", )OO(DENADA
p"sici"n_ac!ual): dice si #odemos ocu#ar esa casilla del
la"erinto o no9 #odemos ocu#ar las casillas Hue tienen un es#acio
%acVo= JEJ o JSJ.
BOOLEANO es_casilla_salia(LABE(INTO la$e%in!", )OO(DENADA
p"sici"n_ac!ual): dice si esa casilla es la salida : JSJ; o no.
*OVI*IENTO p"li!ica_&"#i&ien!"(*OVI*IENTO ul!i&"_&"#i&ien!"): en
"ase al ltimo mo%imiento Hue se ha realiado= nos dice HuT
mo%imiento de"emos de intentar ahora. Uor eSem#lo: nin(uno1
+arri"a= arri"a1+derecha= derecha1+a"aSo= a"aSo1+iHuierda=
iHuierda1+nin(uno. Esta ,unci_n de"e im#lementarse con un
switch.
*OVI*IENTO &"#i&ien!"_"pues!"(*OVI*IENTO &"#i&ien!"): #ara un
mo%imiento dado= nos dice su o#uesto. IHuierda y derecha son
o#uestos= arri"a y a"aSo son o#uestos. El o#uesto de nin(uno es
nin(uno. Esta ,unci_n se de"e im#lementar con un switch.
)OO(DENADA calcula_nue#a_p"sici"n()OO(DENADA p"sici"n_ac!ual,
*OVI*IENTO si+uien!e_&"#i&ien!"): Esta ,unci_n nos dice Hue
coordenada tendremos si realiamos el mo%imiento es#eci,icado
desde la #osicion actual. Esta ,unci_n se de"e im#lementar con un
switch.
#"i &a%ca_la$e%in!"(LABE(INTO *la$e%in!", )OO(DENADA
p"sici"n_ac!ual): Esta ,unci_n marca el la"erinto= en la #osicion
en la Hue estemos= con un #unto :J . ;.
!a implementaci#n "e estas 6unciones "eber realizarse en un archivo "e nombre
#a-.rint$.c.
0 continuaci#n "ebe pro$ramarse el al$oritmo "e resoluci#n "e laberinto7 si$uien"o el
pseu"oGc#"i$o %ue se "escribe a continuaci#n. )seu"oGc#"i$o como re6erencia para
escribir el c#"i$o correspon"iente:
@*
VctorSanchez2 http://www.victorsanchez2.com
inicialiar la #ila de mo%imientos
ultimo5mo%imiento5e<#lorado @ ?I?XG?-
salida5im#osi"le @ ?-
salida5encontrada @ es5casilla5salida:la"erinto= #osicion5actual;9
mientras Hue no se haya encontrado la salida ni salia_i&p"si$le sea SI=
>
marcar la #osici_n actual en el la"erinto
hallar si(uiente mo%imiento se(n nuestra #olVtica y meterlo en la
%aria"le si+uien!e_"pci"n_&"#i&ien!"
si la %aria"le si+uien!e_"pci"n_&"#i&ien!" no es ?I?XG?-=
>
ultimo5mo%imiento5e<#lorado @ si(uiente5o#cion5mo%imiento
calcular nue%a #osicion y meterla en la %aria"le
si+uien!e_p"sici"n
si la casilla corres#ondiente a la nue%a #osicion es una casilla
#ermitida
>
meter el mo%imiento Hue hemos hecho en la #ila
ultimo5mo%imiento5e<#lorado @ ?I?XG?-
#osicion5actual @ si(uiente5#osicion
C
C
en caso contrario
>
sacar un dato de la #ila de mo%imientos :este dato contiene el
mo%imiento Hue me ha lle%ado a la actual #osicion; y meterlo en
ultimo5mo%imiento5e<#lorado
si no he #odido sacar nada de la #ila #orHue no ha"Va nada
salida5im#osi"le @ SI
en caso contrario
calcular la nue%a #osici_n deshaciendo el mo%imiento Hue me
ha lle%ado a la casilla actual :tendrT Hue mo%erme en la direcci_n
o#uesta;=asi(n`ndoselo a la %aria"le p"sici"n_ac!ual
@2
VctorSanchez2 http://www.victorsanchez2.com
C
cheHuear si nos encontramos en la casilla de salida= en ese caso hacer
SI la %aria"le salia_enc"n!%aa
C :,in del mientras;
0 mo"o "e resumen7 el pro$rama realiza"o "eber:
Hecibir el nombre "el archivo con el laberinto "es"e la lnea "e coman"os7
comproban"o por lo tanto %ue recibe los ar$umentos a"ecua"os.
Volcar los "atos "el laberinto a la matriz PlaberintoP ,6unci#n lee=laberinto/.
omprobar la e5istencia "el archivo7 "evolvien"o error en caso contrario.
ontrolar otros errores como el intento "e lectura "e laberintos "emasia"o
$ran"es7 laberintos en los %ue las lneas tienen "i6erente tamaOo7 laberintos en
los %ue no haya sali"a7 o no entra"a7 laberintos en los %ue haya ms "e una
entra"a7 etc.
Healizar una b;s%ue"a "e un posible camino "es"e la entra"a ,E/ a la sali"a ,S/
"el laberinto. Se "ebern "e controlar errores como la e5istencia "e laberintos en
los %ue no hay nin$;n camino posible "es"e la entra"a a la sali"a7 etc.
(ar como sali"a la secuencia "e movimientos necesaria para salir "es"e la
entra"a ,E/ a la sali"a ,S/ "el laberinto.
E/.rcici$ 2:
Este ejercico est compuesto "e C archivos:
in6opila.h
al$orit.h
tipos.h
pila.h
pila.c
al$orit.c
main.c
*.in6opila.h
)i,nde, 5I?E-5UILA5Z
)de,ine 5I?E-5UILA5Z
/* 6e,inici_n del ti#o de dato a almacenar en la #ila */
ty#ede, char FIU-5I?E-5UILA9
/* ,in del archi%o in,o#ila.h */
)endi,
2.al$orit.h
)i,nde, ALX-0IF5Z
)de,ine ALX-0IF5Z
ESFA6- Al(oritmo:int ar(c= char *ar(%78;9
)endi,
@-
VctorSanchez2 http://www.victorsanchez2.com
-.tipos.h
)i,nde, 5FIU-S5Z
)de,ine 5FIU-S5Z
ty#ede, enum >
E00-0= [IE?
C ESFA6-9
ty#ede, enum >
SI= ?-
C [--LEA?-9
/* ,in del archi%o ti#os.h */
)endi,
@.pila.h
)i,nde, 5UILA5Z
)de,ine 5UILA5Z
)include Ati#os.hA
)include Ain,o#ila.hA
)de,ine 3A45UILA /222 /* tamaWo m`<imo de la #ila */
/* de,inici_n del nue%o ti#o llamado UILA */
ty#ede, struct >
FIU-5I?E-5UILA *datos9
int to#e9
C UILA9
/* Esta ,unci_n inicialia la #ila como %acVa y reser%a memoria su,iciente
#ara un m`<imo
de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila:UILA *#ila;9
/* Esta ,unci_n nos dice si la #ila est` %acVa o no */
[--LEA?- UilaVacia:UILA #ila;9
/* Esta ,unci_n nos dice si la #ila est` llena o no */
[--LEA?- UilaLlena:UILA #ila;9
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;9
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;9
/* Esta ,unci_n li"era la memoria Hue se ha"Va reser%ado #ara los datos de
la #ila */
%oid Li"eraUila:UILA *#ila;9
/* ,in del archi%o #ila.h */
)endi,
A.pila.c
@@
VctorSanchez2 http://www.victorsanchez2.com
)include Ati#os.hA
)include Ain,o#ila.hA
)include A#ila.hA
)include *alloc.h+
)include *stdli".h+
)de,ine 3A45UILA /222
/* Esta ,uncion inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo
de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila:UILA *#ila;
>
i, :L#ila;
return E00-09
i, :L:#ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA *
sieo,:FIU-5I?E-5UILA;;;;
return E00-09
#ila1+to#e@1/9
return [IE?9
C
/* Esta ,uncion nos dice si la #ila est` %acVa o no */
[--LEA?- UilaVacia:UILA #ila;
>
i, :#ila.to#e@@1/;
return SI9
return ?-9
C
/* Esta ,uncion nos dice si la #ila est` llena o no */
[--LEA?- UilaLlena:UILA #ila;
>
i, :#ila.to#e@@3A45UILA;
return SI9
return ?-9
C
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;
>
i, :L#ila;
return E00-09
i, :UilaLlena:*#ila;@@SI;
return E00-09
#ila1+to#eII9
#ila1+datos7#ila1+to#e8@dato9
return [IE?9
C
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;
>
i, :L#ila PP Ldato;
return E00-09
i, :UilaVacia:*#ila;@@SI;
return E00-09
*dato@#ila1+datos7#ila1+to#e89
#ila1+to#e119
@A
VctorSanchez2 http://www.victorsanchez2.com
return [IE?9
C
/* Esta ,uncion li"era la memoria Hue se ha"Va reser%ado #ara los datos de
la #ila */
%oid Li"eraUila:UILA *#ila;
>
,ree:#ila1+datos;9
C
B.al$orit.c
)include A#ila.hA
)include Ati#os.hA
)include Aal(orit.hA
)include *strin(.h+
)include *stdio.h+
ESFA6- Al(oritmo:int ar(c= char* ar(%78;
>
int i@2= S@2= lon(itud9
UILA #ila9
FIU-5I?E-5UILA dato9

i, :Lar(%;
return E00-09
i, :LInicialiaUila:D#ila;;
>
,#rint,:stderr=ABnError al inicialiar la #ila= #osi"lemente= no hay
memoria su,icienteBnA;9
return E00-09
C
/* &ontrolamos Hue se metan #arametros al comando */
i, :ar(c*2;
>
,#rint,:stderr=ABnGso del #ro(rama: Ms *UA0A3EF0-S+A=ar(%728;9
return E00-09
C
/*3etemos la in,ormacion en la #ila...*/
,or:i@/9i*ar(c9iII;
>
lon(itud@strlen:ar(%7i8;9
Uush:D#ila=J J;9
,or:S@29S*lon(itud9SII;
i,:LUush:D#ila=ar(%7i87S8;;
>
,#rint,:stderr=ABnError al maneSar la #ila= memoria insu,icienteBnA;9
return E00-09
C
C
/* Im#rimamos la #ila */
$hile:UilaVacia:#ila;@@?-;
>
Uo#:D#ila=Ddato;9
,#rint,:stdout=AMcA=dato;9
C
,#rint,:stdout=ABnA;9
/*Li"eremos la #ila */
Li"eraUila:D#ila;9
return [IE?9
C
@B
VctorSanchez2 http://www.victorsanchez2.com
C.main.c
)include A#ila.hA
)include Ain,o#ila.hA
)include Aal(orit.hA
)include *stdio.h+
int main:int ar(c= char *ar(%78;
>
i, :LAl(oritmo:ar(c=ar(%;;
>
,#rint,:stderr=ABnError al realiar el al(oritmo.BnA;9
return E00-09
C
return [IE?9
C
E/.rcici$ !:
Este ejercico est compuesto "e C archivos:
in6opila.h
al$orit.h
tipos.h
pila.h
pila.c
al$orit.c
main.c
*.in6opila.h
)i,nde, 5I?E-5UILA5Z
)de,ine 5I?E-5UILA5Z
/* 6e,inici_n del ti#o de dato a almacenar en la #ila */
ty#ede, char * FIU-5I?E-5UILA9
)endi,
2.al$orit.h
)i,nde, ALX-0IF5Z
)de,ine ALX-0IF5Z
ESFA6- Al(oritmo:int ar(c= char *ar(%78;9
)endi,
-.tipos.h
)i,nde, 5FIU-S5Z
)de,ine 5FIU-S5Z
ty#ede, enum >
E00-0= [IE?
C ESFA6-9
@C
VctorSanchez2 http://www.victorsanchez2.com
ty#ede, enum >
SI= ?-
C [--LEA?-9
)endi,
@.pila.h
)i,nde, 5UILA5Z
)de,ine 5UILA5Z
)include Ati#os.hA
)include Ain,o#ila.hA
)de,ine 3A45UILA /222 /* tamaWo ma<imo de la #ila */
/* de,inicion del nue%o ti#o llamado UILA */
ty#ede, struct >
FIU-5I?E-5UILA *datos9
int to#e9
C UILA9
/* Esta ,uncion inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila:UILA *#ila;9
/* Esta ,uncion nos dice si la #ila esta %acia o no */
[--LEA?- UilaVacia:UILA #ila;9
/* Esta ,uncion nos dice si la #ila esta llena o no */
[--LEA?- UilaLlena:UILA #ila;9
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;9
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;9
/* Esta ,uncion li"era la memoria Hue se ha"ia reser%ado #ara los datos de
la #ila */
%oid Li"eraUila:UILA *#ila;9
)endi,
A.pila.c
)include Ati#os.hA
)include Ain,o#ila.hA
)include A#ila.hA
)include *stdli".h+
)include *alloc.h+
)de,ine 3A45UILA /222
/* Esta ,uncion inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo
de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila:UILA *#ila;
>
i, :L#ila;
return E00-09
#ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA * sieo,:FIU-5I?E-5UILA;;9
@.
VctorSanchez2 http://www.victorsanchez2.com
i, :L#ila1+datos;
return E00-09
#ila1+to#e@1/9
return [IE?9
C
/* Esta ,uncion nos dice si la #ila esta %acia o no */
[--LEA?- UilaVacia:UILA #ila;
>
i, :#ila.to#e@@1/;
return SI9
return ?-9
C
/* Esta ,uncion nos dice si la #ila esta llena o no */
[--LEA?- UilaLlena:UILA #ila;
>
i, :#ila.to#e@@3A45UILA;
return SI9
return ?-9
C
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;
>
i, :L#ila;
return E00-09
i, :UilaLlena:*#ila;@@SI;
return E00-09
#ila1+to#eII9
#ila1+datos7#ila1+to#e8@dato9
return [IE?9
C
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;
>
i, :L#ila PP Ldato;
return E00-09
i, :UilaVacia:*#ila;@@SI;
return E00-09
*dato@#ila1+datos7#ila1+to#e89
#ila1+to#e119
return [IE?9
C
/* Esta ,uncion li"era la memoria Hue se ha"ia reser%ado #ara los datos de
la #ila */
%oid Li"eraUila:UILA *#ila;
>
,ree:#ila1+datos;9
C
B.al$orit.c
)include A#ila.hA
)include Ati#os.hA
@I
VctorSanchez2 http://www.victorsanchez2.com
)include Aal(orit.hA
)include *strin(.h+
)include *stdio.h+
ESFA6- Al(oritmo:int ar(c= char* ar(%78;
>
int i@2= lon(itud9
UILA #ila9
FIU-5I?E-5UILA dato9
i, :Lar(%; return E00-09
i, :LInicialiaUila:D#ila;;
>
,#rint,:stderr=ABnError al inicialiar la #ila= #osi"lemente= no hay
memoria su,icienteBnA;9
return E00-09
C
/* &ontrolamos Hue se metan #arametros al comando */
i, :ar(c*2;
>
,#rint,:stderr=ABnGso del #ro(rama: Ms *UA0a3EF0-S+A=ar(%728;9
return E00-09
C
/*3etemos la in,ormacion en la #ila...*/
,or:i@/9i*ar(c9iII;
>
lon(itud@strlen:ar(%7i8;9
Uush:D#ila=A A;9
i,:LUush:D#ila=ar(%7i8;;
>
,#rint,:stderr=ABnError al maneSar la #ila= memoria insu,icienteBnA;9
return E00-09
C
C
/* Im#rimamos la #ila */
$hile:UilaVacia:#ila;@@?-;
>
Uo#:D#ila=Ddato;9
,#rint,:stdout=AMsA=dato;9
C
,#rint,:stdout=ABnA;9
/*Li"eremos la #ila */
Li"eraUila:D#ila;9
return [IE?9
C
C.main.c
)include A#ila.hA
)include Ain,o#ila.hA
)include Aal(orit.hA
)include *stdio.h+
int main:int ar(c= char *ar(%78;
>
i, :LAl(oritmo:ar(c=ar(%;;
>
,#rint,:stderr=ABnError al realiar el al(oritmo.BnA;9
return E00-09
C
return [IE?9
A+
VctorSanchez2 http://www.victorsanchez2.com
C
E/.rcici$ ':
Este ejercico est compuesto "e I archivos:
*. in6opila.h
2. al$orit.h
-. tipos.h
@. pila.h
A. lab.h
B. pila.c
C. lab.c
.. al$orit.c
I. main.c
Jo"os los archivos son necesarios para %ue el pro$rama 6uncione correctamente. )ara
%ue nuestro compila"or lo entien"a correctamente "eberemos $enerar un proyecto en
J o el compila"or %ue utilicemos.
*.in6opila.h
)i,nde, 5I?E-5UILA5Z
)de,ine 5I?E-5UILA5Z
)include Ati#os.hA
)include Ala".hA
/* 6e,inicion del ti#o de dato a almacenar en la #ila */
ty#ede, 3-VI3IE?F- FIU-5I?E-5UILA9
)endi,
2.al$orit.h
)i,nde, 5ALX-0IF5Z
)de,ine 5ALX-0IF5Z
)include Ati#os.hA
)include Ala".hA
/* 0esuel%e el la"erinto */
ESFA6- Al(oritmo:LA[E0I?F- *la"erinto= &--06E?A6A coordenada= int #arametro=
[--LEA?- *solucion;9
)endi,
-. tipos.h
)i,nde, 5FIU-S5Z
)de,ine 5FIU-S5Z
ty#ede, enum >
E00-0= [IE?= SALI6A5I3U-SI[LE= E00-05&-3A?6-
C ESFA6-9
ty#ede, enum >
SI= ?-
C [--LEA?-9
A*
VctorSanchez2 http://www.victorsanchez2.com
)endi,
@.pila.h
)i,nde, 5UILA5Z
)de,ine 5UILA5Z
)include Ati#os.hA
)include Ain,o#ila.hA
)de,ine 3A45UILA /222 /* 3a<imo de elementos #osi"les en la #ila */
/* 6e,inicion del nue%o ti#o llamado UILA */
ty#ede, struct >
FIU-5I?E-5UILA *datos9
int to#e9
C UILA9
/* Esta ,uncion inicialia la #ila como %acia y reser%a memoria su,iciente
#ara un ma<imo de 3A45UILA elementos en la #ila */
ESFA6- InicialiaUila:UILA *#ila;9
/* Esta ,uncion nos dice si la #ila esta %acia o no */
[--LEA?- UilaVacia:UILA *#ila;9
/* Esta ,uncion nos dice si la #ila esta llena o no */
[--LEA?- UilaLlena:UILA *#ila;9
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;9
/* 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario */
ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;9
/* 3ostramos los mo%imientos Hue se han realiado en el la"erinto */
ESFA6- mostrar5mo%imientos:UILA *#Uila;9
/* Esta ,uncion li"era la memoria Hue se ha"ia reser%ado #ara los datos de la
#ila */
%oid Li"eraUila:UILA *#ila;9
)endi,
A.lab.h
)i,nde, 5LA[5Z
)de,ine 5LA[5Z
)include Ati#os.hA
)de,ine LA6-53A4 /22 /* 6imension ma<ima #ermitida #ara el la"erinto */
ty#ede, enum >
?I?XG?-= A00I[A= A[A\-= 6E0E&ZA= I]^GIE06A
C 3-VI3IE?F-9
ty#ede, struct >
char ma#a7LA6-53A487LA6-53A489
A2
VctorSanchez2 http://www.victorsanchez2.com
int ancho9
int alto9
C LA[E0I?F-9 /* 6e,inimos el ti#o del la"erinto */
ty#ede, struct >
int <9
int y9
C &--06E?A6A9
/* Se encar(a de %olcar los datos desde el ,ichero a la estructura la"erinto.
Adem`s= de%uel%e las coordenadas < e y de la entrada al la"erinto. 6a E00-0 si
hay al(n #ro"lema. */
ESFA6- lee5la"erinto:char *nom"re5,ichero= LA[E0I?F- * la"erinto= &--06E?A6A *
#osicion5entrada;9
/* Im#rime el la"erinto #or #antalla */
%oid im#rime5la"erinto:LA[E0I?F- * la"erinto;9
/* 6ice si #odemos ocu#ar esa casilla del la"erinto o no9 #odemos ocu#ar las
casillas Hue tienen un es#acio %acVo= JEJ o JSJ.*/
[--LEA?- es5casilla5#ermitida:LA[E0I?F- *la"erinto= &--06E?A6A
#osicion5actual;9
/* 6ice si esa casilla es la salida : JSJ; o no. */
[--LEA?- es5casilla5salida:LA[E0I?F- *la"erinto= &--06E?A6A #osicion5actual;9
/* &om#ro"amos si la casilla de salida esta rodeada #or 4 */
[--LEA?- salida5rodeada:LA[E0I?F- *la"erinto= &--06E?A6A coord5salida;9
/* En "ase al ultimo mo%imiento Hue se ha realiado= nos dice Hue mo%imiento
de"emos de intentar ahora. Uor eSem#lo: nin(uno1+arri"a= arri"a1+derecha=
derecha1+a"aSo= a"aSo1+iHuierda= iHuierda1+nin(uno.*/
3-VI3IE?F- #olitica5mo%imiento:3-VI3IE?F- *ultimo5mo%imiento;9
/* Uara un mo%imiento dado= nos dice su o#uesto. IHuierda y derecha son
o#uestos= arri"a y a"aSo son o#uestos. El o#uesto de nin(uno es nin(uno. */
3-VI3IE?F- mo%imiento5o#uesto:3-VI3IE?F- mo%imiento;9
/* Esta ,uncion nos dice Hue coordenada tendremos si realiamos el mo%imiento
es#eci,icado desde la #osicion actual.*/
&--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual= 3-VI3IE?F-
si(uiente5mo%imiento;9
/* Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= con un
#unto :J . ;*/
%oid marca5la"erinto:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual;9
/* Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= con un
#unto :J . ;*/
%oid marca5la"erinto3al&amino:LA[E0I?F- * la"erinto= &--06E?A6A
#osicion5actual;9
/* Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos= con una
E :J E ;*/
%oid marca5con5E:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual;9
/* Im#rime la solucion del la"erinto #or #antalla */
%oid im#rime5la"erinto5solucion:LA[E0I?F- * la"erinto;9
)endi,
B.pila.c
A-
VctorSanchez2 http://www.victorsanchez2.com
)include Ati#os.hA
)include Ain,o#ila.hA
)include A#ila.hA
)include *alloc.h+
)include *stdli".h+
)include *stdio.h+
)de,ine 3A45UILA /222 /* Elementos Hue #uede contener la #ila */
/*****************************************************************************
* Euncion: ESFA6- InicialiaUila:UILA *#ila;
*
* I?: Uuntero a la #ila.
* -GF: Error si no se ha #odido inicialiar la #ila.
* 3A.E: Esta ,uncion inicialia la #ila como %acia y reser%a memoria
su,iciente
* #ara un ma<imo de 3A45UILA elementos en la #ila.
*
*****************************************************************************/
ESFA6- InicialiaUila:UILA *#ila;
>
i, :L#ila;
return E00-09
#ila1+datos@ :FIU-5I?E-5UILA *; malloc:3A45UILA * sieo,:FIU-5I?E-5UILA;;9
i, :L:#ila1+datos;;
return E00-09
#ila1+to#e@1/9
return [IE?9
C
/*****************************************************************************
* Euncion: [--LEA?- UilaVacia:UILA *#ila;
*
* I?: Uuntero a la #ila.
* -GF: 6e%uel%e SI= si la #ila no contiene elementos.
* 3A.E: Esta ,uncion nos dice si la #ila esta %acia o no.
*
*****************************************************************************/
[--LEA?- UilaVacia:UILA *#ila;
>
i, :#ila1+to#e @@ 1/;
return SI9
return ?-9
C
/*****************************************************************************
* Euncion: [--LEA?- UilaLlena:UILA *#ila;
*
* I?: Uuntero a la #ila.
* -GF: 6e%uel%e SI si la #ila esta llena.
* 3A.E: Esta ,uncion nos in,orma de si la #ila esta llena o no
*
*****************************************************************************/
[--LEA?- UilaLlena:UILA *#ila;
>
i, :#ila1+to#e @@ 3A45UILA;
return SI9
return ?-9
C
A@
VctorSanchez2 http://www.victorsanchez2.com
/*****************************************************************************
* Euncion: ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;
*
* I?: Uuntero a la #ila y el dato Hue se introduce en la #ila.
* -GF: 6e%uel%e [IE? si todo ha ido correctamente= E00-0 en caso contrario.
* 3A.E: Introducimos un dato en la #ila si es #osi"le.
*
*****************************************************************************/
ESFA6- Uush:UILA *#ila= FIU-5I?E-5UILA dato;
>
i, :L#ila;
return E00-09
i, :UilaLlena:#ila;@@SI;
return E00-09
#ila1+to#eII9
#ila1+datos7#ila1+to#e8@dato9
return [IE?9
C
/*****************************************************************************
* Euncion: ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;
*
* I?: Uuntero a la #ila y #untero al ti#o de dato.
* -GF: 6e%uel%e [IE? si todo ha ido correctamte= E00-0 en caso contrario.
* 3A.E: Sacamos un dato de la #ila si es #osi"le.
*
*****************************************************************************/
ESFA6- Uo#:UILA *#ila= FIU-5I?E-5UILA *dato;
>
i, :L#ila PP Ldato;
return E00-09
i, :UilaVacia:#ila;@@SI;
return E00-09
*dato@#ila1+datos7#ila1+to#e89
#ila1+to#e119
return [IE?9
C
/*****************************************************************************
* Euncion: ESFA6- mostrar5mo%imientos:UILA *#Uila;
*
* I?: Uuntero a la #ila.
* -GF: Se muestran #or #antalla los mo%imientos realiados.
* 3A.E: 3ostramos los mo%imientos Hue se han realiado en el la"erinto.
*
*****************************************************************************/
ESFA6- mostrar5mo%imientos:UILA *#Uila;
>
UILA UilaAu<9
FIU-5I?E-5UILA elemento9
InicialiaUila:DUilaAu<;9
$hile :UilaVacia:#Uila; @@ ?-;
>
Uo#:#Uila= Delemento;9
Uush:DUilaAu<= elemento;9
C
$hile :UilaVacia:DUilaAu<; @@ ?-;
>
Uo#:DUilaAu<= Delemento;9
s$itch :elemento;
AA
VctorSanchez2 http://www.victorsanchez2.com
>
case A00I[A: #rint,:AArri"a1+A;9 "reaQ9
case 6E0E&ZA: #rint,:A6erecha1+A;9 "reaQ9
case A[A\-: #rint,:AA"aSo1+A;9 "reaQ9
case I]^GIE06A: #rint,:AIHuierda1+A;9 "reaQ9
C
C
#rint,:ABnA;9
Li"eraUila:DUilaAu<;9
return [IE?9
C
/*****************************************************************************
* Euncion: %oid Li"eraUila:UILA *#ila;
*
* I?: Uuntero a la #ila.
* -GF:
* 3A.E: Li"era la memoria Hue se ha"ia reser%ado #ara los datos de la #ila.
*
*****************************************************************************/
%oid Li"eraUila:UILA *#ila;
>
,ree:#ila1+datos;9
C
C.lab.c
)include Ala".hA
)include Ati#os.hA
)include *stdio.h+
/*****************************************************************************
* Euncion: ESFA6- lee5la"erinto:char *nom"re5,ichero=LA[E0I?F-
*la"erinto=&--06E?A6A *#osicion5entrada;
*
* I?: El nom"re del ,ichero= un #untero al la"erinto y un #untero a la
#osicion de entrada.
* -GF: Uosicion de entrada al la"erinto y la estructura la"erinto
com#letada. E00-0 si al(o
* ha ido mal.
* 3A.E: Se encar(a de %olcar los datos desde el ,ichero a la estructura
la"erinto. Ademas=
* de%uel%e las coordenadas < e y de la entrada al la"erinto. 6e%uel%e
error si hay
* al(un #ro"lema.
*
*****************************************************************************/
ESFA6- lee5la"erinto:char *nom"re5,ichero= LA[E0I?F- * la"erinto= &--06E?A6A *
#osicion5entrada;
>
EILE *#tr@?GLL9
char c9 /* Varia"le #ara ir leyendo los caracteres del archi%o */
[--LEA?- entrada @ ?-= salida @ ?-9 /* Uara com#ro"ar el numero de
entradas y salidas */
[--LEA?- salida5im#osi"le@?-9 /* 3ostraremos si el la"erinto no
tiene solucion */
&--06E?A6A coordenada5salida9
int < @ 2= y @ 29
i, :Lla"erinto PP Lnom"re5,ichero PP L#osicion5entrada;
return E00-09
la"erinto1+ancho @ 1/9
AB
VctorSanchez2 http://www.victorsanchez2.com
/* A"rimos el archi%o #ara lectura */
#tr @ ,o#en:nom"re5,ichero= ArA;9
i, :L#tr;
>
,#rint,:stderr= ABn?o se #udo leer el archi%o dado= #or ,a%or re%ise
rutas y #ermisos.A;9
return E00-09
C
/* 3ientras Hue no lle(uemos al ,inal del archi%o %amos com#ro"ando y
acumulando el la"erinto */
$hile ::c @ ,(etc:#tr;; L@ E-E;
>
i, :< * 2;
>
i, :c @@ JBnJ;
>
< @ 1/9
i, :y@@LA6-53A4;
>
,#rint,:stderr=ABnLa"erinto demasiado alto= #or ,a%or re%iseloBnA;9
return E00-09
C
yII9
C
else
<119
C
else
>
s$itch :c;
>
case JeJ:
case JEJ: i, :entrada @@ SI;
>
,#rint,:stderr= ABnSolo se #ermite una entrada #or
,ichero.BnA;9
return E00-09
C
else
>
entrada @ SI9
la"erinto1+ma#a7<87y8 @ c9
#osicion5entrada1+< @ <9
#osicion5entrada1+y @ y9
C
"reaQ9
case JsJ:
case JSJ: i, :salida @@ SI;
>
,#rint,:stderr= ABnSolo se #ermite una salida #or
,ichero.BnA;9
return E00-09
C
else
>
salida @ SI9
la"erinto1+ma#a7<87y8 @ c9
coordenada5salida.< @ <9
coordenada5salida.y @ y9
i, :salida5rodeada:la"erinto= coordenada5salida;@@SI;
salida5im#osi"le@SI9
C
"reaQ9
case J<J:
case J4J: la"erinto1+ma#a7<87y8 @ c9
AC
VctorSanchez2 http://www.victorsanchez2.com
"reaQ9
case J,J:
case JEJ: i, :la"erinto1+ancho @@ 1/;
la"erinto1+ancho @ < 1 /9
else i, :la"erinto1+ancho L@ < 1 /;
>
,#rint,:stderr=ABnLos anchos no concuerdan= #or ,a%or
re%ise el archi%o.BnA;9
return E00-09
C
< @ 129
"reaQ9
case JBnJ: ,#rint,:stderr= ABnLinea sin delimitador de ,inal
:JEJ;.BnA;9
return E00-09
case J J: la"erinto1+ma#a7<87y8 @ c9
"reaQ9
de,ault: ,#rint,:stderr= ABn&aracter in%alido= #or ,a%or re%ise el
,icheroBnA;9
return E00-09
C /* Ein s$itch */
C /* Ein: else */
i, :<@@LA6-53A4;
>
,#rint,:stderr=ABnLa"erinto demasiado ancho= #or ,a%or re%iselo.BnA;9
return E00-09
C
<II9
C /* Ein $hile */
i, :salida@@?-;
>
,#rint,:stderr= ABn6e"e ha"er al(una salida.A;9
return E00-09
C
i, :entrada@@?-;
>
,#rint,:stderr= ABn6e"e ha"er al(una entrada.A;9
return E00-09
C
la"erinto1+alto @ y1/9
,close:#tr;9
i, :salida5im#osi"le@@SI;
>
,#rint,:stdout= ABnEl la"erinto no tiene solucion.A;9
,#rint,:stdout= ABnLa salida esta rodeada #or 4.BnBnA;9
return SALI6A5I3U-SI[LE9
C
return [IE?9
C
/*****************************************************************************
* Euncion: %oid im#rime5la"erinto:LA[E0I?F- * la"erinto;
*
* I?: Uuntero al la"erinto.
* -GF:
* 3A.E: Im#rime el la"erinto #or #antalla.
*
*****************************************************************************/
A.
VctorSanchez2 http://www.victorsanchez2.com
%oid im#rime5la"erinto:LA[E0I?F- * la"erinto;
>
)de,ine AltoUermitido /Y
int <= y9
,or :y@29 y *@ la"erinto1+alto9 yII;
>
,or :<@29 < *@ la"erinto1+ancho9 <II;
>
i, :y; /* Si y es L@ de 2 */
>
/* Uaramos cada AAltoUermitidoA lineas */
i, : ::y M AltoUermitido; @@ 2; DD :<@@2; ;
>
,,lush:stdin;9
,(etc:stdin;9 /* Leemos un caracter #ara detener la #antalla */
,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9
C
else
,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9
C
else
,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9
C /* Ein del se(undo Eor */
,#rint,:stdout= ABnA;9
C /* Ein del #rimer Eor */
,#rint,:stdout= ABnA;9
C
/*****************************************************************************
* Euncion: %oid im#rime5la"erinto5solucion:LA[E0I?F- * la"erinto;
*
* I?: Uuntero al la"erinto.
* -GF:
* 3A.E: Im#rime la solucion del la"erinto #or #antalla.
*
*****************************************************************************/
%oid im#rime5la"erinto5solucion:LA[E0I?F- * la"erinto;
>
int <= y9
#rint,:ABnUulse una tecla #ara %er la solucion:A;9
,,lush:stdin;9
,(etc:stdin;9
,or :y @ 29 y *@ la"erinto1+alto9 yII;
>
,or :< @ 29 < *@ la"erinto1+ancho9 <II;
>
i, :y;
>
i, : ::y M AltoUermitido; @@ 2; DD :<@@2; ;
>
,,lush:stdin;9
,(etc:stdin;9
i, :la"erinto1+ma#a7<87y8 L@ J=J;
,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9
else
,#rint,:stdout= A A;9
C
else
>
i, :la"erinto1+ma#a7<87y8 L@ J=J;
,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9
else
,#rint,:stdout= A A;9
AI
VctorSanchez2 http://www.victorsanchez2.com
C
C
else
>
i, :la"erinto1+ma#a7<87y8 L@ J=J;
,#rint,:stdout= AMcA= la"erinto1+ma#a7<87y8;9
else
,#rint,:stdout= A A;9
C
C
,#rint,:stdout= ABnA;9
C
,#rint,:stdout= ABnA;9
C
/*****************************************************************************
* Euncion: [--LEA?- es5casilla5#ermitida:LA[E0I?F- *la"erinto= &--06E?A6A
#osicion5actual;
*
* I?: Uuntero al la"erinto y la #osicion actual.
* -GF: Si la casilla esta #ermitida de%uel%e SI= de lo contrario de%uel%e
?-.
* 3A.E: 6ice si #odemos ocu#ar la casilla del la"erinto o no. Uodemos ocu#ar
las
* casillas Hue tienen un es#acio %acio= son JEJ= JeJ= JSJ o JsJ.
*
*****************************************************************************/
[--LEA?- es5casilla5#ermitida:LA[E0I?F- *la"erinto= &--06E?A6A
#osicion5actual;
>
i, : :#osicion5actual.< + la"erinto1+ancho; PP :#osicion5actual.y +
la"erinto1+alto; ;
return ?-9

i, :la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @@ JSJ PP
la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @@ J J;
return SI9
return ?-9
C
/*****************************************************************************
* Euncion: [--LEA?- es5casilla5salida:LA[E0I?F- *la"erinto= &--06E?A6A
#osicion5actual;
*
* I?: Uuntero al la"erinto y #osicion actual.
* -GF: Si es la casilla de salida de%uel%e SI= si no de%uel%e ?-.
* 3A.E: 6ice si esa casilla es la salida :JSJ; o no.
*
*****************************************************************************/
[--LEA?- es5casilla5salida:LA[E0I?F- *la"erinto= &--06E?A6A #osicion5actual;
>
i, :la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @@ JSJ;
return SI9
return ?-9
C
/*****************************************************************************
* Euncion: [--LEA?- salida5rodeada:LA[E0I?F- *la"erinto= &--06E?A6A
coord5salida;
*
* I?: Uuntero al la"erinto y la coordenada de salida.
* -GF: Si la salida es im#osi"le de%uel%e SI= si no esta rodeada #or 4
de%uel%e ?-.
* 3A.E: &om#ro"amos si la casilla de salida esta rodeada #or 4.
B+
VctorSanchez2 http://www.victorsanchez2.com
*
*****************************************************************************/
[--LEA?- salida5rodeada:LA[E0I?F- *la"erinto= &--06E?A6A coord5salida;
>
3-VI3IE?F- mo%imiento @ A00I[A9
&--06E?A6A #osicion5actual9
$hile :mo%imiento L@ ?I?XG?-;
>
#osicion5actual @ calcula5nue%a5#osicion:coord5salida= mo%imiento;9
i, :es5casilla5#ermitida:la"erinto= #osicion5actual;@@SI;
return ?-9
#olitica5mo%imiento:Dmo%imiento;9
C
return SI9
C
/*****************************************************************************
* Euncion: 3-VI3IE?F- #olitica5mo%imiento:3-VI3IE?F- *ultimo5mo%imiento;
*
* I?: Uuntero al ultimo mo%imiento realiado.
* -GF: 6e%uel%e el mo%imiento de acuerdo a nuestra #olitica.
* 3A.E: En "ase al ultimo mo%imiento Hue se ha realiado= nos dice Hue
* mo%imiento de"emos intentar ahora: nin(uno1+arri"a= arri"a1+derecha=
* derecha1+a"aSo= a"aSo1+iHuierda= iHuierda1+nin(uno.
*
*****************************************************************************/
3-VI3IE?F- #olitica5mo%imiento:3-VI3IE?F- *ultimo5mo%imiento;
>
s$itch :*ultimo5mo%imiento;
>
case ?I?XG?-: return *ultimo5mo%imiento @ A00I[A9
case A00I[A: return *ultimo5mo%imiento @ 6E0E&ZA9
case 6E0E&ZA: return *ultimo5mo%imiento @ A[A\-9
case A[A\-: return *ultimo5mo%imiento @ I]^GIE06A9
case I]^GIE06A: return *ultimo5mo%imiento @ ?I?XG?-9
C
return *ultimo5mo%imiento9
C
/*****************************************************************************
* Euncion: 3-VI3IE?F- mo%imiento5o#uesto:3-VI3IE?F- mo%imiento;
*
* I?: 3o%imiento del Hue calcularemos el o#uesto.
* -GF: 6e%uel%e el mo%imiento o#uesto.
* 3A.E: Uara un mo%imiento dado= nos dice su o#uesto. IHuierda y derecha son
* o#uestos= arri"a y a"aSo son o#uestos. El o#uesto de nin(uno es nin(uno.
*
*****************************************************************************/
3-VI3IE?F- mo%imiento5o#uesto:3-VI3IE?F- mo%imiento;
>
s$itch :mo%imiento;
>
case ?I?XG?-: return ?I?XG?-9
case A00I[A: return A[A\-9
case 6E0E&ZA: return I]^GIE06A9
case A[A\-: return A00I[A9
B*
VctorSanchez2 http://www.victorsanchez2.com
case I]^GIE06A: return 6E0E&ZA9
C
return ?I?XG?-9
C
/*****************************************************************************
* Euncion: &--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual=
* 3-VI3IE?F- si(uiente5mo%imiento;
*
* I?: La #osicion actual y el si(uiente mo%imiento Hue tenemos Hue realiar.
* -GF: La coordenada Hue se calcula con la #osicion actual y el mo%imiento.
* 3A.E: Esta ,uncion nos dice Hue coordenada tendremos si realiamos el
* mo%imiento es#eci,icado desde la #osicion actual.
*
*****************************************************************************/
&--06E?A6A calcula5nue%a5#osicion:&--06E?A6A #osicion5actual= 3-VI3IE?F-
si(uiente5mo%imiento;
>
s$itch :si(uiente5mo%imiento;
>
case ?I?XG?-: return #osicion5actual9
case A00I[A: #osicion5actual.y119 /* Eila su#erior a la actual */
return #osicion5actual9
case 6E0E&ZA: #osicion5actual.<II9 /* &olumna si(uiente a la actual */
return #osicion5actual9
case A[A\-: #osicion5actual.yII9 /* Eila in,erior a la actual */
return #osicion5actual9
case I]^GIE06A: #osicion5actual.<119 /* &olumna anterior a la actual */
return #osicion5actual9
C
return #osicion5actual9
C
/*****************************************************************************
* Euncion: %oid marca5la"erinto:LA[E0I?F- * la"erinto= &--06E?A6A
* #osicion5actual;
*
* I?: Uuntero al la"erinto y #osicion actual.
* -GF:
* 3A.E: Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos=
* con un #unto J.J
*
*****************************************************************************/
%oid marca5la"erinto:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual;
>
la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @ J.J9
C
/*****************************************************************************
* Euncion: %oid marca5la"erinto3al&amino:LA[E0I?F- * la"erinto= &--06E?A6A
* #osicion5actual;
*
* I?: Uuntero al la"erinto y la #osicion actual.
* -GF:
* 3A.E: Euncion Hue marca el la"erinto= en la #osicion en la Hue estemos=
* con una coma J=J
*
*****************************************************************************/
B2
VctorSanchez2 http://www.victorsanchez2.com
%oid marca5la"erinto3al&amino:LA[E0I?F- * la"erinto= &--06E?A6A
#osicion5actual;
>
la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @ J=J9
C
/*****************************************************************************
* Euncion: %oid marca5con5E:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual;
*
* I?: Gn #untero al la"erinto y la #osicion actual
* -GF:
* 3A.E: Esta ,uncion marca el la"erinto= en la #osicion en la Hue estemos=
* con una JEJ
*
*****************************************************************************/
%oid marca5con5E:LA[E0I?F- * la"erinto= &--06E?A6A #osicion5actual;
>
la"erinto1+ma#a7#osicion5actual.<87#osicion5actual.y8 @ JEJ9
C
..al$orit.c
)include *stdio.h+
)include Ain,o#ila.hA
)include Ala".hA
)include A#ila.hA
)include Ati#os.hA
)include Aal(orit.hA
)include Astdio.hA
/*****************************************************************************
* Euncion: ESFA6- Al(oritmo:LA[E0I?F- *la"erinto= &--06E?A6A coordenada= int
* #arametro= [--LEA?- *solucion;
*
* I?: Uuntero al la"erinto= coordenada= un #arametro Hue es el comando y si
* el la"erinto tiene solucion se acumulara en *solucion.
* -GF: Si las cosas marchar correctamente de%uel%e [IE?= si no de%uel%e E00-0.
* 3A.E: Euncion #ara realiar el al(oritmo del la"erinto.
*
*****************************************************************************/
ESFA6- Al(oritmo:LA[E0I?F- *la"erinto= &--06E?A6A coordenada= int #arametro=
[--LEA?- *solucion;
>
3-VI3IE?F- mo%imiento @ A00I[A9
UILA #ila9
char "asura7/289
char %er5mo%9 /* El ususario lo eli(e #ara %er los mo%imientos*/
InicialiaUila:D#ila;9
i, :Lla"erinto;
return E00-09
Uush:D#ila= ?I?XG?-;9
do >
i, :mo%imiento @@ ?I?XG?-;
>
marca5la"erinto3al&amino:la"erinto= coordenada;9
i, :UilaVacia:D#ila; @@ ?-;
Uo#:D#ila= Dmo%imiento;9
coordenada @ calcula5nue%a5#osicion:coordenada=
mo%imiento5o#uesto:mo%imiento;;9
C
else
>
B-
VctorSanchez2 http://www.victorsanchez2.com
i, :es5casilla5#ermitida :la"erinto= calcula5nue%a5#osicion:coordenada=
mo%imiento;; @@ SI;
>
Uush:D#ila= mo%imiento;9
i, :#arametro@@3;
>
im#rime5la"erinto:la"erinto;9
,(ets:"asura= /2= stdin;9
,,lush:stdin;9
C
coordenada @ calcula5nue%a5#osicion:coordenada= mo%imiento;9
i, :es5casilla5salida:la"erinto= coordenada; @@ SI;
>
,#rint,:stdout= ABnLa"erinto &-? solucionBnBnA;9
*solucion@SI9
#rint,:ABnSi desea %er los mo%imientos escri"a JsJ o JSJ: A;9
%er5mo% @ ,(etc:stdin;9
i, : :%er5mo%@@JsJ; PP :%er5mo%@@JSJ; ;
mostrar5mo%imientos:D#ila;9
#rint,:ABnIntroduca cualHuier caracter #ara %er la solucionA;9
,,lush:stdin;9
,(etc:stdin;9
Li"eraUila:D#ila;9
return [IE?9
C
marca5la"erinto:la"erinto= coordenada;9
mo%imiento@?I?XG?-9
C
C
#olitica5mo%imiento:Dmo%imiento;9
C $hile :UilaVacia:D#ila; @@ ?-;9
marca5con5E:la"erinto=coordenada;9
,#rint,:stdout= ABnLa"erinto SI? solucionBnA;9
Li"eraUila:D#ila;9
return [IE?9
C
I.main.c
)include Aal(orit.hA
)include A#ila.hA
)include Ala".hA
)include Ati#os.hA
)include *stdio.h+
)include *strin(.h+
%oid AyudaGso:%oid;9
int main:int ar(c= char *ar(%78;
>
[--LEA?- solucion@?-9
LA[E0I?F- la"erinto9
&--06E?A6A coordenada9
int com#ara9
char comando78@A1sA9
i, : L::ar(c@@2; PP :ar(c@@3;; ;
>
AyudaGso:;9
return E00-05&-3A?6-9
C
i, :ar(c @@ 3;
>
com#ara @ strcm#:ar(%728= comando;9
B@
VctorSanchez2 http://www.victorsanchez2.com
/* Si no se ha introducido 1s como comando mostramos el error */
i, :com#ara;
>
AyudaGso:;9
return E00-05&-3A?6-9
C
C
s$itch :lee5la"erinto:ar(%7/8= Dla"erinto= Dcoordenada;;
>
case E00-0: ,#rint,:stderr=ABnError al leer el ,ichero.BnA;9
return E00-09
case SALI6A5I3U-SI[LE: im#rime5la"erinto:Dla"erinto;9
return SALI6A5I3U-SI[LE9
C
i, : LAl(oritmo:Dla"erinto= coordenada= ar(c= Dsolucion; ;
>
,#rint,:stderr=ABnError al #asar el al(oritmo= #or ,a%or consulte con su
distri"uidor.A;9
return E00-09
C
,#rint,:stdout=ABnEl trayecto realiado ha sido: BnA;9
im#rime5la"erinto:Dla"erinto;9
i, :solucion@@SI;
>
,#rint,:stdout=ABnLa solucion del la"erinto es: BnA;9
im#rime5la"erinto5solucion:Dla"erinto;9
C
return [IE?9
C
/*****************************************************************************
* Euncion: %oid AyudaGso:%oid;
*
* I?:
* -GF:
* 3A.E: 3uestra un mensaSe de ayuda #ara el usuario #ara Hue introduca los
* comandos correctamente.
*
******************************************************************************
*/
%oid AyudaGso:%oid;
>
,#rint,:stderr=ABnEl uso del comando es: *eSecuta"le+ *nom"re del la"erinto+
71s8BnA;9
C
!os archivos "e prueba con los laberintos para este pro$rama "eberan venir a"juntos
con este "ocumento. Si hay al$;n problema pue"en visitar mi web y a"%uirirlos:
http://www.victorsanchez2.com
PRCTICA '
O*JETI+OS
El objetivo "e esta prctica es implementar la :eta Estructura "e (atos ,:eta E"(/
!>SJ0 y realizar un ejercicio "e aplicaci#n "e "icho tipo "e "atos. El ejercicio consistir
BA
VctorSanchez2 http://www.victorsanchez2.com
en pro$ramar la $esti#n "e una serie "e personas ,utilizan"o la estructura "e "atos
"e6ini"a en la prctica 2/ usan"o listas para or"enarlas "e acuer"o a "iversos criterios
as como para "e6inir la lista "e amigos "e una persona. !a implementaci#n "el tipo "e
"ato ser una implementaci#n $en8rica7 es "ecir no "epen"iente "el tipo "e elemento
%ue se va a $uar"ar en la lista.
E3EH>>?S
*. >mplementaci#n "e la :eta E"( LIST ,archivos lista.! y lista.c"
El archivo lista.! contiene las constantes y "e6iniciones "e tipos asocia"as a la :eta
E"( lista y la cabecera "e las 6unciones asocia"as a esa :eta E"(.
El archivo lista.c "eber "e contener el c#"i$o %ue implementa las 6unciones "e6ini"as
en lista.h.
2. Escribir un pro$rama "e prueba para comprobar el 6uncionamiento a"ecua"o "e
la implementaci#n "e la :eta E"( !>SJ0. El pro$rama "ebe recibir como ar$umentos
por la lnea "e coman"os una serie "e ca"enas "e caracteres e insertarlas en una lista
enlaza"a. 4na vez hecho esto "ebe recorrer la lista para volver a obtener "ichas ca"enas
e imprimirlas por pantalla.

-. )ara este ejercicio se utilizar la estructura "e "atos persona utiliza"a en la
prctica 27 en la cual el campo amigo se ha re"e6ini"o como LIST amigos. (icha
"e6inici#n se encuentra en el archivo persona.h %ue se a"junta.
>mplementar tambi8n en "icho archivo la 6unci#n au5iliar !iberar)ersona "e la prctica
2. El archivo persona.c "eber "e contener el c#"i$o %ue implementa las 6unciones
"e6ini"as en persona.h.
@. Healizar un pro$rama "river para probar las 6unciones "e manipulaci#n "e listas.
(icho pro$rama "eber:
0.!eer "e un archivo "e te5to ,cuyo nombre se recibir como el primer ar$umento
pasa"o al pro$rama/ los "atos "e una serie "e personas Healizar un pro$rama %ue e
insertarlos en una lista. (icha lista se manten"r en memoria hasta la 6inalizaci#n "el
pro$rama.
El 6ormato "e este 6ichero ser:
NombreRtapelli"osRte"a"Rt(N>Rn
ampos o "atos "e una persona separa"os por tabula"ores7 ca"a persona termina con
salto "e carro.
#er fic!ero personas.t$t
9.!eer "e un se$un"o archivo "e te5to ,cuyo nombre se recibir como ar$umento
si$uiente al anterior/ "on"e estarn conteni"os las relaciones "e Pamista"P entre las
personas "el 6ichero "el punto 0.
El 6ormato "e este 6ichero ser:
(N>)ersonaRt(N>0mi$o*Rt(N>0mi$o2...Rt(N>0mi$oNRn
)rimero est el (N> "e una persona y lue$o los (N> "e sus ami$os7 to"o separa"o
por tabula"ores7 se termina la lista "e ami$os "e una persona con un salto "e carro.
BB
VctorSanchez2 http://www.victorsanchez2.com
Si en la sucesi#n "e (N>s "e los ami$os hay un (N> no e5istente ,%ue no estaba en
el 6ichero "e personas/7 ese (N> se i$nora y se si$ue a"elante. Si el (N> "e la
persona ,el primer (N> "e ca"a lnea/ no e5ista en el 6ichero "e personas se i$nora
to"a la lnea.
#er fic!ero amigos.t$t
.4na vez car$a"os los "atos "e los 6icheros anteriores el pro$rama ejecutar un bucle
en el cual se po"rn ele$ir las si$uientes opciones:
a.?r"enar por nombre. Se crear una lista or"ena"a por nombre. Se enseOar por
pantalla y a continuaci#n se liberar la memoria "e "icha lista.
b.?r"enar por apelli"os. Se crear una lista or"ena"a por apelli"os. Se enseOar por
pantalla y a continuaci#n se liberar la memoria "e "icha lista.
c.?r"enar por e"a". Se crear una lista or"ena"a por e"a". Se enseOar por pantalla
y a continuaci#n se liberar la memoria "e "icha lista.
".?r"enar por (N>. Se crear una lista or"ena"a por (N>. Se enseOar por pantalla
y a continuaci#n se liberar la memoria "e "icha lista.
e.:ostrar lista "e ami$os. Se mostrar para ca"a persona la lista "e sus ami$os.
6.Eliminar persona. El pro$rama pe"ir i"enti6icar a la persona a borrar por me"io
"el (N>7 recorrer la lista para buscar "icha persona y la eliminar "e "icha lista.
0simismo se "ebe comprobar las listas "e ami$os "e ca"a persona para ver si est
presente y eliminarlo "e "icha lista. Si hubiese ms "e una persona con el mismo
(N> se eliminaran to"as ellas.
$.Jerminar: se libera la memoria utiliza"a y se termina el pro$rama.
E/.rcici$ 2:
Este ejercico est compuesto "e B archivos:
*.ejer.h
2.lista.h
-.tipos.h
@.ejer.c
A.lista.c
B.main.c
*.ejer.h
)i,nde, 5E\E05Z
)de,ine 5E\E05Z
ESFA6- 3eter&ontenidos:LISFA * #lista =char * ar(%78= int ar(c;9
ESFA6- 3ostrar&ontenidos:LISFA * #lista;9
%oid Li"era&ontenido:%oid * #contenido;9
ESFA6- Im#rime&ontenido:%oid *#contenido;9
)endi,
2.lista.h
)i,nde, 5LISFA5Z
)de,ine 5LISFA5Z
BC
VctorSanchez2 http://www.victorsanchez2.com
)include Ati#os.hA /* 6onde en ti#os.h estan las de,iniciones de ESFA6-
y [--LEA?- */
/* &omieno de lista.h */
ty#ede, struct ?-6- >
%oid *in,o9 /*#untero a la in,ormaci_n :(eneral; */
struct ?-6- *ne<t9 /*#untero al si(uiente nodo */
C nodo9
ty#ede, nodo *LISFA9 /*declaraci_n del ti#o LISFA */
/* Esta ,uncion inicialia la lista a una lista %acVa */
%oid InicialiaLista:LISFA * lista;9
/* Indica si la lista est` %acVa o no.*/
[--LEA?- ListaVacia:LISFA * lista;9
/* Esta ,uncion o"tiene memoria #ara un nodo de la lista= lo inicialia y
de%uel%e error si no hay memoria #ara el nue%o nodo. */
ESFA6- -"tener?odo:nodo ** ##n;9
/* Esta ,uncion inserta en la lista el nodo elemento5actual delante del nodo
elemento5si(uiente. Si ya est dicho nodo en la lista de%uel%e error. */
ESFA6- InsertaElemento:LISFA * lista= nodo * elemento5actual=
nodo * elemento5si(uiente;9
/* Esta ,uncion elimina de la lista el elemento es#eci,icado. 6e%uel%e error
en el
caso de Hue dicho elemento no se encuentre en la lista. */
ESFA6- EliminaElemento:LISFA * lista= nodo * elemento5actual;9
/* Esta ,uncion im#rime #or #antalla el contenido de la lista en el orden en
el
Hue est`n los elementos en la lista. */
%oid Im#rimeLista:LISFA lista;9
/* Esta ,uncion es una modi,icacion de la anterior Hue im#rime tam"ien la
lista de ami(os. */
%oid Im#rimeListaEs#ecial:LISFA lista;9
/* Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los Hue %a
#asando.
6e%uel%e una lista %acVa. */
%oid Li"eraLista:LISFA * lista;9
/*Esta ,uncion "usca #or toda la lista un nodo y si lo encuntra nos da su
direccion. */
[--LEA?- E<iste?odo:LISFA * #lista= nodo * nodoa"uscar;9
/* Esta ,uncion se encar(a de "uscar el elemento anterior a uno dado */
ESFA6- [uscaUre%io:LISFA lista= nodo * elementoA"uscar=
nodo ** elementoAnterior;9
/*Esta ,uncion se encar(a de li"erar los nodos */
%oid Li"era?odo:nodo * #nodo;9
/* 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una lista */
ESFA6- 3eter&ontenido:LISFA * #lista= %oid *#untero;9
/* Ein de lista.h */
)endi,
B.
VctorSanchez2 http://www.victorsanchez2.com
-.tipos.h
)i,nde, 5FIU-S5Z
)de,ine 5FIU-S5Z
ty#ede, enum >
E00-0= [IE?
C ESFA6-9
ty#ede, enum >
SI= ?-
C [--LEA?-9
/* ,in del archi%o ti#os.h */
)endi,
@.ejer.c
)include *stdio.h+
)include *stdli".h+
)include *alloc.h+
)include Ati#os.hA
)include Alista.hA
)include AeSer.hA
/**********************************************************************
* Euncion: %oid Li"era&ontenido:%oid * #&ontenido;
*
* I?: Uuntero a %oid
* -GF:
* 3A.E: Li"era el contenido del #untero Hue se nos #asa.
*
**********************************************************************/
%oid Li"era&ontenido:%oid * #&ontenido;
>
,ree::%oid *; #&ontenido;9
#&ontenido @ ?GLL9
return9
C
/**********************************************************************
* Euncion: ESFA6- Im#rime&ontenido:%oid *#&ontenido;
*
* I?: Uuntero a %oid.
* -GF: [IE? si se ha #odido mostrar el contenido del #untero adecuadamente=
* E00-0 si el #untero #asado es nulo.
* 3A.E: 3uestra el contenido de un #untero a %oid Hue le #asemos.
*
**********************************************************************/
ESFA6- Im#rime&ontenido:%oid *#&ontenido;
>
i, :L#&ontenido;
return E00-09
,#rint,:stdout=ABtMsA=:char *; #&ontenido;9
return [IE?9
C
/**********************************************************************
* Euncion: ESFA6- 3ostrar&ontenidos:LISFA *#Lista;
*
* I?: Gn #untero a una lista dada.
BI
VctorSanchez2 http://www.victorsanchez2.com
* -GF: [IE? si hemos #odido mostrar el contenido de la lista= E00-0 si la
* lista esta"a %acia.
* 3A.E: 3uestra el contenido de una lista dada.
*
**********************************************************************/
ESFA6- 3ostrar&ontenidos:LISFA *#Lista;
>
i, :L#Lista;
return E00-09
Im#rimeLista:*#Lista;9

return [IE?9
C

/**********************************************************************
* Euncion: ESFA6- 3eter&ontenidos:LISFA * #Lista =char * ar(%78= int ar(c;
*
* I?: Uuntero a una lista= los ar(umentos y el numero de ar(umentos.
* -GF: [IE? si se han introducido los datos correctamente o E00-0 si ha
* ha"ido al(un #ro"lema.
* 3A.E: Introduce los ar(umentos dados #or el usuario en una lista.
*
**********************************************************************/
ESFA6- 3eter&ontenidos:LISFA *#Lista =char *ar(%78= int ar(c;
>
nodo *#?odo= *#Einal9
int i9
i, :L#Lista PP Lar(% ;
return E00-09
#Einal@*#Lista9
-"tener?odo:D#?odo;9
#?odo1+in,o @ :char *; ar(%7/89
*#Lista@#?odo9
#Einal@#?odo9
,or :i@39 i*@ ar(c9 IIi;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ :char *; ar(%7i1/89
InsertaElemento:#Lista=#?odo=#Einal;9
#Einal@#?odo9
C
return [IE?9
C
A.lista.c
)include Alista.hA
)include AeSer.hA
)include *stdio.h+
)include *stdli".h+
)include *alloc.h+
)include *strin(.h+
/**********************************************************************
* Euncion: %oid InicialiaLista:LISFA * lista;
*
* I?: Uuntero a una lista.
* -GF: ?ada.
* 3A.E: Inicialia la lista a una lista %acia.
*
**********************************************************************/
%oid InicialiaLista:LISFA *lista;
>
*lista @ ?GLL9
C+
VctorSanchez2 http://www.victorsanchez2.com
return9
C
/**********************************************************************
* Euncion: [--LEA?- ListaVacia:LISFA * lista;
*
* I?: Uuntero a una lista.
* -GF: 6e%ol%emos SI si la lista esta %acia= ?- en caso contrario.
* 3A.E: Indica si la lista esta %acia o no.
*
**********************************************************************/
[--LEA?- ListaVacia:LISFA *lista;
>
i, :*lista @@ ?GLL;
return SI9
return ?-9
C
/**********************************************************************
* Euncion: ESFA6- -"tener?odo:nodo ** ##n;
*
* I?: Uuntero a #untero a nodo.
* -GF: [IE? si se consi(ue reser%ar memoria correctamente= E00-0 si hay
* #ro"lemas
* 3A.E: 0eser%a memoria #ara un nodo de la lista y lo inicialia o
* de%uel%e error si no hay memoria #ara el nue%o nodo.
*
**********************************************************************/
ESFA6- -"tener?odo:nodo **##n;
>
i, :L##n;
return E00-09
i, ::*##n @ :nodo *; malloc:sieo,:nodo;;; @@ ?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,icienteBnA;9
return E00-09
C
:*##n;1+in,o @ ?GLL9
:*##n;1+ne<t @ ?GLL9
return [IE?9
C
/**********************************************************************
* Euncion: [--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar;
*
* I?: Uuntero a una lista donde
* tenemos Hue "uscar el nodo y un nodo= al cual
* de"emos "uscar uno similar y %er si e<iste o no.
* -GF: Si ya hay un nodo con los mismos datos de%ol%emos SI= de lo contrario
* de%ol%emos ?-.
* 3A.E: [usca #or toda la lista un nodo y si lo encuentra nos da su
* direccion.
*
**********************************************************************/
[--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar;
>
nodo *#?odo9
i, :L#Lista PP L?odoA[uscar;
return ?-9
i, :ListaVacia:#Lista; @@ SI;
return ?-9
#?odo @ *#Lista9
$hile :ListaVacia:D#?odo; @@ ?-;
>
C*
VctorSanchez2 http://www.victorsanchez2.com
i, :#?odo @@ ?odoA[uscar;
return SI9
#?odo @ #?odo1+ne<t9
C
return ?-9
C
/**********************************************************************
* Euncion: ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo
* *elemento5si(uiente;
*
* I?: Uuntero a la lista donde estan los datos y dos #unteros a nodo= el Hue
* %amos a insertar y el Hue estara a continuacion.
* -GF:
* 3A.E: Inserta en la lista el nodo elemento5actual delante del nodo
* elemento5si(uiente. Si ya esta dicho nodo en la lista de%uel%e
* error.
*
**********************************************************************/
ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo
*elemento5si(uiente;
>
i, :Llista PP Lelemento5actual PP Lelemento5si(uiente;
return E00-09
i, :ListaVacia:lista; @@ SI;
return E00-09
/* Si ya hay un nodo i(ual en la lista de%ol%eremos error. */
i, :E<iste?odo:lista= elemento5actual; @@ SI;
>
/* 3ostramos un mensaSe de error y la #ersona Hue lo ha #roducido. */
,#rint,:stderr=ABn-#eracion errronea con la lista= Intento de reutiliar
un nodo.BnA;9
return E00-09
C
/* Insertamos el nodo en la lista. */
elemento5actual1+ne<t @ elemento5si(uiente1+ne<t9
elemento5si(uiente1+ne<t @ elemento5actual9
return [IE?9
C
/**********************************************************************
* Euncion: ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual;
*
* I?: Uuntero a la lista donde estan los datos y el nodo Hue Hueremos
* eliminar
* -GF: 6e%ol%emos [IE? si todo ha ido correctamente= E00-0 si hemos
* encontrado al(un #ro"lema Hue nos im#ide eliminar el elemento.
* 3A.E: Elimina de la lista el elemento es#eci,icado. 6e%uel%e error en el
* caso de Hue dicho elemento no se encuentre en la lista.
*
**********************************************************************/
ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual;
>
nodo *#?odo @ ?GLL= *#?odo2 @ ?GLL9
i, :Llista PP Lelemento5actual;
return E00-09
/* 3iramos si el elemento esta al #rinci#io */
i, ::*lista; @@ elemento5actual;
>
*lista @ elemento5actual1+ne<t9
Li"era?odo:elemento5actual;9
return [IE?9
C
/* [uscamos des#ues */
i, :L[uscaUre%io:*lista= elemento5actual= D#?odo;;
C2
VctorSanchez2 http://www.victorsanchez2.com
>
,#rint,:stderr= ABnError en la "usHueda= im#osi"le el "orrado.BnA;9
return E00-09
C
i, :#?odo @@ ?GLL;
>
,#rint,:stderr= ABnElemento no encontrado= im#osi"le el "orrado.BnA;9
return E00-09
C
/* Si hemos encontrado el nodo en la lista lo eliminamos */
#?odo2 @ #?odo1+ne<t9
#?odo1+ne<t @ :#?odo1+ne<t;1+ne<t9
Li"era?odo:#?odo2;9
return [IE?9
C
/**********************************************************************
* Euncion: ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo
* *ElementoAnterior;
*
* I?: Gna lista con los datos= un #untero a nodo ElementoA[uscar del cual
* de%emos "uscar su elemento anterior.
* -GF: 6e%ol%emos E00-0 si no se #uede encontrar el elemento anterior= [IE?
* si se ha encontrado satis,actoriamente.
* 3A.E: Euncion Hue se encar(a de "uscar el elemento anterior a uno dado.
*
**********************************************************************/
ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo
**ElementoAnterior;
>
*ElementoAnterior@?GLL9
i, :Llista PP LElementoA[uscar;
return E00-09
i, :ElementoA[uscar @@ lista;
return E00-09
i, :ListaVacia:Dlista;@@SI;
return [IE?9
$hile :ListaVacia:Dlista1+ne<t; @@ ?-;
>
i, ::lista1+ne<t; @@ ElementoA[uscar;
>
*ElementoAnterior@lista9
return [IE?9
C
lista@lista1+ne<t9
C
*ElementoAnterior @ ?GLL9
return [IE?9
C
/**********************************************************************
* Euncion: %oid Li"era?odo:nodo *#?odo;
*
* I?: Uuntero a nodo del cual de"emos li"erar la memoria.
* -GF: ?ada= solo se li"era el #untero y se #one a ?GLL.
* 3A.E: Se encar(a de li"erar los nodos.
*
**********************************************************************/
%oid Li"era?odo:nodo *#?odo;
>
,ree:#?odo;9
#?odo @ ?GLL9
C
/**********************************************************************
C-
VctorSanchez2 http://www.victorsanchez2.com
* Euncion: %oid Im#rimeLista:LISFA lista;
*
* I?: Gna lista con los datos.
* -GF: 3uestra #or #antalla los datos Hue contiene.
* 3A.E: Im#rime #or #antalla el contenido de la lista en el orden en el Hue
* estan los elementos de la lista.
*
**********************************************************************/
%oid Im#rimeLista:LISFA lista;
>
$hile :ListaVacia:Dlista;;
>
Im#rime&ontenido:lista1+in,o;9
lista @ lista1+ne<t9
C
,#rint,:stdout= ABnA;9
return9
C
/**********************************************************************
* Euncion: %oid Li"eraLista:LISFA * lista;
*
* I?: Uuntero a lista.
* -GF: ?ada.
* 3A.E: Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los
* Hue %a #asando.
*
**********************************************************************/
%oid Li"eraLista:LISFA *lista;
>
nodo *#n9
#n @ *lista9
$hile :ListaVacia:lista; @@ ?-;
>
*lista @ #n1+ne<t9
Li"era?odo:#n;9
#n @ *lista9
C
return9
C
/**********************************************************************
* Euncion: ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero;
*
* I?: Uuntero a una lista y un #untero a %oid.
* -GF: [IE? si se mete el contenido correctamente= E00-0 si se encontrado
* al(un #untero nulo o no se ha #odido reser%ar memoria.
* 3A.E: 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una
* lista.
*
**********************************************************************/
ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero;
>
nodo *#n9
LISFA lista9
i, :L#Lista PP L#untero;
return E00-09
i, :L-"tener?odo:D#n;;
return E00-09
i, :ListaVacia:#Lista;@@SI;
>
*#Lista@#n9
#n1+in,o@#untero9
return [IE?9
C@
VctorSanchez2 http://www.victorsanchez2.com
C
lista@*#Lista9
$hile :ListaVacia:D:lista1+ne<t;; L@ SI;
lista@lista1+ne<t9
lista1+ne<t@#n9
#n1+in,o@#untero9
return [IE?9
C
B.main.c
/
******************************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
* 3aQe: Este #ro(rama reci"e como ar(umentos #or la linea de comandos una
* serie de cadenas de caracteres y las inserta en una lista enlaada.
* 6es#ues de esto recorre la lista #ara im#rimirlas #or #antalla.
*
*****************************************************************************/
)include Alista.hA
)include Ati#os.hA
)include AeSer.hA
)include *stdio.h+
%oid ayuda:%oid;9 /* 3uestra ayuda al usuario #ara introducir las cadenas */
LISFA lista@?GLL9
int main:int ar(c= char *ar(%78;
>
/* &om#ro"amos el numero de #arametros */
i, :ar(c @@ /;
>
ayuda:;9
return E00-09
C
/* 3etemos las cadenas */
i, :L3eter&ontenidos:Dlista= ar(%= ar(c;;
>
,#rint,:stderr=ABnError al insertar los contenidos BnA;9
return E00-09
C
/* 3ostramos los contenidos */
i, :L3ostrar&ontenidos:Dlista;;
>
,#rint,:stderr=ABnError al mostrar los contenidos BnA;9
return E00-09
C
/* Li"erar la lista */
Li"eraLista:Dlista;9

return [IE?9
C
/**********************************************************************
* Euncion: %oid ayuda:;
*
* I?:
* -GF:
CA
VctorSanchez2 http://www.victorsanchez2.com
* 3A.E: 3uestra un mensaSe de ayuda #ara Hue el usuario introduca los
* #arametros correctamente.
*
**********************************************************************/
%oid ayuda:;
>
,#rint,:stderr=ABnGso del #ro(rama: *eSecuta"le+ *cadena/+ *cadena2+ ...
BnA;9
C
E/.rcici$ ':
Este ejercico est compuesto "e B archivos:
*.lista.h
2.persona.h
-.tipos.h
@.lista.c
A.persona.c
B.main.c
*.lista.h
)i,nde, 5LISFA5Z
)de,ine 5LISFA5Z
)include Ati#os.hA /* En ti#os.h estan las de,iniciones de ESFA6- y
[--LEA?- */
/* &omieno de lista.h */
ty#ede, struct ?-6- >
%oid *in,o9 /* Uuntero a la in,ormacion :(eneral; */
struct ?-6- *ne<t9 /* Uuntero al si(uiente nodo */
C nodo9
ty#ede, nodo *LISFA9 /* 6eclaracion del ti#o LISFA */
/* Inicialia la lista a una lista %acia. */
%oid InicialiaLista:LISFA *lista;9
/* Indica si la lista esta %acia o no. */
[--LEA?- ListaVacia:LISFA *lista;9
/* -"tiene memoria #ara un nodo de la lista y lo inicialia o
de%uel%e error si no hay memoria #ara el nue%o nodo. */
ESFA6- -"tener?odo:nodo **##n;9
/* Inserta en la lista el nodo elemento5actual delante del nodo
elemento5si(uiente. Si ya esta dicho nodo en la lista de%uel%e error. */
ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo
*elemento5si(uiente;9
/* Elimina de la lista el elemento es#eci,icado. 6e%uel%e error en el
caso de Hue dicho elemento no se encuentre en la lista. */
ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual;9
/* Im#rime #or #antalla el contenido de la lista en el orden en el
CB
VctorSanchez2 http://www.victorsanchez2.com
Hue estan los elementos en la lista. */
%oid Im#rimeLista:LISFA lista;9
/* Esta ,uncion es una modi,icacion de la anterior Hue im#rime tam"ien la
lista de ami(os. */
%oid Im#rimeListaEs#ecial:LISFA lista;9
/* Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los Hue %a
#asando. */
%oid Li"eraLista:LISFA *lista;9
/* [usca #or toda la lista un nodo y si lo encuentra nos da su direccion. */
[--LEA?- E<iste?odo:LISFA * #Lista= nodo *?odoA[uscar;9
/* Esta ,uncion se encar(a de "uscar el elemento anterior a uno dado. */
ESFA6- [uscaUre%io:LISFA lista= nodo *elementoA"uscar= nodo
**elementoAnterior;9
/*Esta ,uncion se encar(a de li"erar los nodos. */
%oid Li"era?odo:nodo *#nodo;9
/* 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una lista */
ESFA6- 3eter&ontenido:LISFA *#lista= %oid *#untero;9
/* Ein de lista.h */
)endi,
2.persona.h
)i,nde, 5UE0S-?A5Z
)de,ine 5UE0S-?A5Z
)include Alista.hA
/* &omieno de #ersona.h */
/* estructura #ersona */
ty#ede, struct #ersona >
char *nom"re9
char *a#ellido9
int edad9
char 6?I7/289
LISFA ami(os9 /* El conSunto de ami(os de una #ersona es una lista */
C UE0S-?A9
/* lee de un ,ichero de te<to :una linea #or #ersona; y (enera la
lista enlaada con los datos leVdos= en el orden en el Hue ,i(ura"an
en el ,ichero. */
LISFA LeerUersonas:char *nom"reEichero;9
/* im#rime #or #antalla los datos de todas las #ersonas :sin incluir
la lista de ami(os;. */
%oid Im#rimirListaUersonas:LISFA lista;9
/* (enera una nue%a lista= en la cual los nodos est`n ordenados #or nom"re.
Los nue%os nodos de"en ser alocados dentro de esta ,unci_n= si "ien los
#unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo los mismos. */
LISFA -rdenarUor?om"re:LISFA lista;9
/* (enera una nue%a lista= en la cual los nodos est`n ordenados #or a#ellido.
Los nue%os nodos de"en ser alocados dentro de esta ,unci_n= si "ien los
#unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo los mismos. */
LISFA -rdenarUorA#ellido:LISFA lista;9
/* (enera una nue%a lista= en la cual los nodos est`n ordenados #or 6?I.
Los nue%os nodos de"en ser alocados dentro de esta ,uncion= si "ien los
#unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo los mismos. */
CC
VctorSanchez2 http://www.victorsanchez2.com
LISFA -rdenarUor6?I:LISFA lista;9
/* (enera una nue%a lista= en la cual los nodos est`n ordenados #or nom"re.
Los nue%os nodos de"en ser alocados dentro de esta ,unci_n= si "ien los
#unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo los mismos. */
LISFA -rdenarUorEdad:LISFA lista;9
/* li"era los nodos de una lista enlaada.*/
%oid Li"erarListaUersonas:LISFA *lista;9
/* Im#rime el contenido de una #ersona */
ESFA6- Im#rime&ontenido:%oid *contenido;9
/* Im#rime el contenido de una #ersona con sus ami(os */
ESFA6- Im#rime&ontenidoEs#ecial:%oid *contenido;9
/* Li"era una #ersona */
ESFA6- Li"eraUersona:%oid *contenido;9
/*[usca a una #ersona en una lista */
nodo *[uscaUersona:UE0S-?A * ##ersona= LISFA lista;9
/*0esuel%e de#endecias causadas #or la Amuerte de una #ersonaA */
ESFA6- 0esol%er6e#endencias:LISFA *#lista= UE0S-?A * ##ersona;9
/*-"tenemos memoria #ara una #ersona */
ESFA6- -"tenerUersona:UE0S-?A ** ###ersona;9
/*[usca a una #ersona #or su 6?I en una lista */
UE0S-?A *[usca6?IUersona:char *6?I= LISFA lista;9
/* lee de un ,ichero de te<to con las de#endencias de ami(os
= en el orden en el Hue ,i(ura"an en el ,ichero. */
ESFA6- LeerAmi(os:char *nom"reEichero= LISFA lista;9
/* im#rime #or #antalla los datos de todas las #ersonas :incluyendo
la lista de ami(os;. */
%oid Im#rimirListaAmi(os:LISFA lista;9
/* Este #roceso hace de ,rontend entre las ,unciones y el usuario */
ESFA6- Al(oritmo:LISFA *lista;9
/* [usca #osi"les errores en los 6?I */
ESFA6- ErroresLinea6?I:char *linea;9
/* [usca #osi"les errores en los datos de las #ersonas */
ESFA6- ErroresLineaUersonas:char *linea;9
)endi,
-.tipos.h
)i,nde, 5FIU-S5Z
)de,ine 5FIU-S5Z
ty#ede, enum >
E00-0= [IE?
C ESFA6-9
ty#ede, enum >
SI= ?-
C [--LEA?-9
/* ,in del archi%o ti#os.h */
)endi,
C.
VctorSanchez2 http://www.victorsanchez2.com
@.lista.c
)include Alista.hA
)include *stdio.h+
)include *stdli".h+
)include *alloc.h+
)include *strin(.h+
)include A#ersona.hA
/*********************************************************************
* Euncion: %oid InicialiaLista:LISFA * lista;
*
* I?: Uuntero a una lista.
* -GF: ?ada.
* 3A.E: Inicialia la lista a una lista %acia.
*
**********************************************************************/
%oid InicialiaLista:LISFA *lista;
>
*lista @ ?GLL9
return9
C
/*********************************************************************
* Euncion: [--LEA?- ListaVacia:LISFA * lista;
*
* I?: Uuntero a una lista.
* -GF: 6e%ol%emos SI si la lista esta %acia= ?- en caso contrario.
* 3A.E: Indica si la lista esta %acia o no.
*
**********************************************************************/
[--LEA?- ListaVacia:LISFA *lista;
>
i, :*lista @@ ?GLL;
return SI9
return ?-9
C
/*********************************************************************
* Euncion: ESFA6- -"tener?odo:nodo ** ##n;
*
* I?: Uuntero a #untero a nodo.
* -GF: [IE? si se consi(ue reser%ar memoria correctamente= E00-0 si hay
* #ro"lemas
* 3A.E: 0eser%a memoria #ara un nodo de la lista y lo inicialia o
* de%uel%e error si no hay memoria #ara el nue%o nodo.
*
**********************************************************************/
ESFA6- -"tener?odo:nodo **##n;
>
i, :L##n;
return E00-09
i, ::*##n @ :nodo *; malloc:sieo,:nodo;;; @@ ?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,icienteBnA;9
return E00-09
C
:*##n;1+in,o @ ?GLL9
:*##n;1+ne<t @ ?GLL9
return [IE?9
CI
VctorSanchez2 http://www.victorsanchez2.com
C
/*********************************************************************
* Euncion: [--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar;
*
* I?: Uuntero a una lista donde tenemos Hue "uscar el nodo y un nodo= al
cual
* de"emos "uscar uno similar y %er si e<iste o no.
* -GF: Si ya hay un nodo con los mismos datos de%ol%emos SI= de lo contrario
* de%ol%emos ?-.
* 3A.E: [usca #or toda la lista un nodo y si lo encuentra nos da su
direccion.
*
**********************************************************************/
[--LEA?- E<iste?odo:LISFA *#Lista= nodo *?odoA[uscar;
>
nodo *#?odo9
i, :L#Lista PP L?odoA[uscar;
return ?-9
i, :ListaVacia:#Lista; @@ SI;
return ?-9
#?odo @ *#Lista9
$hile :ListaVacia:D#?odo; @@ ?-;
>
/* Si los todos los datos son i(uales es Hue ya e<iste esa #ersona */
i, :
: :*:::UE0S-?A *;#?odo1+in,o;1+nom"re;; @@ :*:::UE0S-?A *;
?odoA[uscar1+in,o;1+nom"re;;; DD
: :*:::UE0S-?A *;#?odo1+in,o;1+a#ellido;; @@ :*:::UE0S-?A *;
?odoA[uscar1+in,o;1+a#ellido;;; DD
: : :::UE0S-?A *;#?odo1+in,o;1+edad;; @@ : :::UE0S-?A *;
?odoA[uscar1+in,o;1+edad;;; DD
: :*:::UE0S-?A *;#?odo1+in,o;1+6?I;; @@ :*:::UE0S-?A *;
?odoA[uscar1+in,o;1+6?I;;;
;
return SI9
#?odo @ #?odo1+ne<t9
C
return ?-9
C
/*********************************************************************
* Euncion: ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo
*elemento5si(uiente;
*
* I?: Uuntero a la lista donde estan los datos y dos #unteros a nodo= el Hue
* %amos a insertar y el Hue estara a continuacion.
* -GF:
* 3A.E: Inserta en la lista el nodo elemento5actual delante del nodo
* elemento5si(uiente. Si ya esta dicho nodo en la lista de%uel%e
error.
*
**********************************************************************/
ESFA6- InsertaElemento:LISFA *lista= nodo *elemento5actual= nodo
*elemento5si(uiente;
>
i, :Llista PP Lelemento5actual PP Lelemento5si(uiente;
return E00-09
i, :ListaVacia:lista; @@ SI;
return E00-09
/* Si ya hay un nodo i(ual en la lista de%ol%eremos error. */
i, :E<iste?odo:lista= elemento5actual; @@ SI;
>
/* 3ostramos un mensaSe de error y la #ersona Hue lo ha #roducido. */
.+
VctorSanchez2 http://www.victorsanchez2.com
,#rint,:stderr=ABn-#eracion errronea con la lista= Intento de reutiliar
un nodo.BnA;9
,#rint,:stderr=ABnMs Ms es un usuario ya e<istente. -mitimos la
re#eticion.BnA=
::UE0S-?A*;elemento5actual1+in,o;1+nom"re=
::UE0S-?A*;elemento5actual1+in,o;1+a#ellido;9
return E00-09
C
/* Insertamos el nodo en la lista. */
elemento5actual1+ne<t @ elemento5si(uiente1+ne<t9
elemento5si(uiente1+ne<t @ elemento5actual9
return [IE?9
C
/*********************************************************************
* Euncion: ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual;
*
* I?: Uuntero a la lista donde estan los datos y el nodo Hue Hueremos
* eliminar
* -GF: 6e%ol%emos [IE? si todo ha ido correctamente= E00-0 si hemos
* encontrado al(un #ro"lema Hue nos im#ide eliminar el elemento.
* 3A.E: Elimina de la lista el elemento es#eci,icado. 6e%uel%e error en el
* caso de Hue dicho elemento no se encuentre en la lista.
*
**********************************************************************/
ESFA6- EliminaElemento:LISFA *lista= nodo *elemento5actual;
>
nodo *#?odo @ ?GLL= *#?odo2 @ ?GLL9
i, :Llista PP Lelemento5actual;
return E00-09
/* 3iramos si el elemento esta al #rinci#io */
i, ::*lista; @@ elemento5actual;
>
*lista @ elemento5actual1+ne<t9
Li"era?odo:elemento5actual;9
return [IE?9
C
/* [uscamos des#ues */
i, :L[uscaUre%io:*lista= elemento5actual= D#?odo;;
>
,#rint,:stderr= ABnError en la "usHueda= im#osi"le el "orrado.BnA;9
return E00-09
C
i, :#?odo @@ ?GLL;
>
,#rint,:stderr= ABnElemento no encontrado= im#osi"le el "orrado.BnA;9
return E00-09
C
/* Si hemos encontrado el nodo en la lista lo eliminamos */
#?odo2 @ #?odo1+ne<t9
#?odo1+ne<t @ :#?odo1+ne<t;1+ne<t9
Li"era?odo:#?odo2;9
return [IE?9
C
/*********************************************************************
* Euncion: ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo
**ElementoAnterior;
*
* I?: Gna lista con los datos= un #untero a nodo ElementoA[uscar del cual
* de%emos "uscar su elemento anterior.
* -GF: 6e%ol%emos E00-0 si no se #uede encontrar el elemento anterior= [IE?
* si se ha encontrado satis,actoriamente.
* 3A.E: Euncion Hue se encar(a de "uscar el elemento anterior a uno dado.
*
.*
VctorSanchez2 http://www.victorsanchez2.com
**********************************************************************/
ESFA6- [uscaUre%io:LISFA lista= nodo *ElementoA[uscar= nodo
**ElementoAnterior;
>
*ElementoAnterior@?GLL9
i, :Llista PP LElementoA[uscar;
return E00-09
i, :ElementoA[uscar @@ lista;
return E00-09
i, :ListaVacia:Dlista;@@SI;
return [IE?9
$hile :ListaVacia:Dlista1+ne<t; @@ ?-;
>
i, ::lista1+ne<t; @@ ElementoA[uscar;
>
*ElementoAnterior@lista9
return [IE?9
C
lista@lista1+ne<t9
C
*ElementoAnterior @ ?GLL9
return [IE?9
C
/*********************************************************************
* Euncion: %oid Li"era?odo:nodo *#?odo;
*
* I?: Uuntero a nodo del cual de"emos li"erar la memoria.
* -GF: ?ada= solo se li"era el #untero y se #one a ?GLL.
* 3A.E: Se encar(a de li"erar los nodos.
*
**********************************************************************/
%oid Li"era?odo:nodo *#?odo;
>
,ree:#?odo;9
#?odo @ ?GLL9
C
/*********************************************************************
* Euncion: %oid Im#rimeLista:LISFA lista;
*
* I?: Gna lista con los datos.
* -GF: 3uestra #or #antalla los datos Hue contiene.
* 3A.E: Im#rime #or #antalla el contenido de la lista en el orden en el Hue
* estan los elementos de la lista.
*
**********************************************************************/
%oid Im#rimeLista:LISFA lista;
>
$hile :ListaVacia:Dlista;;
>
Im#rime&ontenido:lista1+in,o;9
lista @ lista1+ne<t9
C
,#rint,:stdout= ABnA;9
return9
C
/*********************************************************************
* Euncion: %oid Im#rimeListaEs#ecial:LISFA lista;
*
* I?: Gna lista con los datos.
* -GF: ?ada. 3uestra las #ersonas con sus ami(os.
* 3A.E: Esta ,uncion es una modi,icacion de la anterior Hue im#rime tam"ien
* la lista de ami(os.
.2
VctorSanchez2 http://www.victorsanchez2.com
*
**********************************************************************/
%oid Im#rimeListaEs#ecial:LISFA lista;
>
int i@/9
$hile :ListaVacia:Dlista;;
>
Im#rime&ontenidoEs#ecial:lista1+in,o;9
lista @ lista1+ne<t9
/* Vamos #arando la #antalla cada N #ersonas mostradas. */
i, : :iII M N; @@ 2;
>
,#rint,:stdout=ABnUulse enter #ara continuar.BnA;9
,(etc:stdin;9
C
C
,#rint,:stdout= ABnA;9
return9
C
/*********************************************************************
* Euncion: %oid Li"eraLista:LISFA * lista;
*
* I?: Uuntero a lista.
* -GF: ?ada.
* 3A.E: Esta ,uncion %a recorriendo la lista= li"erando los nodos #or los
Hue
* %a #asando.
*
**********************************************************************/
%oid Li"eraLista:LISFA *lista;
>
nodo *#n9
#n @ *lista9
$hile :ListaVacia:lista; @@ ?-;
>
*lista @ #n1+ne<t9
Li"era?odo:#n;9
#n @ *lista9
C
return9
C
/*********************************************************************
* Euncion: ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero;
*
* I?: Uuntero a una lista y un #untero a %oid.
* -GF:
* 3A.E: 3ete un nodo con el cam#o in,o a#untando a #untero al ,inal de una
* lista.
*
**********************************************************************/
ESFA6- 3eter&ontenido:LISFA *#Lista= %oid *#untero;
>
nodo *#n9
LISFA lista9
i, :L#Lista PP L#untero;
return E00-09
i, :L-"tener?odo:D#n;;
return E00-09
i, :ListaVacia:#Lista;@@SI;
>
*#Lista@#n9
.-
VctorSanchez2 http://www.victorsanchez2.com
#n1+in,o@#untero9
return [IE?9
C
lista@*#Lista9
$hile :ListaVacia:D:lista1+ne<t;; L@ SI;
lista@lista1+ne<t9
lista1+ne<t@#n9
#n1+in,o@#untero9
return [IE?9
C
A.persona.c
)include Alista.hA
)include A#ersona.hA
)include *stdio.h+
)include *stdli".h+
)include *math.h+
)include *cty#e.h+
)include *strin(.h+
)de,ine L-?X5?-3 52
)de,ine 3A45LE?XFZ /22N
)de,ine 3A45&A0A&FE0ES 32
)de,ine 3A45L-?X 52
)de,ine L-?XIFG6 /22
/*********************************************************************
* Euncion: %oid Im#rimirListaUersonas:LISFA lista;
*
* I?: Gna lista.
* -GF: Llama a la ,uncion Im#rimelista:lista; Hue mostrara la lista.
* 3A.E: Im#rime #or #antalla los datos de todas las #ersonas :sin incluir
* la lista de ami(os;.
*
**********************************************************************/
%oid Im#rimirListaUersonas:LISFA lista;
>
Im#rimeLista:lista;9
C
/*********************************************************************
* Euncion: %oid Im#rimirListaAmi(os:LISFA lista;
*
* I?: Gna Lista.
* -GF: Llama a la ,uncion Im#rimeListaEs#ecial Hue la mostrara con los
* ami(os.
* 3A.E: Im#rime #or #antalla los datos de todas las #ersonas :incluyendo
* la lista de ami(os.
*
**********************************************************************/
%oid Im#rimirListaAmi(os:LISFA lista;
>
Im#rimeListaEs#ecial:lista;9
C
/*********************************************************************
* Euncion: %oid Li"erarListaUersonas:LISFA *lista;
*
* I?:
* -GF:
* 3A.E: Li"era los nodos de una lista enlaada.
*
**********************************************************************/
.@
VctorSanchez2 http://www.victorsanchez2.com
%oid Li"erarListaUersonas:LISFA *lista;
>
$hile :ListaVacia:lista; L@ SI;
>
Li"eraUersona::*lista;1+in,o;9
:*lista; @ :*lista;1+ne<t9
C
Li"eraLista:lista;9
C
/*********************************************************************
* Euncion: ESFA6- Im#rime&ontenido:%oid *contenido;
*
* I?: Uuntero a %oid.
* -GF:
* 3A.E: Im#rime el contenido de una #ersona.
*
**********************************************************************/
ESFA6- Im#rime&ontenido:%oid *contenido;
>
UE0S-?A *#Uersona9
#Uersona @ :UE0S-?A *; contenido9
,#rint,:stdout= AMs BtMs BtMdBtMsBnA= #Uersona1+nom"re= #Uersona1
+a#ellido= #Uersona1+edad= #Uersona1+6?I;9
return [IE?9
C
/*********************************************************************
* Euncion: ESFA6- Im#rime&ontenidoEs#ecial:%oid *contenido;
*
* I?:
* -GF:
* 3A.E: Im#rime el contenido de una #ersona con sus ami(os.
*
**********************************************************************/
ESFA6- Im#rime&ontenidoEs#ecial:%oid *contenido;
>
UE0S-?A *#Uersona9
#Uersona @ :UE0S-?A *; contenido9
,#rint,:stdout= AMs BtMs BtMdBtMsBnA= #Uersona1+nom"re= #Uersona1
+a#ellido= #Uersona1+edad= #Uersona1+6?I;9
,#rint,:stdout= ASus Ami(os son: BnA;9
Im#rimeLista:#Uersona1+ami(os;9
,#rint,:stdout= ABnBnA;9
return [IE?9
C
/*********************************************************************
* Euncion: ESFA6- Li"eraUersona:%oid *contenido;
*
* I?:
* -GF:
* 3A.E: Li"era una #ersona.
*
**********************************************************************/
ESFA6- Li"eraUersona:%oid *contenido;
>
UE0S-?A *#Uersona9
#Uersona @ :UE0S-?A *; contenido9
,ree:#Uersona1+nom"re;9
,ree:#Uersona1+a#ellido;9
Li"eraLista:D:#Uersona1+ami(os;;9
.A
VctorSanchez2 http://www.victorsanchez2.com
return [IE?9
C
/*********************************************************************
* Euncion: nodo *[uscaUersona:UE0S-?A *#Uersona= LISFA lista;
*
* I?: Uuntero a una estructura de ti#o UE0S-?A y una lista.
* -GF: 6e%ol%emos la lista si se ha encontrado a la #ersona= ?GLL si
* no hemos encontrado a nadie.
* 3A.E: [usca a una #ersona en una lista.
*
**********************************************************************/
nodo *[uscaUersona:UE0S-?A *#Uersona= LISFA lista;
>
$hile :ListaVacia:Dlista; L@ SI;
>
i, :lista1+in,o @@ :UE0S-?A *; #Uersona;
return lista9
lista @ lista1+ne<t9
C
return ?GLL9 /* Si no se ha encontrado a la #ersona */
C
/********************************************************************
* Euncion: ESFA6- 0esol%er6e#endencias:LISFA *#Lista= UE0S-?A *#Uersona;
*
* I?: Uuntero a una lista y un #untero a una estructura de ti#o UE0S-?A.
* -GF: [IE? si todo ha ido correctamente= E00-0 si al(un #untero es ?GLL.
* 3A.E: 0esuel%e de#endecias causadas #or la Amuerte de una #ersonaA.
*
**********************************************************************/
ESFA6- 0esol%er6e#endencias:LISFA *#Lista= UE0S-?A *#Uersona;
>
nodo *#?odo @ ?GLL9
LISFA lista9
i, :L#Lista PP L#Uersona;
return E00-09
lista @ *#Lista9
$hile :ListaVacia:Dlista; L@ SI;
>
/* La #ersona Hue eliminamos %a a deSar de a#arecer en la lista
de ami(os de las #ersonas Hue le tu%iesen como ami(o */
#?odo @ [uscaUersona:#Uersona= ::UE0S-?A *; :lista1+in,o;;1+ami(os;9
i, :#?odo L@ ?GLL;
EliminaElemento:D:::UE0S-?A *; :lista1+in,o;;1+ami(os;= #?odo;9
lista @ lista1+ne<t9
C
return [IE?9
C
/*********************************************************************
* Euncion: LISFA -rdenarUor?om"re:LISFA lista;
*
* I?: Gna lista con los datos de todas las #ersonas.
* -GF: Gna nue%a lista con las #ersonas ordenadas #or nom"re.
* 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenador #or
* nom"re. Los nue%os nodos de"en ser alocados dentro de esta ,uncion=
* si "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir
* siendo los mismos.
*
**********************************************************************/
LISFA -rdenarUor?om"re:LISFA lista;
>
[--LEA?- continuar9
nodo *#?odo= *#nord9
.B
VctorSanchez2 http://www.victorsanchez2.com
LISFA listaordenada9
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
InicialiaLista:Dlistaordenada;9
/* 3etemos el #rimer elemento */
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
listaordenada @ #?odo9
lista @ lista1+ne<t9
/* &ontinuamos con los demas */
$hile :ListaVacia:Dlista; L@ SI;
>
#nord @ listaordenada9
continuar @ SI9
$hile :continuar @@ SI;
>
/* &om#ro"amos si estamos al #rinci#io y es menor */
i, ::#nord @@ listaordenada; DD
:strcm#: ::UE0S-?A *; :lista1+in,o;;1+nom"re=
::UE0S-?A *; :#nord1+in,o;;1+nom"re; * 2;;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
#?odo1+ne<t @ listaordenada9
listaordenada @ #?odo9
continuar @ ?-9
C
/* &om#ro"amos Hue no estemos al ,inal */
else i, :#nord1+ne<t @@ ?GLL;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
/* En los demas casos */
else i, :strcm#: ::UE0S-?A *; :lista1+in,o;;1+nom"re=
::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+ nom"re; * 2;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
#nord @ #nord1+ne<t9
C
lista @ lista1+ne<t9
C
return listaordenada9
C
/*********************************************************************
* Euncion: LISFA -rdenarUorA#ellido:LISFA lista;
*
* I?: Gna lista con los datos de todas las #ersona.
* -GF: Gna nue%a lista con las #ersonas ordenadas #or a#ellido.
* 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenados #or
* a#ellido. Los nue%os nodos de"en ser alocados dentro de esta
,uncion=
* si "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir
* siendo los mismos.
*
**********************************************************************/
LISFA -rdenarUorA#ellido:LISFA lista;
.C
VctorSanchez2 http://www.victorsanchez2.com
>
[--LEA?- continuar9
nodo *#?odo= *#nord9
LISFA listaordenada9
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
InicialiaLista:Dlistaordenada;9
/* 3etemos el #rimer elemento */
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
listaordenada @ #?odo9
lista @ lista1+ne<t9
/* Se(uimos con los demas */
$hile :ListaVacia:Dlista; L@ SI;
>
#nord @ listaordenada9
continuar @ SI9
$hile :continuar @@ SI;
>
/* &om#ro"amos si estamos al #rinci#io y es menor */
i, ::#nord @@ listaordenada; DD
:strcm# :::UE0S-?A *; :lista1+in,o;;1+a#ellido=
::UE0S-?A *; :#nord1+in,o;;1+a#ellido; * 2;;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
#?odo1+ne<t @ listaordenada9
listaordenada @ #?odo9
continuar @ ?-9
C
/* &om#ro"amos Hue no estemos al ,inal */
else i, :#nord1+ne<t @@ ?GLL;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
/* En los demas casos */
else i, :strcm#:::UE0S-?A *; :lista1+in,o;;1+a#ellido=
::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+a#ellido; * 2;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
#nord @ #nord1+ne<t9
C /* Ein: $hile :continuar @@ SI; */
lista @ lista1+ne<t9
C /* Ein: $hile :ListaVacia:Dlista; L@ SI; */
return listaordenada9
C
/*********************************************************************
* Euncion: LISFA -rdenarUor6?I:LISFA lista;
*
* I?: Gna lista con los datos de todas las #ersona.
* -GF: Gna nue%a lista con las #ersonas ordenadas #or 6?I.
* 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenados #or
* 6?I. Los nue%os nodos de"en ser alocados dentro de esta ,uncion= si
* "ien los #unteros a los Hue a#untan los cam#os in,o de"en se(uir
* siendo los mismos.
*
**********************************************************************/
..
VctorSanchez2 http://www.victorsanchez2.com
LISFA -rdenarUor6?I:LISFA lista;
>
[--LEA?- continuar9
nodo *#?odo= *#nord9
LISFA listaordenada9
,loat ,/= ,2= ,39 /* Uara com#arar los 6?I de di,erente lon(itud */
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
InicialiaLista:Dlistaordenada;9
/* 3etemos el #rimer elemento */
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
listaordenada @ #?odo9
lista @ lista1+ne<t9
/* Se(uimos con los demas */
$hile :ListaVacia:Dlista; L@ SI;
>
#nord @ listaordenada9
continuar @ SI9
i, :strlen:::UE0S-?A *; :lista1+in,o;;1+6?I; L@ strlen:::UE0S-?A *;
:#nord1+in,o;;1+6?I;;
>
$hile :continuar @@ SI;
>
,/ @ ato,:::UE0S-?A *; :lista1+in,o;;1+6?I;9
,2 @ ato,:::UE0S-?A *; :#nord1+in,o;;1+6?I;9
,3 @ ato,:::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+6?I;9
/* Si estamos al #rinci#io... */
i, ::#nord @@ listaordenada; DD :,/*,2;;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
#?odo1+ne<t @ listaordenada9
listaordenada @ #?odo9
continuar @ ?-9
C
else i, :#nord1+ne<t @@ ?GLL;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
else i, :,/ * ,3;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
#nord @ #nord1+ne<t9
C
C
$hile :continuar @@ SI;
>
/* &om#ro"amos si estamos al #rinci#io y es menor */
i, ::#nord @@ listaordenada; DD
:strcm# :::UE0S-?A *; :lista1+in,o;;1+6?I=
::UE0S-?A *; :#nord1+in,o;;1+6?I; * 2;;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
#?odo1+ne<t @ listaordenada9
listaordenada @ #?odo9
continuar @ ?-9
.I
VctorSanchez2 http://www.victorsanchez2.com
C
/* &om#ro"amos Hue no estemos al ,inal */
else i, :#nord1+ne<t @@ ?GLL;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
/* En los demas casos */
else i, :strcm#:::UE0S-?A *; :lista1+in,o;;1+6?I=
::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+6?I; * 2;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
#nord @ #nord1+ne<t9
C /* Ein: $hile :continuar @@ SI; */
lista @ lista1+ne<t9
C /* Ein: $hile :ListaVacia:Dlista; L@ SI; */
return listaordenada9
C
/*********************************************************************
* Euncion: LISFA -rdenarUorEdad:LISFA lista;
*
* I?: Gna lista con los datos de todas las #ersona.
* -GF: Gna nue%a lista con las #ersonas ordenadas #or edad.
* 3A.E: Xenera una nue%a lista= en la cual los nodos estan ordenados #or
edad.
* Los nue%os nodos de"en ser alocados dentro de esta ,uncion= si "ien
* los #unteros a los Hue a#untan los cam#os in,o de"en se(uir siendo
* los mismos.
*
**********************************************************************/
LISFA -rdenarUorEdad:LISFA lista;
>
[--LEA?- continuar9
nodo *#?odo= *#nord9
LISFA listaordenada9
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
InicialiaLista:Dlistaordenada;9
/* 3etemos el #rimer elemento */
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
listaordenada @ #?odo9
lista @ lista1+ne<t9
/* Se(uimos con los demas */
$hile :ListaVacia:Dlista; L@ SI;
>
#nord @ listaordenada9
continuar @ SI9
$hile :continuar @@ SI;
>
/* &om#ro"amos si estamos al #rinci#io y es menor */
i, ::#nord @@ listaordenada; DD :::UE0S-?A *; :lista1+in,o;;1+edad *
::UE0S-?A *; :#nord1+in,o;;1
+edad;;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
#?odo1+ne<t @ listaordenada9
listaordenada @ #?odo9
I+
VctorSanchez2 http://www.victorsanchez2.com
continuar @ ?-9
C
/* &om#ro"amos Hue no estemos al ,inal */
else i, :#nord1+ne<t @@ ?GLL;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
/* En los demas casos */
else i, :::UE0S-?A *; :lista1+in,o;;1+edad *
::UE0S-?A *; ::#nord1+ne<t;1+in,o;;1+edad;
>
-"tener?odo:D#?odo;9
#?odo1+in,o @ lista1+in,o9
InsertaElemento:Dlistaordenada= #?odo= #nord;9
continuar @ ?-9
C
#nord @ #nord1+ne<t9
C
lista @ lista1+ne<t9
C
return listaordenada9
C
/*********************************************************************
* Euncion: LISFA LeerUersonas:char *nom"reEichero;
*
* I?: ?om"re del ,ichero de donde de"emos leer los datos.
* -GF: Gna lista con los datos= o E00-0 si no lo hemos conse(uido.
* 3A.E: Lee de un ,ichero de te<to :una linea #or #ersona; y (enera la lista
* enlaada con los datos leidos= en el orden en el Hue ,i(ura"an en el
* ,ichero.
*
**********************************************************************/
LISFA LeerUersonas:char *nom"reEichero;
>
EILE *#tr9
char linea73A45LE?XFZ89
UE0S-?A *#Uersona9
nodo *#?odo= *#,inal9
LISFA lista9
i, :Lnom"reEichero;
return E00-09
/* A"rimos el archi%o #ara lectura */
#tr @ ,o#en:nom"reEichero= ArA;9
i, :L#tr;
>
,#rint,:stderr=ABnError al leer el archi%o dado= #or ,a%or re%ise rutas y
#ermisos.A;9
return E00-09
C
/* Sacamos la in,ormacion */
i, :,(ets:linea= 3A45LE?XFZ= #tr; @@ ?GLL;
return ?GLL9
/* [uscamos los #osi"les erroes Hue se #uedan #roducir en los datos */
ErroresLineaUersonas:linea;9
i, :L-"tenerUersona:D#Uersona;;
return ?GLL9
sscan,:linea= AMsBtMsBMdBtMsBnA=#Uersona1+nom"re= #Uersona1+a#ellido=
D#Uersona1+edad= #Uersona1+6?I;9
i, :-"tener?odo:D#?odo; @@ E00-0;
return ?GLL9
#?odo1+in,o @ #Uersona9
I*
VctorSanchez2 http://www.victorsanchez2.com
lista @ #?odo9
#,inal @ lista9
/* Sacamos los demas */
$hile :,(ets:linea= 3A45LE?XFZ= #tr; L@ ?GLL;
>
ErroresLineaUersonas:linea;9
i, :L-"tenerUersona:D#Uersona;;
return ?GLL9
sscan,:linea= AMsBtMsBMdBtMsBnA= #Uersona1+nom"re= #Uersona1+a#ellido=
D#Uersona1+edad= #Uersona1+6?I;9
i, :-"tener?odo:D#?odo; @@ E00-0;
return ?GLL9
#?odo1+in,o @ #Uersona9
InsertaElemento:Dlista= #?odo= #,inal;9
#,inal @ #?odo9
C
,close:#tr;9
return lista9
C
/*********************************************************************
* Euncion: ESFA6- -"tenerUersona:UE0S-?A **##Uersona;
*
* I?: Uuntero a #untero a una estructura de ti#o UE0S-?A.
* -GF: [IE? si se ha conse(uido reser%ar memoria= E00-0 si no #odemos.
* 3A.E: -"tenemos memoria #ara una #ersona.
*
**********************************************************************/
ESFA6- -"tenerUersona:UE0S-?A **##Uersona;
>
i, :L##Uersona;
return E00-09
i, ::*##Uersona @ :UE0S-?A *; malloc:sieo,:UE0S-?A;;; @@ ?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,iciente.BnA;9
return E00-09
C
i, :::*##Uersona;1+nom"re @ :char *; malloc:L-?X5?-3 * sieo,:char;;; @@
?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,iciente.BnA;9
return E00-09
C
i, :::*##Uersona;1+a#ellido @ :char *; malloc:L-?X5?-3 * sieo,:char;;; @@
?GLL;
>
,#rint,:stderr=ABnError al alocar memoria dinamica= #osi"lemente memoria
insu,iciente.BnA;9
return E00-09
C
InicialiaLista:D:*##Uersona;1+ami(os;9
return [IE?9
C
/*********************************************************************
* Euncion: UE0S-?A *[usca6?IUersona:char *6?I= LISFA lista;
*
* I?: 6?I de la #ersona y la lista donde de"emos "uscar.
* -GF: 6e%ol%emos la #ersona si la encontramos= ?GLL si no la hemos hallado.
* 3A.E: [usca a una #ersona #or su 6?I en una lista.
*
**********************************************************************/
UE0S-?A *[usca6?IUersona:char *6?I= LISFA lista;
>
I2
VctorSanchez2 http://www.victorsanchez2.com
i, :L6?I;
return ?GLL9
i, :ListaVacia:Dlista; @@ SI;
return ?GLL9
$hile :ListaVacia:Dlista; L@ SI;
>
/* Vamos com#arando el 6?I Hue nos dan con los de la lista */
i, :strcm#:6?I= ::UE0S-?A *; :lista1+in,o;;1+6?I; @@ 2;
return :UE0S-?A *; lista1+in,o9
lista @ lista1+ne<t9
C
,#rint,:stderr=ABnEl 6?I Ms no se encuentra en el archi%o de
#ersonas.A=6?I;9
,#rint,:stderr=ABn0e%ise el ,ichero si Huiere %er todo correctamente.BnA;9
return ?GLL9
C
/*********************************************************************
* Euncion: ESFA6- LeerAmi(os:char *nom"reEichero= LISFA lista;
*
* I?: ?om"re del ,ichero donde de"en estar los ami(os y una lista.
* -GF:
* 3A.E: Lee de un ,ichero de te<to con las de#endencias de ami(os en el
orden
* en el Hue ,i(ura"an en el ,ichero.
*
**********************************************************************/
ESFA6- LeerAmi(os:char *nom"reEichero= LISFA lista;
>
[--LEA?- continuar= ,inEichero @ ?-9
EILE *#tr9
char *linea= 6?I7/28= *#&har= *#Li"erador9
UE0S-?A *#Uersona @ ?GLL= *#Ami(o @ ?GLL9
linea @ :char *; malloc:3A45LE?XFZ * sieo,:char;;9
#Li"erador@linea9
/* A"rimos el archi%o #ara lectura. */
#tr @ ,o#en:nom"reEichero= ArA;9
i, :L#tr;
>
,#rint,:stderr=ABnError al leer el archi%o dado= #or ,a%or re%ise rutas y
#ermisos.A;9
,ree:#Li"erador;9
return E00-09
C
/* Sacamos la in,ormacion del archi%o. */
i, :,(ets:linea= 3A45LE?XFZ= #tr; @@ ?GLL;
,inEichero @ SI9
/* Vemos si hay errores en el 6?I y mostramos al usuario el corres#ondiente
mensaSe de alarma :sin terminar el #ro(rama; */
ErroresLinea6?I:linea;9
$hile :,inEichero L@ SI;
>
continuar @ ?-9
/* Sacamos el #rimer 6?I. */
i, ::#&har @ strchr:linea= JBtJ;; L@ ?GLL;
>
sscan,:linea= AMsBtA= 6?I;9
/* -"tenemos los ami(os */
linea @ #&har I /9
continuar @ SI9
C
/* [uscamos la #ersona a la Hue se re,iere. */
i, :continuar @@ SI;
i, ::#Uersona @ [usca6?IUersona:6?I= lista;; @@ ?GLL;
,#rint,:stderr=ABnSe omitira la lista de ami(os del 6?I erroneo.BnA;9
else
I-
VctorSanchez2 http://www.victorsanchez2.com
>
/* Actuamos con ella.*/
$hile ::#&har @ strchr:linea= JBtJ;; L@ ?GLL;
>
sscan,:linea= AMsBtA= 6?I;9
/* ?o #ueden tener el mismo 6?I la #ersona y el ami(o */
i, :*:#Uersona1+6?I; @@ *6?I;
>
,#rint,:stderr=ABnGna #ersona no #uede ser su #ro#io ami(o.A;9
,#rint,:stderr=ABnEl 6?I Ms es el mismo.A= 6?I;9
/*return E00-09*/
C
linea @ #&har I /9
i, ::#Ami(o @ [usca6?IUersona:6?I= lista;; L@ ?GLL;
i, :L3eter&ontenido:D:#Uersona1+ami(os;= :%oid *; #Ami(o;;
>
,#rint,:stderr=ABnError al alocar memoria dinamica.BnA;9
,ree:#Li"erador;9
return E00-09
C
C
/* Gltimo 6?I de la linea */
sscan,:linea= AMsBnA= 6?I;9
i, ::#Ami(o @ [usca6?IUersona:6?I= lista;; L@ ?GLL;
i, :L3eter&ontenido:D:#Uersona1+ami(os;= :%oid *; #Ami(o;;
>
,#rint,:stderr=ABnError al alocar memoria dinamica.BnA;9
,ree:#Li"erador;9
return E00-09
C
C
i, :,(ets:linea= 3A45LE?XFZ= #tr; @@ ?GLL;
,inEichero @ SI9
else
ErroresLinea6?I:linea;9
C /* Ein: $hile :,inEichero L@ SI; */
,ree:#Li"erador;9
,close:#tr;9
return [IE?9
C
/*********************************************************************
* Euncion: ESFA6- Al(oritmo:LISFA *lista;
*
* I?:
* -GF:
* 3A.E: Este #roceso hace de ,rontend entre las ,unciones y el usuario.
*
**********************************************************************/
ESFA6- Al(oritmo:LISFA *lista;
>
UE0S-?A *#Uersona9
char comando= 6?I7/28 @ AA= a#oyo7/28 @ AA9
nodo *#?odo9
LISFA listadea#oyo9
,#rint,:stdout= ABn&ommando :h #ara la ayuda; 1+BtA;9
,,lush:stdin;9
,(ets:Dcomando= L-?XIFG6= stdin;9 /* Leemos la o#cion del usuario */
,#rint,:stdout=ABnA;9
$hile ::comando L@ J^J; DD :comando L@ JHJ;;
>
i, :*lista @@ ?GLL; /* Si ya no e<iste nin(un nodo en la lista. */
>
,#rint,:stdout=ABnSe han eliminado todas las #ersonas de la lista.A;9
I@
VctorSanchez2 http://www.victorsanchez2.com
,#rint,:stdout=ABnIm#osi"le realiar mas o#eraciones.A;9
/* Ferminamos #orHue ya no #odemos hacer nin(una otra cosa. */
return [IE?9
C
s$itch :comando;
>
case JaJ:
case JAJ:
listadea#oyo @ -rdenarUor?om"re:*lista;9
Im#rimeLista:listadea#oyo;9
Li"eraLista:Dlistadea#oyo;9
"reaQ9
case J"J:
case J[J:
listadea#oyo @ -rdenarUorA#ellido:*lista;9
Im#rimeLista:listadea#oyo;9
Li"eraLista:Dlistadea#oyo;9
"reaQ9
case JcJ:
case J&J:
listadea#oyo @ -rdenarUorEdad:*lista;9
Im#rimeLista:listadea#oyo;9
Li"eraLista:Dlistadea#oyo;9
"reaQ9
case JdJ:
case J6J:
listadea#oyo @ -rdenarUor6?I:*lista;9
Im#rimeLista:listadea#oyo;9
Li"eraLista:Dlistadea#oyo;9
"reaQ9
case J#J:
case JeJ:
case JEJ:
Im#rimirListaAmi(os:*lista;9
"reaQ9
case J,J:
case JEJ:
,#rint,:stdout=ABnUor ,a%or introduca el 6?I de la #ersona a
eliminar1+A;9
,(ets:a#oyo= //= stdin;9
sscan,:a#oyo= AMsBnA= 6?I;9
/* [uscamos a al(uien con el 6?I dado */
i, ::#Uersona @ [usca6?IUersona:6?I= *lista;; @@ ?GLL;
,#rint,:stderr=ABn6?I no encontrado= ?adie ha sido
eliminadoBnA;9
else
>
$hile::#Uersona @ [usca6?IUersona:6?I= *lista;; L@ ?GLL;
>
/* -"tenemos el nodo de la #ersona */
i, ::#?odo @ [uscaUersona:#Uersona= *lista;; @@ ?GLL;
return E00-09
/* Eliminamos la #ersona de todos los lu(ares y nodos */
0esol%er6e#endencias:lista= #Uersona;9
i, :LEliminaElemento:lista= #?odo;;
return E00-09
,#rint,:stdout=ABn6?I encontrado= se eliminara a Ms MsBnA=
#Uersona1+nom"re= #Uersona1+a#ellido;9
i, :LLi"eraUersona::%oid *; #Uersona;;
>
,#rint,:stderr= ABnError= no se ha #odido eliminar a la
#ersona.A;9
return E00-09
IA
VctorSanchez2 http://www.victorsanchez2.com
C
C
C
"reaQ9
case JhJ:
case JZJ:
,#rint,:stdout=ABn-rdenar #or nom"re: JaJA;9
,#rint,:stdout=ABn-rdenar #or a#ellido: J"JA;9
,#rint,:stdout=ABn-rdenar #or edad: JcJA;9
,#rint,:stdout=ABn-rdenar #or 6?I: JdJA;9
,#rint,:stdout=ABnLista de ami(os: JeJA;9
,#rint,:stdout=ABnEliminar una #ersona: J,JA;9
,#rint,:stdout=ABnFerminar: JHJBnA;9
"reaQ9
de,ault:
,#rint,:stderr= ABn&omando incorrecto.BnA;9
C /* Ein: s$itch :comando; */
,#rint,:stdout= ABn&ommando :h #ara la ayuda; 1+BtA;9
,,lush:stdin;9
,(ets:Dcomando= L-?XIFG6= stdin;9
,#rint,:stdout=ABnA;9
C /* Ein: !hile... */
return [IE?9
C
/*********************************************************************
* Euncion: ESFA6- ErroresLineaUersonas:char *linea;
*
* I?:
* -GF:
* 3A.E: Este #roceso hace de ,rontend entre las ,unciones y el usuario.
*
**********************************************************************/
ESFA6- ErroresLineaUersonas:char *linea;
>
char nom"re73A45L-?X8= a#ellido73A45L-?X8= edad73A45L-?X8= dni73A45L-?X89
int i@29
/* [uscamos todos los errores #osi"les Hue #ueda ha"er en la linea */
sscan,:linea=AMs Ms Ms MsA= nom"re= a#ellido= edad= dni;9
i, :strlen:nom"re; + 3A45&A0A&FE0ES;
,#rint,:stderr=ABnEl nom"re Ms es demasiado lar(o.A=nom"re;9
i, :strlen:a#ellido; + 3A45&A0A&FE0ES;
,#rint,:stderr=ABnEl a#ellido Ms es demasiado lar(o.A=a#ellido;9
i, :strlen:edad; + 2;
,#rint,:stderr=ABnLa lon(u(itud de la edad Ms de"e estar entre / y
2A=edad;9
ErroresLinea6?I:dni;9
i, :edad @@ A2A;
,#rint,:stderr=ABnLa edad de una #ersona no #uede ser 2. 0e%ise el
,icheroA;9
,or :i@29 edad7i8 L@ JB2J9 iII;
>
i, :Lisdi(it:edad7i8;;
,#rint,:stderr=ABnLa edad Ms no es correcta.A= edad;9
C
return [IE?9
C
/*********************************************************************
* Euncion: ESFA6- ErroresLinea6?I:char *linea;
*
* I?:
* -GF:
* 3A.E: Este #roceso hace de ,rontend entre las ,unciones y el usuario.
IB
VctorSanchez2 http://www.victorsanchez2.com
*
**********************************************************************/
ESFA6- ErroresLinea6?I:char *linea;
>
int i@2= S@29
int &harErroneo@29
$hile ::linea7S8 L@ JBnJ; DD :linea7S8 L@ JB<2J;;
>
,or :i@2=S@S9 :linea7S8 L@ JBtJ;DD:linea7S8 L@ JBnJ;DD:linea7S8 L@ JB<2J;9
iII=SII;
>
i, :Lisdi(it:linea7S8;;
&harErroneoII9
C
i, :&harErroneo; /* Si se ha encontrado al(un caracter erroneo */
>
,#rint,:stderr=ABnSe han encontrado Md caracteres
erroneos=A=&harErroneo;9
,#rint,:stderr=ABnse omitiran los 6?I Hue no sean correctos.A;9
C
i, : :i L@ 7; DD :i L@ R; ;
>
,#rint,:stderr=ABnEl 6?I leido no tiene la lon(itud adecuada.A;9
,#rint,:stderr=ABn0e%ise el ,ichero #ara e%itar #ro"lemas.A;9
C
/* Saltamos el ta"ulador */
i, :linea7S8 @@ JBtJ;
SII9
&harErroneo @ 29 /* Inicialiamos #ara %ol%er a em#ear si es necesrio */
C
return [IE?9
C
B.main.c
/**********************************************************************
* Autor: Victor Sanche2
* !e": htt#://$$$.%ictorsanche2.com
* &orreo: %ictorsanche2'(mail.com
* 3aQe: Lee de un archi%o de te<to= el cual es reci"ido como un ar(umento
* Hue introduce el usuario= e inserta los datos de las di,erentes #ersonas
* dentro de una lista.
* El ,ormato del archi%o del Hue se leeran los datos es:
* nom"reBta#ellidoBtBedadBt6?IBn
* 6e un se(undo :#asado como ar(umento si(uiente al anterior; archi%o
* se leen los 6?I de las #ersonas a las cuales se le asi(naran los
* ami,os. El ,ormato es:
* 6?I5UersonaBt6?I5Ami(oBt6?I5Ami(o2...Bt6?I5Ami(o?Bn
* En #rimer lu(ar encontramos el 6?I de una #ersona y lue(o los 6?I de
* sus ami(os.
* El #ro(rama crea una lista en la Hue #odremos ordenar las #ersonas
* #or su nom"re= a#ellido= edad o 6?I. Fam"ien e<iste una o#cion #ara
* mostrar los ami(os de cada #ersona y otra #ara eliminar a al(uien
* escri"iendo su 6?I.
*
*************************************************************/
)include Alista.hA
)include A#ersona.hA
)include Ati#os.hA
)include *stdio.h+
%oid ayuda:%oid;9
LISFA lista @ ?GLL9
IC
VctorSanchez2 http://www.victorsanchez2.com
int main:int ar(c= char *ar(%78;
>
/* &om#ro"amos el numero de #arametros */
i, :ar(c L@ 3;
>
ayuda:;9
return E00-09
C
i, ::lista @ LeerUersonas:ar(%7/8;;@@?GLL;
>
,#rint,:stderr=ABnError al leer el archi%o de #ersonas= #or ,a%or
re%iselo.BnA;9
Li"erarListaUersonas:Dlista;9
return E00-09
C
i, :LLeerAmi(os:ar(%728= lista;;
>
,#rint,:stderr=ABnError al leer el archi%o de ami(os= #or ,a%or
re%iselo.BnA;9
Li"erarListaUersonas:Dlista;9
return E00-09
C
i, :LAl(oritmo:Dlista;;
>
,#rint,:stderr=ABnZa ocurrido un error (ra%e= se ,inaliara el
#ro(rama.BnA;9
Li"erarListaUersonas:Dlista;9
return E00-09
C
Li"erarListaUersonas:Dlista;9
return [IE?9
C
/**********************************************************************
* Euncion: %oid ayuda:;
*
* I?:
* -GF:
* 3A.E: 3uestra un mensaSe al usuario #ara Hue introduca correctamente
* los archi%os de las #ersonas y los ami(os.
*
**********************************************************************/
%oid ayuda:;
>
,#rint,:stderr=ABnGso del #ro(rama: *eSecuta"le+ *,ichero5#ersonas+
*,ichero5ami(os+.BnA;9
C
%stilo de programaci&n: %s especialmente importante el control de errores: es
'ustificable (ue un programa no admita )alores muy grandes de los datos* pero no es
'ustificable (ue el programa tenga un comportamiento an&malo con dic!os )alores. +or
e'emplo en el e'ercicio , podra comprobarse (ue el n-mero N no supere una cantidad
dada. lo err&neo sera (ue el usuario pusiese por e'emplo N/011111 y el programa
2cascase3 o se (uedase 3colgado3.
I.
VctorSanchez2 http://www.victorsanchez2.com
II

También podría gustarte