view gecko/src/lista.c @ 11:cf4c0c822ca9 draft

Uploaded
author bitlab
date Wed, 18 Nov 2020 08:37:31 +0000
parents 9db88f0f32b7
children
line wrap: on
line source

/* lista.c

functions to handle a list



*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <math.h>

#include "lista.h"

void Insertar(Lista *lista, int v,Fragmentv3 f,int n_event) {
   pNodo nuevo, actual;

   /* Crear un nodo nuevo */
   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->valor = v;
   nuevo->f=f;
   nuevo->n_event=n_event;
   
   /* Colocamos actual en la primera posición de la lista */
   actual = *lista;
   if(actual) while(actual->anterior) actual = actual->anterior;
   
   /* Si la lista está vacía o el primer miembro es mayor que el nuevo */
   if(!actual || actual->valor > v) {
      /* Añadimos la lista a continuación del nuevo nodo */
      nuevo->siguiente = actual; 
      nuevo->anterior = NULL;
      if(actual) actual->anterior = nuevo;
      if(!*lista) *lista = nuevo;
   }
   else {
      /* Avanzamos hasta el último elemento o hasta que el siguiente tenga 
         un valor mayor que v */
      while(actual->siguiente && actual->siguiente->valor <= v) 
         actual = actual->siguiente;
      /* Insertamos el nuevo nodo después del nodo anterior */
      nuevo->siguiente = actual->siguiente;
      actual->siguiente = nuevo;
      nuevo->anterior = actual;
      if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
   }
}

void Borrar(Lista *lista, int v) {
   pNodo nodo;
   
   
   /* Buscar el nodo de valor v */
   nodo = *lista;
   while(nodo && nodo->valor <v) nodo = nodo->siguiente;
   while(nodo && nodo->valor > v) nodo = nodo->anterior;

   /* El valor v no está en la lista */
   if(!nodo || nodo->valor != v) return;
   
   /* Borrar el nodo */
   /* Si lista apunta al nodo que queremos borrar, apuntar a otro */
   if(nodo == *lista){
     if(nodo->anterior) {*lista = nodo->anterior;}
     else {*lista = nodo->siguiente;}
   }
   if(nodo->anterior) /* no es el primer elemento */
      nodo->anterior->siguiente = nodo->siguiente;
   if(nodo->siguiente) /* no es el último nodo */
      nodo->siguiente->anterior = nodo->anterior;
   free(nodo);
}
void BorrarLista(Lista *lista) {
   pNodo nodo, actual;

   actual = *lista;
   while(actual->anterior) actual = actual->anterior;

   while(actual) {
      nodo = actual;
      actual = actual->siguiente;
      free(nodo);
   }
   *lista = NULL;
}

void MostrarLista(Lista lista, int orden,char* nombre,int num) {
   pNodo nodo = lista;
	int i=0;
   if(!lista) printf("Lista vacía");

   nodo = lista;
   if(orden == 1) {
      while(nodo->anterior) nodo = nodo->anterior;
     // printf("Orden ascendente: ");
      while(nodo) {
        // printf("%d -> ", nodo->valor);
		printFrag(nodo->f,nombre,i++,num,nodo->n_event);
         nodo = nodo->siguiente;
      }
   }
   else {
      while(nodo->siguiente) nodo = nodo->siguiente;
     // printf("Orden descendente: ");
      while(nodo) {
        printFrag(nodo->f,nombre,i++,num,nodo->n_event);
         nodo = nodo->anterior;
      }
   }
   
   //printf("\n");
}

void printFrag(Fragmentv3 f,char* nombre,int i,int num,int n_event){

	
	fprintf(NULL,"%d\t%s\t%d\t%ld\t%ld\t%ld\t%ld\t%f\t%d\t%d\t%d\t%d\t%d\t%c\t%d\t%d\t%d\t%d\t%d\n",i,nombre,(int)num,f.xIni,f.xFin,f.yIni,f.yFin,f.similarity,(int)f.id,(int)f.seqY,(int)f.seqX,(int)f.block,(int)f.gap,f.strand,(int)f.reversions,(int)f.translocations,(int)f.duplications,(int)f.events,(int)f.score);
	printf("%ld\t%ld\t%d\n",f.seqY,f.seqX,n_event);
		

}


void CopiarListas(Lista* origen,Lista* dest){ // SUponemos las dos listas mismo tamaño

	pNodo onodo = *origen;
	pNodo dnodo = *dest;
	while(onodo->anterior && dnodo->anterior) {onodo = onodo->anterior;dnodo = dnodo->anterior;}

   while(onodo && dnodo) {
   /*
	dnodo->f=*(onodo->f);
	dnodo->valor=*(onodo->valor);
      */
	  
	  dnodo = dnodo->siguiente;
      onodo = onodo->siguiente;
     
   }
	

}