Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2022-2023
Estructuras de Datos
Índice
Parte I. Tipos Abstractos de Datos y Algoritmia
Tema 3. Árboles.
Tema 4. Grafos.
2
IEEE spectrum popularity ranking
URJC-ED-Introducción
3
IEEE spectrum popularity ranking
URJC-ED-Introducción
4
RedMonk ranking
URJC-ED-Introducción 5
Índice Tiobe
URJC-ED-Introducción
6
Índice Tiobe
URJC-ED-Introducción
7
1.1 Normas de estilo
1.2 Repaso (rápido) de C
1.3 Punteros
1.4 Complejidad
URJC-ED-Introducción
8
Normas de estilo C
• Evitar varias instrucciones en una misma línea
• Tabular adecuadamente el anidamiento de sentencias. Evitar
escribir:
a=33; b++; c = a + b + 44;
if (precio>MAXIMO)
{
printf(“Es muy caro\n”);
}
URJC-ED-Introducción
9
Normas de estilo
• Las llaves de comienzo y fin de bloque es obligatorio que
aparezcan en una línea sin más sentencias:
- Correcto:
if (precio>MAXIMO)
{
printf(“Abusivo\n”);
}
- Incorrecto:
if (precio>MAXIMO) {
printf(“Abusivo\n”); }
URJC-ED-Introducción 10
Normas de estilo
* Dar nombres nemotécnicos a los identificadores que describan
lo mejor posible su cometido o lo que representan
(subprogramas y variables).
* Palabras reservadas: MINUSCULAS
URJC-ED-Introducción
11
Normas de estilo
* Identificadores: descriptivos y minúsculas
* Palabras separadas, unidas por _ o utilizando primer carácter
de la palabra sufija mayúscula o ambos
- nombre_archivo, nombreArchivo, nombre_Archivo
* Constantes: MAYUSCULAS
- IVA, PI, NUMERO_E,...
* Procedimientos y funciones: Empiezan por letra MINUS.
- busquedaBinaria, apilar, pilaVacia,...
* Tipos: Empezando por MAYUS.
-Pila, Elemento, IteradorVector, ...
URJC-ED-Introducción
12
Normas de estilo
* Módulos y Ficheros:
- Los nombres de programas y módulos (clases):
· Deben coincidir con los nombres de los ficheros que los contienen.
· Si hay más de una palabra en el nombre, el fichero separará las palabras por “_”
· Deben ir en minúsculas
lista.c, elemento_puntero_int.c,
iterador_vector.h, ...
URJC-ED-Introducción
13
Normas de estilo
* Módulos y Ficheros:
- Se recomienda que contengan una cabecera de identificación como esta:
/**
*
* Módulo: Nombre
* Fichero: ( ) Programa ( ) Espec. TAD ( ) Impl. TAD ( ) Otros
* Autor(es): Nombre(s)
* Fecha: Fecha de actualización
*
* Descripción:
* Breve descripción del módulo (párrafo corto)
*
*/
URJC-ED-Introducción
14
Normas de estilo
URJC-ED-Introducción
15
1.1 Normas de estilo
1.2 Repaso (rápido) de C
1.3 Punteros
1.4 Complejidad
URJC-ED-Introducción
16
Arrays en C
URJC-ED-Introducción
17
Arrays en C (cont.)
URJC-ED-Introducción
18
Registros en C (struct)
struct NombreRegistro
{
IdTipo1 idCampo1;
idTipo2 idCampo2;
...
idTipon idCampon;
};
NombreRegistro reg1; // Declaración de variable
URJC-ED-Introducción
19
Conceptos aprendidos: Registros (cont.)
struct Ficha
{
char* nombre;
int edad;
int float;
};
void main()
{
Ficha p;
// ...
printf(“%s %d %f”, p.nombre, p.edad, p.sueldo);
}
URJC-ED-Introducción
20
1.1 Normas de estilo
1.2 Repaso (rápido) de C
1.3 Punteros
1.4 Complejidad
URJC-ED-Introducción
21
Memoria dinámica y punteros
URJC-ED-Introducción
22
Punteros
URJC-ED-Introducción
23
Declaración de enteros en C
URJC-ED-Introducción
24
Declaración de punteros en C
URJC-ED-Introducción
25
El puntero a “ninguna parte”
URJC-ED-Introducción
26
Operaciones con punteros
URJC-ED-Introducción
27
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
URJC-ED-Introducción
28
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
URJC-ED-Introducción
29
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
Dir. Memoria: 38
i ?
URJC-ED-Introducción
30
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
Dir. Memoria: 90 38
p ? i ?
URJC-ED-Introducción
31
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
Dir. Memoria: 90 38
p i ?
URJC-ED-Introducción
32
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
Dir. Memoria: 90 38
p i 7
URJC-ED-Introducción
33
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
Dir. Memoria: 90 38
p 38 i 7
Se dice que “p apunta a i”
URJC-ED-Introducción 34
Ejemplo de operaciones con punteros
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
i = 7;
p = &i; // Asignar la dirección de la variable i a p.
*p = 3; // Cambiar el contenido de lo apuntado por p.
printf(“%d\n”,i); // Escribe el valor 3.
}
Dir. Memoria: 90 38
p 38 i 3
Se dice que “p apunta a i”
URJC-ED-Introducción 35
Ejemplo de “operación ilegal”
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
p = &i; // Asignar la dirección de la variable i a p
*p = 3; // Almacenar el valor 3 en la celda de memoria
// apuntada por p
URJC-ED-Introducción
36
Ejemplo de “operación ilegal”
#include <iostream>
#include <stdlib.h>
int main()
{
int i;
int* p;
p = NULL;
p = &i; // Asignar la dirección de la variable i a p
*p = 3; // Almacenar el valor 3 en la celda de memoria
// apuntada por p
int main()
{
// Decl. array de 5 enteros e inicialización.
int a[5] = {1, 2, 3, 4, 5};
int main()
{
// Decl. array de 5 enteros e inicialización.
int a[5] = {1, 2, 3, 4, 5};
int* b = a;
struct Registro
{
int dato;
int indice;
};
int main()
{
Registro r;
Registro* p;
printf("r.dato=%d\n“,r.dato);
printf("r.indice=%d\n“,r.índice);
} URJC-ED-Introducción
40
Operador “contenido” ->: struct
#include <stdio.h>
#include <stdlib.h>
struct Registro
{
int dato;
int indice;
};
int main()
{
Registro r;
Registro* p;
printf("r.dato=%d\n“,r.dato);
printf("r.indice=%d\n“,r.índice);
}
URJC-ED-Introducción 41
Ejercicio 1
int main()
{
int a, b;
int* pb;
a = 10;
pb = &a;
b = *pb;
printf(“%d %d”,a,b);
}
URJC-ED-Introducción
42
Ejercicio
int main()
{
int a, b;
int* pb;
a = 10;
pb = &a;
printf(“%d\n”,*pb);
*pb=7;
printf(“%d\n”,a);
}
URJC-ED-Introducción
43
Petición de nueva memoria dinámica
URJC-ED-Introducción
44
Semántica del procedimiento malloc
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
URJC-ED-Introducción
45
Semántica del procedimiento malloc
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
Dir. Memoria: 90
p ?
URJC-ED-Introducción
46
Semántica del procedimiento malloc
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
URJC-ED-Introducción
47
Liberación de memoria dinámica
URJC-ED-Introducción
48
Semántica del procedimiento free
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
URJC-ED-Introducción
49
Semántica del procedimiento free
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
Dir. Memoria: 90
p ?
URJC-ED-Introducción
50
Semántica del procedimiento free
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
URJC-ED-Introducción
51
Semántica del procedimiento delete
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p;
Dir. Memoria: 90
p
URJC-ED-Introducción
53
Nueva memoria dinámica: ARRAYs
URJC-ED-Introducción
54
Liberación de m. dinámica: ARRAYs
URJC-ED-Introducción
55
Ejemplo malloc y free
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* a= (int*) malloc (3*sizeof(int));
*a = 1;
*(a+1) = 2;
*(a+2) = 3;
printf("a[0]= %d\n“,*a);
printf("a[2]= %d\n“,*(a+2));
URJC-ED-Introducción
57
Perdida de memoria (memory leak)
URJC-ED-Introducción
58
Error de acceso
URJC-ED-Introducción
59
Punteros en llamadas a subprogramas
int main()
int* f2(int a) {
{ int* p = f2(4);
int* q =
(*int)malloc(sizeOf(in printf(“%d”,*p);
t));
*q = 34; free(p);
return q; }
}
URJC-ED-Introducción 60
Punteros en llamadas a subprog. (II)
* El paso de punteros por valor equivale al paso por
referencia de la variable que apuntan.
– El subprograma recibe una copia del puntero y apunta a
la misma información que el original,
– Un cambio en esa información es un cambio en la
apuntada por el puntero original.
int main()
{
int* p; int i;
i = 2; p=&i;
ej3 (p);
}
URJC-ED-Introducción 61
Ejercicio
* ¿Qué valores escribe el programa?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c;
a = 2;
b = 3;
c = 4;
f(&a, b, c);
printf(“a= %d b=%d c=%d”,a,b,c);
}
URJC-ED-Introducción 62