El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias)...

35
El lenguaje de programaci´ on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos Esta colecci´ on de transparencias forma parte del contenido del libro “Dise˜ no de Software con C y UNIX (Volumen 1)”, J.Miranda (1996), con ISBN 84-87526-45-4. 18 de febrero de 2004

Transcript of El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias)...

Page 1: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

(Transparencias)

(C) Javier Miranda 1996-2004Reservados todos los derechos

Esta coleccion de transparencias forma parte del contenidodel libro “Diseno de Software con C y UNIX (Volumen 1)”,

J.Miranda (1996), con ISBN 84-87526-45-4.

18 de febrero de 2004

1

Page 2: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 1

Historia

1965: Multics (MIT, General Electric, Laboratorios Bell).

1968: Thompson desarrolla Unix para DEC PDP-7 (8k, sin software).

1969: Thompson crea B.

1970: Thompson continua desarrollo de Unix sobre DEC PDP-11 (24k).

1971: Unix comienza a tener usuarios. Thompson desarrolla de NB.

1973: Creacion de C. Thompson reescribe Unix en C. Instala C en otras

arquitecturas.

1978: The C programming language. Kernighan, Ritchie. Johnsondesarrolla pcc.

1979: Johnson desarrolla lint.

1983: Creacion comite para creacion del estandar de C.

1989: C se convierte en estandar ISO/IEC 9899-1990

1986: Stroustrup crea C++.

Page 3: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 2

El compilador de C

Preprocesador

Compilador

Ensamblador

Ficherofuente

Otros ficheros

(include)

Ficheroobjeto

Ficheroejecutable

EnlazadorBibliotecasdel sistema

Ficherosobjeto delusuario

Page 4: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 3

El preprocesador de C

#undef#define NUM 15

.

.

.#undef NUM#define NUM 34

#define

* Macros simples

* Macros con parámetros

#define TOTAL 2*NUM/4

#define NUM 15

#define MENSAJE "El lenguaje C"

#define INTERCAMBIA(X,Y) {\\ int tmp = X;\\ X=Y;\\ Y=X;}

* Operador #

/* Numero de elementos */

#define ESCRIBE(X) printf(#X "=%d",X)

Page 5: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 4

El preprocesador de C

