Documente Academic
Documente Profesional
Documente Cultură
Operadores de estructuras
Operadores de estructuras
Operadores de estructuras
p
*p
(*p).x
(*p).y
p
p->x
p->y
Listas
n siguiente
Listas
Listas. NuevoElemento
Listas.InsertarDelante
Listas.InsertarDelante
n1
n2
ni
*cabeza
nuevo elemento
cabeza
10
Listas.InsertarDelante
n1
n2
ni
*cabeza
1
n
nuevo elemento
cabeza
11
Listas.InsertarDelante
n1
n2
ni
nuevo elemento
2
*cabeza
cabeza
12
Listas.InsertarDetras
void insertarDetras(struct lista **cabeza, int n)
{
struct lista *nuevo = NULL;
struct lista *aux = NULL;
/* se reserva espacio para el nuevo elemento */
nuevo = nuevoElemento();
nuevo->n = n;
Condicin de ltimo elemento de la lista. No lo
nuevo->sig = NULL;
hace el constructor y lo tenemos que hacer a mano
13
Listas.InsertarDetras
else /* se localiza el ltimo elemento para enlazarlo
al nuevo */
{
aux = *cabeza;
Esto nos servir
siempre que queramos
while(aux->sig != NULL)
recorrer la lista
{
aux = aux->sig;
}
aux->sig = nuevo;
}
}
Si utilizramos aux!=NULL no nos quedaramos con un puntero al ltimo elemento,
sino al ltimo puntero a NULL
14
Listas.InsertarDetras
Caso 1. Lista vaca
n
nuevo elemento
*cabeza
*cabeza
cabeza
cabeza
15
Listas.InsertarDetras
n1
n2
ni
n
nuevo elemento
*cabeza
cabeza
aux
Listas.RecorrerLista
void recorrerLista(struct lista *cabeza)
{
struct lista *aux = NULL;
aux = cabeza;
while (aux != NULL)
{
printf(" %d \n", aux->n);
aux = aux->sig;
}
}
Si utilizramos aux->sig!=NULL no escribiramos el ltimo elemento
17
Listas.RecorrerLista
n1
n2
cabeza
n1
ni
.....
ni
aux
n2
cabeza
.....
aux
18
Listas.BuscarElemento
int buscarElemento(struct lista *cabeza, int n)
{
int encontrado = 0;
struct lista *aux = NULL;
aux = cabeza;
/* Se recorre la lista hasta encontrar el elemento o hasta
llegar al final */
while (aux != NULL && encontrado ==0)
{
if (aux->n == n)
encontrado = 1;
else
aux = aux->sig;
}
return encontrado;
19
}
Listas.BuscarElemento
n1
n2
cabeza
.....
ni
aux
20
Listas.BorrarElemento
void borrarElemento(struct lista **cabeza, int n)
{
struct lista *ant = NULL; /* almacena el elemento
anterior al que se borra*/
struct lista *aux = NULL; /* almacena el elemento a
borrar */
aux = *cabeza;
/* Busqueda del elemento a borrar y su anterior */
while (aux->n != n)
{
Se presupone que el
ant = aux;
elemento est en la
aux = aux->sig;
lista
}
21
Listas.BorrarElemento
if (aux == *cabeza) /* el elemento a borrar es la
cabeza */
{
1 *cabeza = aux->sig;/*la nueva cabeza es el siguiente*/
2 free(aux); /* se libera la antigua cabeza */
}
else /* El elemento a borrar no es la cabeza */
{
3 ant->sig = aux->sig; /* Se enlaza el anterior con
el siguiente */
4 free(aux); /* se libera el nodo a borrar */
}
}
22
Listas.BorrarElemento
n1
n2
*cabeza
ni
aux
n1
n2
2
cabeza
Caso 1. El elemento a
borrar es la cabecera
aux
ni
1
*cabeza
cabeza
23
Listas.BorrarElemento
n1
n2
*cabeza
cabeza
n3
ant
ni
aux
Caso 2. El elemento a
borrar NO es la cabecera
24
Listas.BorrarElemento
n1
n2
n3
ni
4
*cabeza
cabeza
ant
aux
Caso 2. El elemento a
borrar NO es la cabecera
25
Listas.InsertarOrden
26
Listas.InsertarOrden
else{ /* lista no vaca */
aux = *cabeza;
if ( aux->n > n){ /* Se inserta delante de la cabeza */
1 nuevo->sig = *cabeza; /*siguiente a nuevo ser la cabeza */
*cabeza = nuevo; /* La nueva cabeza ser el nuevo elemento */
2}
else{ /* busqueda de la posicion de insercion*/
while (aux != NULL && encontrado == 0){
if (aux->n > n) /*posicion de insercion encontrada*/
{encontrado = 1;}
else{ /* se actualizan los valores de aux y ant */
{
ant = aux;
aux = aux->sig;
}
}//while
nuevo->sig = aux; 3
ant->sig = nuevo;
4
}//else
}//else
}
27
Listas.InsertarOrden
Caso 1. Lista vaca
nuevo elemento
*cabeza
*cabeza
cabeza
cabeza
28
Listas.InsertarOrden
n1=9
n2
n3
ni
*cabeza
3
nuevo elemento
cabeza
Listas.InsertarOrden
1
3
n1=9
n2
n3
ni
2
*cabeza
cabeza
Listas.InsertarOrden
n2=2
n1=1
n2=9
n3
ni
*cabeza
3
nuevo elemento
cabeza
Listas.InsertarOrden
4
n1=1
n2=2
3
3
n3 =9
ni
*cabeza
ant
cabeza
aux
Listas.RecorrerListaInverso
void recorrerListaInverso(struct lista
*elemento)
{
if (elemento != NULL)
{
recorrerListaInverso(elemento->sig);
printf(" %d \n", elemento->n);
}
}
33
Listas.BorrarLista
void borrarLista(struct lista **elemento)
{
if (*elemento != NULL)
{
borrarLista(&((*elemento)->sig));
free(*elemento);
}
}
34
Listas.BorrarLista
n1
n2
n3
n4
*elemento
35
Listas.BorrarLista
*elemento
n1
n2
n3
n4
elemento
Listas.BorrarLista
*elemento
n1
n2
n3
n4
elemento
37
Listas.BorrarLista
*elemento
n1
n2
n3
n4
elemento
Listas.BorrarElementoRecursivo
void borrarElementoRecursivo(struct lista **cabeza, int n)
{
struct lista *aux = NULL; /*elemento a borrar */
if ((*cabeza)->n != n)
{
borrarElementoRecursivo( &((*cabeza)->sig), n);
}
else
Se presupone que el elemento est
{
en la lista
aux = *cabeza; 1
*cabeza = aux->sig; 2
free (aux); 3
}
}
39
Listas.BorrarElementoRecursivo
n1
n2
n3
n4
*cabeza
40
Listas.BorrarElementoRecursivo
*cabeza
n1
n2
n3
ni
cabeza
En las llamadas sucesivas, al hacer &((*cabeza)->siguiente)
pasamos la direccin de memoria del puntero (*cabeza)->siguiente
41
Listas.BorrarElementoRecursivo
*cabeza
n1
n2
2
n3
3
ni
1
aux
cabeza
42
Listas.InsertarOrdenRecursivo
void insertarOrdenRecursivo(struct lista **cabeza,
int n)
{
struct lista *nuevo = NULL; /*nuevo elemento */
if (*cabeza == NULL) /* vacia o mayor que todos */
{
nuevo = nuevoElemento();
nuevo->n = n;
Se presupone que la lista ha sido
nuevo->sig = NULL;
previamente ordenada, o que todas
(*cabeza) = nuevo; 1
las inserciones se han hecho en orden
}
43
Listas.InsertarOrdenRecursivo
else
{
if ((*cabeza)->n > n)
{
nuevo = nuevoElemento();
nuevo->n = n;
nuevo->sig = (*cabeza); 2
*cabeza = nuevo;
3
}
else
{
insertarOrdenRecursivo( &((*cabeza)->sig), n);
}
}
}
44
Listas.InsertarOrdenRecursivo
9
11
13
*cabeza
15
nuevo elemento
cabeza
45
Listas.InsertarOrdenRecursivo
9
11
13
*cabeza
1
15
cabeza
46
Listas.InsertarOrdenRecursivo
*cabeza
9
11
13
10
nuevo elemento
cabeza
47
Listas.InsertarOrdenRecursivo
*cabeza
9
2
10
11
13
cabeza
48
Listas.OrdenarLista
Algoritmo de Seleccin
49
Otras implementaciones
Mediante vectores
struct lista
{
int utiles;
int elementos[LMAX];
};
utiles
0
LMAX-1
50
Otras implementaciones
Inconvenientes
51
Otras implementaciones
Listas doblemente enlazadas
struct lista{
int n;
anterior
n siguiente
52
Otras implementaciones
Listas doblemente enlazadas
Se suele hacer que la cabecera de una lista doblemente enlazada sea una celda
que complete el crculo es decir:
cab
Lista circular
53
Pilas
54
Pilas
Push(A)
Push(D)
Push(H)
Push(E)
Pop
Pila vaca
55
Pilas
struct pila
nombre sig
{
char nombre[20];
struct pila *sig;
};
56
Pilas.NuevoElemento.Apilar
struct pila * nuevoElemento()
{
return((struct pila *)malloc(sizeof(struct pila)));
}
void apilar(struct pila **cabeza, char *nombre)
{
struct pila *nuevo = NULL;
nuevo = nuevoElemento();
strcpy(nuevo->nombre, nombre);
nuevo->sig = *cabeza;
*cabeza = nuevo; 2
}
57
Pilas.Apilar
n1
n2
ni
1
n
nuevo elemento
2
*cabeza
cabeza
58
Pilas.Desapilar
void desapilar(struct pila **cabeza, char *nombre)
{
struct pila *aux1;
aux1 = *cabeza; 1
strcpy(nombre, (*cabeza)->nombre);
*cabeza = aux1->sig; 2
free (aux1); 3
}
Es un borrado por
delante en una lista!
59
Pilas.Desapilar
n1
3
n2
1
ni
2
*cabeza
aux
cabeza
60
Pilas.VerCima.Vacia
int vacia(struct pila *cabeza)
{
if (cabeza == NULL)
return 1;
return 0;
}
61
Colas
inserciones
borrados
62
Colas
struct cola
sig
int n;
struct cola *sig;
};
63
Colas.NuevoElemento.Contiene
struct cola *nuevoElemento()
{
return ((struct cola *)malloc(sizeof(struct
cola)));
}
int contiene(struct cola *cabeza)
{
if (cabeza == NULL)
return 0;
return 1;
}
64
Colas.InsertaCola
void insertarCola(struct cola **cabeza, int n)
{
struct cola *nuevo = NULL;
nuevo = nuevoElemento();
nuevo->sig = *cabeza;
nuevo->n = n;
*cabeza = nuevo;
}
65
Colas.InsertaCola
n1
n2
ni
nuevo elemento
*cabeza
cabeza
La insercin es delante
66
Colas.ExtraerCola
int extraerCola(struct cola **cabeza)
{
struct cola *penultimo = NULL;
int aux;
if (((*cabeza)->sig) == NULL){ /* Hay un
solo elemento */
aux = (*cabeza)->n;
free(*cabeza);
*cabeza = NULL;
return aux;
}
67
Colas.ExtraerCola
else{
penultimo = *cabeza;
while(penultimo->sig->sig != NULL)
penultimo = penultimo->sig;
aux = penultimo->sig->n;
free(penultimo->sig); /* se borra el
ultimo*/
penultimo->sig = NULL;
return aux;
}
Es necesario
}
penltimo para poner
este valor a NULL
68
Colas.ExtraerCola
n1
*cabeza
cabeza
69
Colas.ExtraerCola
n1
n2
*cabeza
ni
penultimo
cabeza
Caso 2. Hay ms de un
elemento. Se borra el ltimo
70