Post on 21-Jul-2020
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
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:
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.
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.
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.
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:
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.
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
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
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
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
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
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
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
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
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
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)
{
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
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();
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;
}
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");
}
}