Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una...

21
Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba” Facultad / Programa Ingeniería / Telecomunicaciones e Informática Asignatura Estructura de Datos Profesor Ing. Eduard Antonio Lozano Córdoba Semestre / Periodo IV / Julio/09 Noviembre/09 PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar mediante la indexación de un arrays, se puede realizar también con punteros. Para clarificar lo expuesto, analicemos el siguiente programa, realizado meramente con arrays. #include "stdio.h" void main( ) { int lista[] = {24, 30, 15, 45, 34}; int ind; for (ind = 0; ind < 5; ind++) printf("%d ", lista[ind]); } En este ejemplo se ha utilizado la indexación del arrays para acceder a sus elementos; expresión lista[ind]. Cuando C interpreta esta expresión sabe que a partir de la dirección de comienzo del arrays (a partir de lista) tiene que avanzar ind elementos para acceder al contenido del elemento especificado por ese índice. Nota: Realizar el ejercicio anterior utilizando Punteros

Transcript of Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una...

Page 1: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

PUNTEROS Y ARRAYS

En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

mediante la indexación de un arrays, se puede realizar también con punteros.

Para clarificar lo expuesto, analicemos el siguiente programa, realizado meramente con arrays.

#include "stdio.h"

void main( )

{

int lista[] = {24, 30, 15, 45, 34};

int ind;

for (ind = 0; ind < 5; ind++)

printf("%d ", lista[ind]);

}

En este ejemplo se ha utilizado la indexación del arrays para acceder a sus elementos; expresión

lista[ind]. Cuando C interpreta esta expresión sabe que a partir de la dirección de comienzo del

arrays (a partir de lista) tiene que avanzar ind elementos para acceder al contenido del elemento

especificado por ese índice.

Nota:

Realizar el ejercicio anterior utilizando Punteros

Page 2: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

OPERACIONES BASICAS CON LISTAS

1. Insertar un elemento en una lista.

2. Borrar un elemento de una lista.

3. Recorrer los elementos de una lista.

4. Borrar todos los elementos de una lista.

5. Buscar un elemento en una lista.

Partiendo de las declaraciones:

typedef struct datos

{

int dato;

struct datos *siguiente;

} telemento;

INSERCIÓN DE UN ELEMENTO AL COMIENZO DE LA LISTA

Supongamos una lista lineal apuntada por c. Para insertar un elemento al principio de la lista,

primero se crea el elemento y después se reasignan los punteros, tal como se indica a

continuación:

Page 3: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

El orden en el que se realizan estas operaciones es esencial. El resultado es

Este concepto nos sugiere cómo crear una lista. Para ello, y partiendo de una sta vacía, no

tenemos más que repetir la operación de insertar un elemento al comienzo de una lista.

Veámoslo a continuación:

Notar que el orden de los elementos en la lista, es el inverso del orden en el que han llegado.

Page 4: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

INSERCIÓN DE UN ELEMENTO EN GENERAL

La inserción de un elemento en la lista, a continuación de otro elemento cualquiera apuntado por

p, es de la forma siguiente:

La inserción de un elemento en la lista antes de otro elemento apuntado por p, se hace

insertando un nuevo elemento detrás del elemento apuntado por p, inter-cambiando

previamente los valores del nuevo elemento y del elemento apuntado por p.

Page 5: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

BORRAR UN ELEMENTO DE LA LISTA

Para borrar el sucesor de un elemento apuntado por p, las operaciones a realizar son las

siguientes

Observe que para acceder a los miembros de un elemento, éste tiene que estar apuntado por un

puntero. Por esta razón, lo primero que hemos hecho ha sido apuntado el elemento a borrar por p.

Page 6: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Para borrar un elemento apuntado por p, las operaciones a realizar son las siguientes:

La sentencia *p = *q copia el contenido de la estructura apuntada por q, miembro a miembro, en

la estructura apuntada por p.

RECORRIDO DE UNA LISTA

Supongamos que hay que realizar una operación con todos los elementos de una lista, cuyo

primer elemento está apuntado por c. Por ejemplo, escribir el valor de cada elemento de la lista.

La secuencia de operaciones es la siguiente

Borrar todos los elementos de una lista

Borrar todos los elementos de una lista equivale a liberar la memoria ocupada por cada uno de

los elementos de la misma. Supongamos que queremos borrar una lista, cuyo primer elemento

está apuntado por c. La secuencia de operaciones es la siguiente:

Page 7: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Observe que antes de borrar el elemento apuntado por q, hacemos que c apunte al siguiente

elemento, porque si no perderíamos el resto de la lista; la referenciada por q-> siguiente.

BUSCAR EN UNA LISTA UN ELEMENTO CON UN VALOR X

La búsqueda es secuencial y termina cuando se encuentra el elemento, o bien, cuando se llega

al final de la lista.

Observe el orden de las expresiones que forman la condición del bucle while. Sabemos que en

una operación AND, cuando una de las expresiones es falsa la condición ya es falsa, por lo que

el resto de las expresiones no necesitan ser evaluadas. De ahí que cuando q valga NULL, la

expresión q->dato no tiene sentido que sea evaluada. En el caso de que fuera evaluada sería