Compilación condicional(#if #ifdef #ifndef #else #elif #endif)

#define DEBUG 1

...

int distancia(...){ ...#if DEBUG printf(...);#endif ...}

int OUT(...){#ifdef INTEL ...#endif#ifdef VAX ...#endif...}

...#define INTEL

#line#line 300 "PRUEBA.PAS"......#line 301

#include#include "fichero.h"

#include <fichero.h>

Page 6: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 5

Introduccion

/* Ejemplo de introduccion a la programacion en C */

#include <stdio.h>

int Suma (a,b)

int a,b;

{ int tmp;

tmp = a + b;

return tmp;

}

void Resta(a,b,Resultado)

int a,b;

int *Resultado;

{

*Resultado = a - b;

}

int main()

{ int a,b = 0;

int Respuesta;

scanf("%d %d", &a, &b);

Respuesta = Suma(a,b);

printf("La suma de %d y %d es %d ", a, b, Respuesta);

Resta(a, b, &Respuesta);

printf("y la resta es %d\n", Respuesta);

exit (0);

}

Page 7: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 6

Tipos de datos y constantes

Tipos de datos

char

int

float

double

cualificadoresshortlongunsigned

Constantes

string

int

decimal

octal

hexadecimal

charascii

hexadecimal

float

Salto de línea \n

Tabulador horizontal

Tabulador vertical

Retorno de carro (CR)

Salto de página (FF)

Alarma

(LF)

\t

\v

\r

\f

\a

Barra invertida \\

Interrogación \?

Apóstrofo \’

Comillas \"

Secuencias de escape

octal

Page 8: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 7

Operadores

Operadores

Aritméticos + − * / %

Relacionales

Expresión condicional

Autoincremento, autodecremento ++ −−

Lógicos&& ||

nivel bits & | ^ << >> ~

!

< <= > >= == !=

AsignaciónMúltiple

Compuesta

a = b = c = d

a op= b

Operador coma e1 , e2

e1 ? e2 : e3

( ) [ ] −> .

* / %+ −

< <= > >=== !=

&^|

&&||?:

= += −= etc.,

Precedencia de operadores

<< >>

Asociatividad

! ~ ++ −− + − * & (tipo) sizeof()

Page 9: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 8

Ejemplo con operadores

main()

{ int a,b,c,d,e,max,abs;

char c;

a = - b + c * d / (e % f); /* Aritmeticos */

a = ((b > c) == (d <= e)); /* Relacionales */

a = ! ( (a && b) || c ); /* Logicos */

a = ~ ( (a & b) | c); /* Logicos nivel bit */

a++; /* Autoincremento */

b = ++a;

c = a++;

d = a--; /* Autodecremento */

a = b = c = d+e; /* Asignacion multiple */

a += 2; /* Asignacion compuesta */

a /= b + c;

max = (b>c) ? b : c ; /* Expresion condicional*/

abs = (a>0) ? a : -a ;

a = (b=2,c=3); /* Operador coma */

a = sizeof(b); /* Operador "sizeof()" */

c = (char) a; /* Conversion de tipos */

d = (int) c + d;

d = (int) (c+d);

}

Page 10: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 9

Control de flujo

Controlde flujo

if (expresión) sentencia[else sentencia]

*

switch (expresión) { case expresión−constante: sentencia } [ default: sentencia ]

{

}

*

while (expresión) sentencia

*

do sentenciawhile (expresión)

*

for (expresión−1; expresión−2; expresión−3) sentencia

*

break*

continue*

goto *

Page 11: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 10

Funciones

int f1(s) /* Formato K&R */

char s[];

{

float f2(int,float);

...

if (...)

return(0);

...

}

float f2(int a, float b) /* Formato ANSI-C */

{

...

if (a>0)

f2(a,b);

...

}

main()

{

...

}

Page 12: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 11

Variables

Fichero 1:

int a,b; /* Externa */

extern char c; /* Externa definida en otro fichero */

static char d; /* Estatica externa */

int f1() /* Externa */

{

int c; /* Automatica */

static char d; /* Interna estatica */

extern float e; /* Externa definida en otro fichero */

...

}

Fichero 2:

char c; /* Externa */

float e; /* Externa */

static int f2() /* Externa estatica */

{

register i; /* Registro */

...

{

int i; /* Automatica */

...

}

...

}

Page 13: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 12

EJEMPLO.ADA EJEMPLO.C

package ejemplo is

a,b,c:integer; int a,b,c;

static int d,e;

function f1(x,y:integer) int f1(int x,y)

return integer; {

... int aux;

end ejemplo; ...

}

package body ejemplo is

d,e:integer; static void p1(char z)

{

function f1(x,y:integer) ...

return integer is {

aux:integer; register i;

begin

... for (i=1;i<n;i++) {

end; ...

}

procedure p1(z:character) is }

begin ...

... }

for i in 1..N loop

...

end loop;

...

end;

end;

Page 14: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 13

Entrada/Salida

#include <stdio.h>

main()

{

char ch = \’{A}’;

char *p = &ch;

int n = 1234;

int m = 0;

float f = 3.1416;

char s1[50],s2[50],s3[50];

/* Entrada/Salida basica */

putchar(’\n’);

ch=getchar();

/* Entrada/Salida formateada */

printf("Entero %d, Octal %o, Hexadecimal %x, ",n,n,n);

printf("Caracter \’%c\’, ",ch);

printf("Doble %f, Puntero %p\n",f,p);

printf("Introduce un numero: ");

scanf("%d",&n);

ch=getchar();

printf("Correcto (S/N) ?");

ch=getchar();

sprintf(s1,"Pongo %d en la string",n);

sscanf(s1,"%s %d %s",s2,&n,s3);

printf("%s %d %s\n",s2,n,s3);

}

Page 15: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 14

Estructuras de datos

Sinonimo (alias)

typedef int longitud;

typedef char string;

...

int maxlen,auxlen; longitud maxlen,auxlen;

char nombre[20]; string nombre[20];

Enumerado

Declaracion

enum boolean {FALSE,TRUE};

enum meses {ENE = 1, FEB, MAR, ABR, MAY, JUN,

JUL, AGO, SEP, OCT, NOV, DIC };

enum escapes {NEWLINE = ’\n’, BACKSPACE = ’\b’};

boolean b;

meses tabla[23];

Acceso

b = FALSE;

tabla[12] = OCT;

Page 16: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 15

Estructuras de datos

Array

Declaracion

int a[25]

char s[]="123"; /*char s[]={’1’,’2’,’3’,’\0’}*/

int lista[3] = {12,4,-2};

int tabla[2][4] = { {1,2,3,4},

{5,6,7,8} };

Acceso

s[0]

lista[2]

tabla[i][j]

Page 17: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 16

Estructuras de datos

Estructura (Registro)

Declaracion

struct fecha {

int dia;

struct { int mes;

int id; int anyo;

char nombre[20]; }

struct {

int dia; struct info {

int mes; int id;

int anyo; char nombre[20];

} fecha_ingreso; struct fecha fecha_ingreso;

} x,empleados[30]; }

struct info x,empleados[30];

Acceso

x.id

empleados[i].nombre;

empleados[i].fecha_ingreso.dia

Page 18: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 17

Estructuras de datos

Union

union u_tag {

int i;

float f;

char c;

}

Campos de bit

#define INTERRUPCION 1 struct {

#define DMA 2 unsigned interrupcion :1;

#define MOTOR_ON 4 unsigned dma :1;

unsigned motor_on :1;

} control;

main() {

int control; main()

{

flags |= INTERRUPCION; control.interrupcion = 1;

flags &= ~DMA); control.dma = 0;

} }

Page 19: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 18

Punteros

void swap(px,py)

int *px,*py;

{

int tmp;

tmp = *px;

*px = *py;

*py = tmp;

}

main()

{

int x,y;

int *p1;

int *p2 = 0; /* NULL */

int **p3;

void swap();

x = 27;

p1 = &x;

y = *p1;

y = *p1 + 1;

printf("%d\n", *p1);

*p1 = 0;

*p1 += 1;

(*p1)++;

if (p2 != p1)

p2 = p1;

*p3 = p1;

swap(&y,*p3);

}

Page 20: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 19

Punteros: arrays y funciones

struct registro_persona {

char nombre[15];

int dia,mes,anyo;

}

void f(tabla);

int tabla[2][4]; /* int tabla[][4] o int(*tabla)[4] */

{

...

}

main()

{

struct registro_persona tabla[18];

struct registro_persona *ptr, aux;

int matriz[2][4];

int i;

int (*fnc)();

ptr = &tabla;

aux = *ptr;

aux = *(ptr+3); /* Cuidado con (*ptr+3) */

ptr++;

i = ptr->dia; /* (*ptr).dia */

f(matriz);

fnc = &f;

(*fnc)(matriz);

}

Page 21: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 20

Punteros: strlen()

strlen(s) /* VERSION 1 */

char s[];

{ int n;

for (n=0; s[n] != ’\0’; n++);

return(n);

}

strlen(s) /* VERSION 2 */

char *s;

{ int n;

for (n=0; *s != ’\0’; s++, n++);

return(n);

}

strlen(s) /* VERSION 3 */

char *s;

{ char *p = s;

while (*p != ’\0’) p++;

return(p-s);

}

strlen(s) /* VERSION 4 */

char *s;

{ char *p = s;

while (*p) p++;

return(p-s);

}

Page 22: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 21

Parametros lınea comandos

main(argc, argv) /* Version 1 */

int argc;

char *argv[];

{

int i;

for (i=1;i<argc;i++)

/* Procesar argv[i] */

}

main(argc, argv) /* Version 2 */

int argc;

char **argv;

{

while (--argc) {

/* Procesar *argv */

/* argv++ */

}

}

Page 23: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 22

Tratamiento de ficheros

#include <stdio.h>

main(int argc, char *argv[])

{

FILE *f1,*f2;

int c;

if (argc != 3) {

fprintf(stderr,"Sintaxis: copy origen destino\n");

exit(1);

}

if ( (f1 = fopen(argv[1],"r")) == NULL) {

fprintf(stderr,"ERROR: Fichero ’%s’ inexistente.",argv[1]);

exit(2);

}

if ( (f2 = fopen(argv[2],"w")) == NULL) {

fprintf(stderr,"ERROR:No puedo crear ’%s’.",argv[1]);

exit(2);

}

while ( (c= getc(f1)) != EOF )

putc(c,f2);

fclose(f1);

fclose(f2);

}

Page 24: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 23

Errores frecuentes de losprogramadores de C

1. Realizar una comparacion con =.

if (i=3) return 1;

else return 0;

2. Anidar comentarios.

/* Comento este fragmento de codigo

if (a==4) /* Si elijo la opcion 4 */

f(a);

*/

3. Anadir ; al final de una sentencia de control de flujo.

while (i<100);

s=s+a[i];

4. Indentar mal el programa.

if (a) if (a)

if (b) j = 1;

f(); k = 0;

else

g();

int* ptr1, ptr2;

5. Utilizar mal los operadores de autoincremento/autodecremento.

a[i++] = i++;

6. Equivocar el orden de evaluacion de expresiones.

if (fp=fopen(fichero,"r") == NULL)

return (NULL);

Page 25: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 24

Errores frecuentes de losprogramadores de C

7. Pasar el valor de una variable en vez de su direccion.

scanf("%d",i);

8. Sobrepasar el lımite de un array.

9. Confundir “\n” con’\n’.

10. Declarar mal los parametros de una funcion.

invertir(str)

{

char *str;

...

}

11. Especificar un directorio mediante .

fopen("~/datos.dat","r");

12. Utilizar un puntero sin haberle asignado memoria.

char *respuesta;

...

gets(respuesta);

Page 26: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 25

¿ Donde esta el error ?

Programa 1:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i;

for (i=0;i<10;i=i+1);

printf("i vale %d\n",i);

}

