Está en la página 1de 5

/* Programacin en Sistemas. TAREA 2. Flores Vicente Flor Nallely */ #include<stdio.h> #include<stdlib.

h> /*Definicin de la estructura*/ struct NODO{ int dato; struct NODO *siguiente, *anterior; }; typedef struct NODO tipo_nodo; typedef tipo_nodo *punt_nodo; /*Prototipos de funciones*/ punt_nodo inserta_principio(punt_nodo lista, int dato); punt_nodo inserta_final(punt_nodo lista, int dato); punt_nodo inserta_ordenado_iterativo (punt_nodo lista, int dato); punt_nodo inserta_ordenado_recursivo(punt_nodo lista, int dato); punt_nodo borra_lista(punt_nodo lista); void imprime_lista(punt_nodo lista); /*Programa principal*/ int main() { punt_nodo nodo_inicial; nodo_inicial = NULL; printf("Insertando datos al principio (1, 0).\n"); nodo_inicial = inserta_principio(nodo_inicial, 1); nodo_inicial = inserta_principio(nodo_inicial, 0); imprime_lista(nodo_inicial); printf("\nInsertando datos al final (99).\n"); nodo_inicial = inserta_final(nodo_inicial, 99); imprime_lista(nodo_inicial); printf("\nInsertando datos ordenados de manera iterativa (4, 2, 0).\n"); nodo_inicial = inserta_ordenado_iterativo(nodo_inicial, 4); nodo_inicial = inserta_ordenado_iterativo(nodo_inicial, 2); nodo_inicial = inserta_ordenado_iterativo(nodo_inicial, 0); imprime_lista(nodo_inicial); printf("\nInsertando datos ordenados de manera recursiva (23, 100).\n"); nodo_inicial = inserta_ordenado_recursivo(nodo_inicial, 23);

nodo_inicial = inserta_ordenado_recursivo(nodo_inicial, 100); imprime_lista(nodo_inicial); printf("\nLista final es:\n"); imprime_lista(nodo_inicial); printf("\nBorrando la lista:\n"); nodo_inicial = borra_lista(nodo_inicial); imprime_lista(nodo_inicial); printf("\n"); } /*Fin del programa principal*/

/*DESARROLLO DE LAS FUNCIONES*/ /****************************Inserta nodos ordenados de manera recursiva*************************/ punt_nodo inserta_ordenado_recursivo(punt_nodo lista, int dato) { punt_nodo nuevo, auxiliar; nuevo = (punt_nodo)malloc(sizeof(tipo_nodo)); nuevo->dato = dato; if(lista == NULL) /*Si la lista est vaca...*/ { nuevo->siguiente = nuevo->anterior = NULL; /*...Se inserta el primer nodo (e inicio de sta)... */ return nuevo; /*...Y regresamos a lista el valor de nuevo*/ } if(lista->dato >= nuevo->dato) /*En caso de que la lista no est vaca y nodo a insertar sea menor que el primero...*/ { nuevo->siguiente = lista; /*Enlazamos "nuevo" con lista (inicio de nuestra lista)...*/ nuevo->anterior = NULL; /*... y le indicamos a su miembro anterior que apunte a NULL*/ lista->anterior = nuevo;/*Enlazamos lista con nuevo*/ return nuevo; /*"nuevo" ahora es nuestro nuevo inicio*/ } lista->siguiente = inserta_ordenado_recursivo(lista->siguiente, dato); /*Invocamos de manera recursiva a la funcin y el valor que sta d, se le asignara a lista->siguiente*/ lista->siguiente->anterior = lista; return lista; } /*********************************Inserta Nodos Ordenados de Manera Iterativa*************************************************/

punt_nodo inserta_ordenado_iterativo(punt_nodo lista, int dato) { punt_nodo nuevo, aux; nuevo = (punt_nodo)malloc(sizeof(tipo_nodo)); nuevo->dato = dato; aux = lista; if(lista == NULL) /*Si la lista est vaca...*/ { nuevo->siguiente = NULL; nuevo->anterior = NULL; return nuevo; } if(lista->dato>=nuevo->dato)/*Segundo caso: nodo a insertar va al principio*/ { nuevo->siguiente = lista; nuevo->anterior = NULL; lista->anterior = nuevo; return nuevo; } for(aux=lista; aux != NULL; aux=aux->siguiente) /*Este for nos sirve para recorrer la lista e insertar el nodo en la posicin correcta*/ { if(aux->dato >= nuevo->dato) /*Si nodo a insertar se encuentra en un lugar distinto del inicio o el final de la lista...*/ { nuevo->siguiente = aux; aux->anterior->siguiente = nuevo; nuevo->anterior = aux->anterior; aux->anterior = nuevo; return lista; } else { if(aux->siguiente == NULL) /*Si nodo a insrtar debe de estar al final de la lista*/ { nuevo->anterior = aux; aux->siguiente = nuevo; nuevo->siguiente =NULL; return lista; } } } }

/***************************************Inserta nodos al Final de la Lista ************************************/ punt_nodo inserta_final(punt_nodo lista, int dato) { punt_nodo nuevo, aux; aux = lista; nuevo = (punt_nodo)malloc(sizeof(tipo_nodo)); nuevo->dato = dato; if(lista == NULL) /*Si la lista est vaca*/ { nuevo->siguiente = NULL; nuevo->anterior = NULL; return nuevo; } else { /*En otro caso...*/ while(aux -> siguiente != NULL) aux = aux->siguiente; nuevo->anterior = aux; aux->siguiente = nuevo; nuevo->siguiente = NULL; return lista; } } /************************Inserta Nodos al Principio de una Lista **************************/ punt_nodo inserta_principio(punt_nodo lista, int dato) { punt_nodo nuevo; nuevo = (punt_nodo)malloc(sizeof(tipo_nodo)); nuevo->dato = dato; if(lista == NULL) /*Si la lista est vaca*/ { nuevo->siguiente = NULL; nuevo->anterior = NULL; return nuevo; } else /*En otro caso...*/ { nuevo->siguiente = lista; /*"nuevo" pasa a ser nuestro nuevo inicio*/ nuevo->anterior = NULL; /*...Buscamos el final de la lista*/

return nuevo; } } /******************************Borra una Lista***************************************/ punt_nodo borra_lista(punt_nodo lista) { if(lista == NULL) { printf("Lista vaca. No se puede borrar ningn elemento.\n"); return NULL; } else { printf("Borrando elemento.\n"); lista->siguiente = borra_lista(lista->siguiente); /*Se llama recursivamente a la funcin, para ir borrando elemento tras elemento */ free(lista); return lista->siguiente; } } /***************************Imprime una lista**************************************/ void imprime_lista(punt_nodo lista) { if(lista == NULL) printf("Lista vaca. No hay nada que imprimir\n"); else { while(lista != NULL) { printf("%d-->", lista->dato); lista=lista->siguiente; } } }