void Insertar(Lista *lista, int v) { pNodo nuevo, anterior; /* Crear un nodo nuevo */ nuevo = (pNodo)malloc(sizeof(tipoNodo)); nuevo->valor = v; /* Si la lista está vacía */ if(ListaVacia(*lista) || (*lista)->valor > v) { /* Añadimos la lista a continuación del nuevo nodo */ nuevo->siguiente = *lista; /* Ahora, el comienzo de nuestra lista es en nuevo nodo */ *lista = nuevo; } else { /* Buscar el nodo de valor menor a v */ anterior = *lista; /* Avanzamos hasta el último elemento o hasta que el siguiente tenga un valor mayor que v */ printf("%p, %d", anterior->siguiente, anterior->valor); getchar(); while(anterior->siguiente && anterior->siguiente->valor <= v) { anterior = anterior->siguiente; printf("por qu'e co;os me ejecuto?"); } /* Insertamos el nuevo nodo después del nodo anterior */ nuevo->siguiente = anterior->siguiente; printf("1 %p", nuevo->siguiente); getchar(); anterior->siguiente = nuevo; } }
// Elimina el primer elemento de la lista void EliminarPrimero(Lista C) { if (!ListaVacia(C)) { C->inicio =(C->inicio+1) % C->Lmax; C->Nelem=C->Nelem-1; } }
//Pre: Lista C no está vacía, i: es un índice entre 0 y TamMax //Post:Devuelve el elemento i-ésimo de la lista C (no lo elimina de la lista) tElemento *ExtraerElem(Lista C,int i) { if(ListaVacia(C)) ERROR("ExtraerPrimero: No hay elementos"); //SE AÑADE UNA VARIABLE DE RETORNO, PUESTO QUE return PUEDE PROVOCAR PÉRDIDA EN LA CONVERSIÓN DE TIPOS tElemento *retorno=(tElemento*) malloc(sizeof(tNodoBusqueda)); *retorno = (C->elementos[i]); return retorno;//(tElemento *)(C->elementos[i]); }
void MostrarLista(Lista lista) { pNodo nodo = lista; if(ListaVacia(lista)) printf("Lista vacía\n"); else { while(nodo) { printf("%d -> ", nodo->valor); nodo = nodo->siguiente; } printf("\n"); } }
//Pre: Lista L1 no está vacía //Post: Devuelve L1+L2 Lista Concatenar(Lista L1, Lista L2) { //tElemento *e=(tElemento*) malloc(sizeof(tElemento)); //if(!ListaVacia(L1)) while(!ListaVacia(L2) && (!ListaLlena(L1))) { //e=(tElemento*) ExtraerPrimero(L2); InsertarUltimo(ExtraerPrimero(L2),L1); EliminarPrimero(L2); } return L1; }
//Pre: Lista C no está llena //Post:Devuelve el ultimo elemento de la lista void InsertarUltimo(tElemento *e, Lista C) { //si inicio == fin estamos en el caso del primer nodo de la lista if(((C->fin == 0) && (C->inicio == 0)) && (ListaVacia(C))) InsertarPrimero(e,C); else { if(C->fin == C->Lmax-1) C->fin=0; else C->fin = (C->fin+1) % C->Lmax; C->elementos[C->fin] = *e;//(tElemento) e; C->Nelem=C->Nelem+1; } }
//Pre: Lista C no está llena //Post:Devuelve el elemento primero de la lista void InsertarPrimero(tElemento *e, Lista C) { //si inicio == fin estamos en el caso del primer nodo de la lista if(((C->inicio == 0) && (C->fin == 0)) && (ListaVacia(C))) { C->elementos[C->inicio] = *e;//(tElemento) e; C->Nelem=C->Nelem+1; } else { if(C->inicio>=0 && (C->inicio < C->Lmax-1)) C->inicio = (C->inicio-1) % C->Lmax; //inserta antes que el primero if(C->inicio == C->fin) C->inicio = C->inicio-1; else C->inicio=C->Lmax-1; C->elementos[C->inicio] = *e;//(tElemento) e; C->Nelem=C->Nelem+1; } }