interpretada como un valor cero.

Page 8: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 9: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 10: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 11: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 12: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 13: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 14: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 15: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 16: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

Page 17: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

EJERCICIO COMPLETO

#include "stdio.h"

#include <stdlib.h>

typedef struct datos

{

int dato;

struct datos *siguiente;

} telemento;

void error(void)

{

perror ("error: Insuficiente espacio en memoria");

exit(1);

}

telemento *NuevoElemento ( )

{

telemento *q = (telemento *)malloc(sizeof (telemento));

if(!q) error();

return(q) ;

}

int menu(void);

void anadir (telemento **, int);

void borrar (telemento **, int);

telemento *buscar(telemento *, int);

void visualizar(telemento *);

void main ( )

{

telemento *cabecera = NULL;

telemento *q;

int opcion, dato;

//int actual, anterior;

while (1)

{

opcion = menu();

switch (opcion)

{

Page 18: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

case 1:

printf ("añadir dato: ");

scanf ("%d", &dato);

anadir (&cabecera, dato);

break;

case 2:

printf ("borrar dato: ") ;

scanf ("%d" , &dato) ;

borrar (&cabecera, dato) ;

break;

case 3:

printf ("buscar dato: ") ;

scanf ("%d", &dato) ;

q = buscar(cabecera, dato);

if (q)

printf("El valor %d está en la lista\n", q->dato);

else

printf("El valor %d no está en la lista\n", dato);

break;

case 4:

visualizar ( cabecera ) ;

break;

case 5:

/* Liberar la memoria ocupada por 1a lista */

q = cabecera; /*q apunta al primer efemento de 1a lista*/

while (q!= NULL)

{

cabecera = cabecera->siguiente;

free (q) ;

q = cabecera;

}

return;

}

}

}

int menu ( )

{

int op = 0;

do

Page 19: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

{

printf ( " \n\t1. Añadir un elemento\n");

printf ( " \n\t2. Borrar un elemento\n");

printf ( " \n\t3. Buscar un elemento\n");

printf ( " \n\t4. Visualizar la lista\n");

printf (" \n\t5. Salir\n");

printf (" \n\t Elija la opción deseada " );

scanf("%d", &op);

//fflush (stdin);

}

while ( op < 1 || op > 5 );

return op;

}

/*

actual = anterior = cabecera;

while (actual != NULL && dato > actual->dato)

{

anterior = actual;

actual = actual->siguiente;

}

*/

/* Introducir un elemento ordenadamente en la lista */

void anadir(telemento **cab, int dato)

{

telemento *cabecera = *cab;

telemento *actual = cabecera, *anterior=cabecera, *q;

if (cabecera == NULL) /* Si está vacía, crear un elemento */

{

cabecera = NuevoElemento() ;

cabecera->dato = dato;

cabecera->siguiente = NULL;

*cab = cabecera;

return;

}

while (actual != NULL && dato > actual->dato)

{

anterior = actual;

actual = actual->siguiente;

}

q = NuevoElemento();

Page 20: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

if (anterior == actual)

{

q->dato = dato;

q ->siguiente = cabecera;

cabecera = q;

}

else

{

q->dato = dato;

q->siguiente = actual;

anterior->siguiente = q;

}

*cab = cabecera;

}

/* Encontrar un dato y borrarfo */

void borrar(telemento **cab, int dato)

{

telemento *cabecera = *cab;

telemento *actual = cabecera, *anterior=cabecera;

if (cabecera == NULL)

{

printf( "Lista Vacia\n" ) ;

return;

}

//* Entrar en fa fista y encontrar el elemento a borrar x/

while (actual != NULL && dato != actual->dato)

{

anterior = actual;

actual = actual->siguiente;

}

/* Si el dato no se encuentra, retornar x*/

if (actual == NULL) return;

/* Si el dato se encuentra, borrar el elemento */

if (anterior == actual) /* borrar el elemento de cabecera */

cabecera = cabecera->siguiente;

else // /x borrar un elemento no cabeceta */

anterior->siguiente = actual->siguiente;

free (actual);

*cab = cabecera;

}

Page 21: Nota: Realizar el ejercicio anterior utilizando Punteros€¦ · PUNTEROS Y ARRAYS En C existe una relación entre punteros y arrays tal que cualquier operación que se pueda realizar

Universidad UNIVERSIDAD TECNOLÓGICA DEL CHOCÓ “Diego Luís Córdoba”

Facultad / Programa Ingeniería / Telecomunicaciones e Informática

Asignatura Estructura de Datos

Profesor Ing. Eduard Antonio Lozano Córdoba

Semestre / Periodo IV / Julio/09 – Noviembre/09

//Buscar

telemento *buscar(telemento *cabecera, int dato)

{

telemento *actual = cabecera;

while (actual != NULL && dato != actual->dato)

actual = actual ->siguiente;

return (actual);

}

/* Visualizar Ia lista */

void visualizar (telemento *cabecera)

{

telemento *actual = cabecera;

if (cabecera == NULL)

printf ("Lista vacía\n" );

else

{

while (actual != NULL)

{

printf ( "%d ", actual->dato);

actual = actual->siguiente;

}

printf("\n");

}

}