Bienvenidos a un nuevo curso. Ahora estoy en el ciclo de grado superior: Desarrollo de aplicaciones multiplataforma. Y voy a ser parte del experimento de la formación dual. Estaré haciendo practicas durante un año, y a la vez finalizando la formación.

Deseadme suerte.

miércoles, 21 de enero de 2015

Listas

0

Insertar al final de la lista
void insertarFin (struct nodo **L, struct info *x){
struct nodo *tmp;
struct nodo *aux;
tmp=(struct nodo *)malloc(sizeof(struct nodo));
tmp->siguiente=NULL;
if(*L==NULL) /* Lista vacía */
*L=tmp;
else { /* Lista con información */
aux=*L;
while (aux->siguiente !=NULL)
aux=aux->siguiente;
aux->siguiente=tmp;
}
}

Insertar en posición concreta (tras nodo determinado apuntado por p)
void insertarPos (struct nodo **L, struct nodo *p, struct info *x) {
struct nodo *tmp;
tmp=(struct nodo *)malloc (sizeof(struct nodo));
tmp->elemento=*x;
if (L==NULL){ /* Lista vacía */
tmp->siguiente=NULL;
*L=tmp;
}
else {
tmp->siguiente=p->siguiente;
p->siguiente=tmp;
}
}

Eliminar el elemento apuntado por p
void eliminar (struct nodo **L, struct nodo *p) {
struct nodo *tmp;
if (*L==p) /* Eliminar el primer elemento */
*L=p->siguiente;
else {
tmp=*L;
while (tmp->siguiente!=p)
tmp=tmp->siguiente;
/* tmp apunta al anterior */
tmp->siguiente=p->siguiente;
free(p);
}

Calcular el tamaño de una lista
int tamagno (struct nodo **L) {
int n;
struct nodo *tmp;
tmp=*L;
n=0;
while (tmp!=NULL) {
n++;
tmp=tmp->siguiente;
}
return (n);
}

Comentario sobre tamaño
Las EDD nos las creamos nosotros y podemos decidir implementarlas de muy diversas formas.
Si se va a utilizar de forma intensiva la función tamagno, se puede modificar la implementación para hacer que esta función sea más eficiente (ya que tener que recorrer cada vez que es llamada todos los elementos no resulta especialmente eficiente).
Podríamos, por ejemplo, guardar explícitamente información sobre el número de elementos, de tal manera que la lista en vez de ser un único puntero al primer elemento, sería un struct que tendría el número de elementos además del puntero al primer elemento.
En caso de optar por esta implementación, tendríamos que asegurarnos que esa información se actualiza adecuadamente cada vez que se inserta o borra un elemento, en las correspondientes funciones.
Localizar (el primer elemento de la lista, que tiene un campo entero igual a uno fijado)

struct nodo *localizar(struct nodo**L, int x) {
struct nodo *tmp;
tmp=*L;
while ((tmp!=NULL) && ((tmp->elemento).campo_x!=x))
tmp=tmp->siguiente;
return tmp;
}

C realiza una evualuación cortocircuitada. Es decir, si en el anterior while, por ejemplo, no se cumple la primera condición, no continúa examinando la segunda.
De otro modo, el anterior código reventaría porque si fuera NULL intentaría leer el siguiente elemento pasado NULL, dando un fallo de segmentación.

Ejemplo de utilización
main() {
struct info c;
struct nodo *Lista;
struct nodo *p;

Lista=NULL;

c.campo_x=5;
insertarPrincipio(&Lista, &c);

c.campo_x=12;
insertarFin(&Lista, &c);

/* Ver contenido */
p=Lista;
while (p!=NULL){
printf(“%d”,(p->elemento).campo_x);
p=p->siguiente;
}
p=Lista; /* Apunta a “5” */
p=p->siguiente; /* Apunta a “12” */
c.campo_x=56;
/* Voy a insertar tras “12” */
insertarPos(&Lista, p, &c);

p=Lista; /* Apunta a 5 */
p=p->siguiente; /* Apunta a 12 */;
/* Voy a eliminar “12” */
eliminar(&Lista, p);
}

Listas ordenadas
Si necesitamos una lista ordenada tenemos dos alternativas:
è Manejar una lista genérica y ordenarla cuando haga falta (usando algoritmos similares que para ordenar vectores). Se puede ofrecer una operación de ordenación.
è Mantener una lista ordenada siempre. Modificaciones necesarias:
· Insertar. Ya no hay que indicar la posición. La función deberá encargarse de insertar en la posición adecuada.
· Localizar. Podemos detener la búsqueda cuando encontremos un elemento mayor que el que buscamos.
Para llevar a cabo lo anterior, hay que tener en cuenta que mecanismo vamos a utilizar.

Ejemplo de aplicación de las listas
Almacenar un polinomio. En este caso podría ser útil una lista de estructura del siguiente tipo:

struct info {
int exponente;
float coeficiente;
}

0 comentarios:

Publicar un comentario

Etiquetas actuales

BD (67) DEF (64) PROG (64) SQL (44) Java (29) PRACTICAS (20) php (18) DI (16) PRESTASHOP (16) PROGRAMACIÓN WEB (16) HTML (13) SGE (12) ERP (9) CONSULTAS (8) css (8) Linux (5) XML (5) Android (4) PDM (4) C (3) NetBeans (3) PSP (3) SMARTY (3) comandos (3) HOOK (2) POST (2) XSD (2) cURL (2) JS (1) MEDIA-QUERYS (1) PDO (1) RESPONSIVE (1) TPL (1) TRADUCCIÓN (1) app_inventor (1)

Todas las etiquetas

EJER (78) BD (67) DEF (64) PROG (64) SQL (44) c# (40) Programación (39) Ficheros (36) Java (29) bases de datos (21) PRACTICAS (20) lenguajes de marcas (19) AD (18) Entorno de desarrollo (18) php (18) PROCEDIMIENTOS (17) DI (16) FORM (16) PRESTASHOP (16) PROGRAMACIÓN WEB (16) lenguaje C (16) E/R (14) HTML (13) SGE (12) Sistemas informáticos (10) ERP (9) CONSULTAS (8) TRANSACCIONES (8) TRIGGER (8) VISUAL BASIC (8) css (8) FUNCIONES (7) html5 (6) Ada (5) EXAMEN (5) Linux (5) XML (5) estructuras (5) Android (4) DISEÑO (4) INTERFAZ (4) LOG (4) OpenBravo (4) PDM (4) ACTUALIZAR (3) C (3) DIAGRAMA (3) Directorios (3) NEW (3) NOR (3) NetBeans (3) OLD (3) PSP (3) SMARTY (3) comandos (3) css3 (3) AISLAMIENTOS (2) C++ (2) CONTROLERRORES (2) ELIMINAR (2) HOOK (2) INSERTAR (2) INST (2) MULTITABLA (2) POST (2) RECURSIVIDAD (2) SUBCONSULTAS (2) VISTAS (2) XSD (2) cURL (2) punteros (2) AJENA (1) BLOQUEOS (1) Byte (1) CREACION (1) CRM (1) Configuración (1) Controles (1) Datos (1) GOTFOCUS (1) IMAGENES (1) INDICES (1) JS (1) Lenght (1) MEDIA-QUERYS (1) Mingw (1) MonoDeveloped (1) OPTIMISTA (1) PDO (1) PESIMISTA (1) RESPONSIVE (1) SPEAK (1) Scanner (1) Serializacion (1) Streams (1) System (1) TPL (1) TRADUCCIÓN (1) USUARIOS (1) UseSystemPasswordChar (1) app_inventor (1) char (1) examenes (1) libreoffice (1) make (1) redes (1)