Programa 2:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i,numeros[10];

for (i=1;i<=10;i++)

numeros[i]=i;

for (i=1;i<=10;i++)

printf("numeros[%d]=%d\n", i, numeros[i]);

}

Page 27: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 26

¿ Donde esta el error ?

Programa 3:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i;

for (i=0;i<10;i=i+1)

if (i=2)

printf("i vale 2\n");

else

printf("i no vale 2\n");

}

Programa 4:

#include <stdio.h>

#include <stdlib.h>

main()

{

int i;

for (i=0;i<10;i=i+1)

switch (i) {

case 0: printf("i vale 0\n");

case 1: printf("i vale 1\n");

default: printf("i es mayor que 1\n");

}

}

Page 28: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 27

Programacion de estructuras de datosdinamicas con C

Existen dos formas de declarar el nodo:

• Metodo 1:

struct nodo {

int info;

struct nodo *siguiente;

}

• Metodo 2:

typedef struct nodo Nodo;

typedef Nodo *PtrNodo;

struct nodo {

int info;

PtrNodo siguiente;

};

Debe utilizarse la biblioteca stdlib (#include<stdlib>) para tener

acceso a:

void *malloc(int Numero_bytes)

void free(void *p)

Page 29: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 28

Pila (LIFO)

#define PILA_VACIA -99999

PtrNodo top = NULL;

void Push(int n)

{ PtrNodo p;

p = (PtrNodo) malloc (sizeof(Nodo));

p->info = n;

p->siguiente = top;

top = p;

}

int Pop()

{ int aux_n;

PtrNodo aux_p;

if (top) {

aux_n = top->info;

aux_p = top;

top = top->siguiente;

free(aux_p);

return(aux_n);

}

return(PILA_VACIA);

}

Page 30: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 29

Cola (FIFO)

#define COLA_VACIA -99999

PtrNodo primero, ultimo = NULL;

void Insertar(int n)

{ PtrNodo p;

p = (PtrNodo) malloc (sizeof(Nodo));

p->info = n;

p->siguiente = NULL;

if (!primero)

ultimo = primero = p;

else {

ultimo->siguiente = p;

ultimo = p;

}

}

int Extraer()

{ int n;

PtrNodo p_aux;

if (!primero)

return(COLA_VACIA);

else {

n = primero->info;

p_aux = primero->siguiente;

free(primero);

primero = p_aux;

if (!primero)

ultimo=NULL; /* La cola queda vacia */

return(n);

}

}

Page 31: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 30

Lista simplemente encadenada

PtrNodo primero=NULL;

void Insertar(int n)

{ PtrNodo aux_p, anterior, nuevo;

nuevo = (PtrNodo) malloc (sizeof(Nodo));

nuevo->info = n;

if (!primero) { /*Lista vacia*/

nuevo->siguiente=NULL;

primero = nuevo;

return;

} else {

anterior = NULL;

aux_p = primero;

while (aux_p) {

if (aux_p->info < n) { /*Busqueda*/

anterior = aux_p;

aux_p = aux_p->siguiente;

} else

if (!anterior) { /*Ins. principio*/

nuevo->siguiente = primero;

primero = nuevo;

return;

} else {

anterior->siguiente = nuevo; /*Ins. medio*/

nuevo->siguiente = aux_p;

return;

}

}

anterior->siguiente = nuevo; /* Ins. final */

nuevo->siguiente = NULL;

return;

}

}

Page 32: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 31

Lista simplemente encadenada

PtrNodo Buscar(int n,PtrNodo *anterior)

{ PtrNodo aux_p;

*anterior=NULL;

if (!primero) return(NULL);

aux_p = primero;

while (aux_p->info != n) {

*anterior = aux_p;

aux_p = aux_p->siguiente;

if (!aux_p) return(NULL);

}

return(aux_p);

}

int Borrar(int n)

{

PtrNodo aux_p,anterior;

aux_p = Buscar(n, &anterior);

if (!aux_p) return (0);

if (!anterior) { /*Era el primero*/

primero = aux_p->siguiente;

free(aux_p);

} else { /*No era el primero*/

anterior->siguiente = aux_p->siguiente;

free(aux_p);

}

return(1);

}

Page 33: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 32

Lista doblemente encadenada

PtrNodo primero, ultimo = NULL;

Insertar(int n)

{ PtrNodo aux_p, anterior, nuevo;

nuevo = (PtrNodo) malloc (sizeof(Nodo));

nuevo->info = n;

if (!primero) { /* Lista vacia /*

nuevo->izquierda = NULL;

nuevo->derecha = NULL;

primero = nuevo;

ultimo = nuevo;

return;

}

aux_p = primero;

while(aux_p)

if (aux_p->info < n)

aux_p = aux_p->next;

else

if (aux_p == primero) { /* Ins. al principio */

nuevo->izquierda = NULL;

nuevo->derecha = primero;

primero->izquierda = nuevo;

primero = nuevo;

return;

} else { /* Ins. en medio */

nuevo->izquierda = aux_p->izquierda;

nuevo->derecha = aux_p;

aux_p->izquierda = nuevo;

nuevo->izquierda->derecha=nuevo;

return;

}

ultimo->derecha = nuevo; /* Ins. al final */

nuevo->izquierda = ultimo;

nuevo->derecha = NULL;

ultimo = nuevo;

return;

}

Page 34: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 33

Arbol binario

Recorrido in order iterativo

void r_in_order (PtrNodo p)

{

PtrNodo PILA[MAX_NODOS];

do {

while (p) {

Push(p);

p=p->left;

}

p=Pop;

visitar(p);

p=p->right;

} while (PILA<>{0});

}

Recorrido in order recursivo

void r_in_order (PtrNodo p)

{

if (p->left)

r_in_order(p->left);

printf("%d ",p->info); /*Visitar(p)*/

if (p->right)

r_in_order(p->right);

}

Page 35: El lenguaje de programaci on C (Transparencias) · El lenguaje de programaci on C (Transparencias) (C) Javier Miranda 1996-2004 Reservados todos los derechos ... Bibliotecas del sistema

El lenguaje de programacion C

18 de febrero de 2004Transp. 34

Arbol binario

int Insertar(int n)

{ PtrNodo padre,nuevo,aux_p;

int dir;

nuevo = (PtrNodo) malloc (sizeof(Nodo));

nuevo->info = n;

nuevo->izquierda = NULL;

nuevo->derecha = NULL;

if (!raiz) { /*Arbol vacio*/

raiz = nuevo;

return(1);

}

aux_p = raiz;

do {

if (n == aux_p->info)

free(nuevo);

return(0); /*clave duplicada*/

else {

padre=aux_p;

if (n < aux_p->info) {

aux_p = aux_p->izquierda;

dir=0;

} else {

aux_p = aux_p->derecha;

dir=1;

}

}

} while (aux_p);

if (dir == 0)

padre->izquierda=nuevo;

else

padre->derecha=nuevo;

return(1);

}