Realizar el ejercicio anterior utilizando Punteros

Documentos relacionados
ESTRUCTURAS DINÁMICAS DE DATOS (LISTAS)

ESTRUCTURAS DINÁMICAS DE DATOS (LISTAS)

LISTAS ENLAZADAS FUNDAMENTOS TEORICOS

ESTRUCTURAS DINÁMICAS DE DATOS (PILAS) EN C

ESTRUCTURAS DINÁMICAS DE DATOS (PILAS)

Instituto Politécnico Nacional

Universidad Autónoma del Estado de México 2016, Año del 60 Aniversario de la Universidad Autónoma del Estado de México

UNIVERSIDAD AUTONOMA DE MADRID ESCUELA POLITÉCNICA SUPERIOR ESTRUCTURAS DE DATOS Y ALGORITMOS

Estructuras de Datos Dinámicas

Estructura de Datos. Listas Enlazadas

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

WHILE Y DO WHILE BREAK EN LENGUAJE C. BUCLES MIENTRAS. FORZAR SALIDA O TERMINACIÓN. EJEMPLO (CU00534F)

Este material es de uso exclusivo para estudio, los textos fueron tomados textualmente de varios libros por lo que está prohibida su impresión y

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

ESTRUCTURAS DINÁMICAS DE DATOS EN LENGUAJE C

Codificación en C. Como pasar de Pseudocódigo a C (con pequeños trucos de C++)

Fundamentos de programación

TEMA 4. ESTRUCTURAS DE CONTROL

Estructuras Dinámicas

TEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ;

Programación I Funciones

Introducción al lenguaje C

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

Punteros. Programación en C 1

ESTRUCTURAS. Struct Identificador_ tipo_estructura { Tipo miembro_1; /*Declaración de los miembros*/

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

Actividad Algoritmos, Estructura y Programación I. FOR, DO-WHILE

EXAMEN PROGRAMACION I FEBRERO 2007

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Operadores aritméticos

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

TIPOS DE DATOS ABSTRACTOS

LENGUAJE. Tema 1 - Introducción

Listas. Programación en C LISTAS. Prof. Álvaro Sánchez Miralles. Programación en C. Listas. Objetivos

Estructuras de Datos Estáticas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos estáticas

Programación En Lenguaje C

Preprocesador de C. Ejemplo: ejecución de código dependiente de la máquina.

Dobles: Es el caso de la instrucción if-else (punto 1.2).

Punteros. Índice. 1. Qué es un puntero y por que son importantes.

Lección 3 Sentencias de control

Capítulo. Listas, pilas y colas en C. Contenido. Introducción

Definición de árbol. Árboles

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

PUNTEROS (APUNTADORES)

Estructuras Enlazadas AyED UTN-BA

Introducción al lenguaje C

Examen Principios de Programación Febrero 2012

1. Cuestiones. Ejercicios resueltos de C. Diego Rodríguez-Losada 1. //a) #include <stdio.h> main( ) { int x = 0, y = 0; //b) #include <stdio.

ALGORITMOS Y PROGRAMACIÓN I Unidad 3

Estructuración del programa en partes más pequeñas y sencillas

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Introducción al lenguaje C

Examen Teórico (1/3 de la nota final)

domingo, 24 de agosto de :28 a.m.

Descripción de un Programa

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo

Listas. Rafael Palacios May/2005

TEORÍA. definition TAG. PROPERTIES ID expr EXTENDS ID FIN_TAG. DELAYED : expr

Repaso de lenguaje C. Índice. Repaso de lenguaje C. Repaso de lenguaje C: Tipos básicos

Lenguaje C Bucles, Condicionales, operadores y Algoritmos.

ESTRUCTURAS DE CONTROL

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

SESIÓN DE EJERCICIOS E1

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

Elementos de un programa en C

Programación Estructurada

for(i = 0; i <= 45; i+=5) { x = (i*3.1416)/180; printf( seno(%d) = %f\n,i,seno(x));

Introducción a C. Grupo de Sistemas y Comunicaciones. Febrero 2008 C 1. Programación imperativa estructurada.

Lenguaje de Programación: C++ ARCHIVOS I/O

Es un lenguaje estructurado, tiene una abundante cantidad de operadores y tipos de datos.

Reales. Caracteres. Cadenas de Caracteres (String)

Principal material bibliográfico utilizado

2. Variables dinámicas

7.3. Estructura de un programa

Estructura de Datos. TDA: Listas. Primer Semestre, Indice. Tipos de estructura de datos lineales

Contenido. Capítulo 1. Introducción a lenguaje C 1

LISTAS. Prof. Ing. M.Sc. Fulbia Torres

6. El TDA Lista Implementación con listas enlazadas. es de tipo genérico T. Pueden existir elementos repetidos (a diferencia de los conjuntos).

Laboratorio de Arquitectura de Redes. Introducción al lenguaje C

Objetos y memoria dinámica

SESIÓN DE EJERCICIOS E1

TEMA 3: EL LENGUAJE C: PRESENTACIÓN

Estructuras de Decisión Múltiple

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Definición de estructuras. Estructuras, uniones y enumeraciones. Declaración. Definición y declaración. (struct, union y enum)

Programación en Lenguaje C

PUNTEROS EN C (APUNTADORES)

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C Sesión 1

Se guardan en archivos con extencion c y los cabezales con extension h

EJEMPLOS DE ESTRUCTURAS EN C

LABORATORIO 3 ESTRUCTURAS REPETITIVAS WHILE / DO WHILE

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

Funciones y paso de parámetros

TAD CONJUNTOS Y MULTICONJUNTOS

GUIÓN DE PRÁCTICAS 3: ESTRUCTURAS CONDICIONALES

int main() { //Obtenemos permiso acceso a la direccion de DATAPORT y las 2 siguientes if (ioperm(dataport, 3, 1)) {perror("ioperm"); return 1;}

Capitulo V Listas Enlazadas

Boletín de ejercicios de la asignatura de INFORMÁTICA para la realización de las prácticas de laboratorio. Ejercicios de Estructuras de Control

Sistemas Operativos Practica 1: procesos y concurrencia.

Transcripción:

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

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:

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.

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.

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.

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:

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.

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)

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

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();

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;

//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");