viernes, 27 de junio de 2014

Examen final Programación de Sistemas y Concurrencia. Junio 2012.

Os dejo mi solución al ejercicio de C del examen final de Programación de Sistemas y Concurrencia de la UMA de 2012.

Se desea implementar una lista enlazada circular para representar la lista de procesos que están disponibles para ejecución. El puntero externo apuntará al proceso que le corresponde la ejecución (ver figura).  

Definir la estructura de datos e implementar las siguientes operaciones: 
void Crear (LProc *lista) 
Crea una lista de procesos vacía. 
void AñadirProceso (LProc *lista, int idproc) 
Añade el proceso con identificador idproc a la lista de procesos disponibles para ejecución. Este proceso se añade como nodo anterior al nodo al que apunta ejecución. Si la lista está vacía el puntero externo apuntará a l único nodo. Dada la figura anterior, si queremos añadir el proceso 5, la lista quedaría como aparece en la figura: 


void MostrarLista( LProc lista) 
Muestra la lista de los procesos que están disponibles para la ejecución. 
void EjecutarProceso(LProc *lista) 
Simula la ejecución del proceso apuntado por ejecución, eliminándolo de la lista de procesos.  Así, partiendo de la figura anterior, la lista quedaría :


ListaCircular.h
#ifndef LISTACIRCULAR_H_
#define LISTACIRCULAR_H_


typedef struct Lista LProc;

struct Lista{
 struct TNodo * ejecucion;
};
struct TNodo{
 int valor;
 struct TNodo * sig;
};

void Crear (LProc *lista);
//Crea una lista de procesos vacía.
void AnadirProceso (LProc *lista, int idproc);
void MostrarLista( LProc lista);
//Muestra la lista de los procesos que están disponibles para la ejecución.
void EjecutarProceso(LProc *lista);

#endif /* LISTACIRCULAR_H_ */

ListaCircular.c
#include <stdio.h>
#include <stdlib.h>
#include "ListaCircular.h"

void Crear (LProc *lista){
 //Crea una lista de procesos vacía.
 (*lista).ejecucion = NULL;
}
void AnadirProceso (LProc *lista, int idproc){

 struct TNodo* nuevo = malloc(sizeof(struct TNodo));
 struct TNodo * auxiliar = (*lista).ejecucion;
 struct TNodo * anterior = NULL;
 nuevo -> valor = idproc;
 int insertado = 0;
 if((*lista).ejecucion == NULL){ //lista vacía
  nuevo ->sig = nuevo;
  (*lista).ejecucion = nuevo;
  insertado = 1;
 }
 while(!insertado ){
  if(auxiliar -> sig == (*lista).ejecucion){ // se añade detras de auxiliar
   nuevo -> sig = (*lista).ejecucion;
   auxiliar -> sig = nuevo;
   insertado = 1;
  }else{
   anterior = auxiliar;
   auxiliar = auxiliar -> sig;
  }
 }

}
void MostrarLista( LProc lista){
 //Muestra la lista de los procesos que están disponibles para la ejecución.
 struct TNodo * aux = lista.ejecucion;
 if(lista.ejecucion == NULL){
  printf("No hay procesos disponibles para la ejecución. \n");
 }else{
  printf("Procesos disponibles para la ejecución: \t");


   printf(" %d -> ",lista.ejecucion ->valor );
   lista.ejecucion = lista.ejecucion -> sig;
   while(lista.ejecucion != aux){
    printf(" %d -> ",lista.ejecucion ->valor );
    lista.ejecucion = lista.ejecucion -> sig;
   }
   printf("\n");
 }

}
void EjecutarProceso(LProc *lista){
 /*
  * Simula la ejecución del proceso apuntado por ejecución, eliminándolo de la lista de procesos.
Así, partiendo de la figura anterior, la lista quedaría :
  */
 struct TNodo * aux;
 struct TNodo * auxiliar = (*lista).ejecucion ;

 while(auxiliar -> sig != (*lista).ejecucion){
   auxiliar = auxiliar -> sig;
 }
 aux = (*lista).ejecucion ->sig;
 printf("Se ejecuta el proceso: %d \n", (*lista).ejecucion -> valor);
 free((*lista).ejecucion);
 (*lista).ejecucion = aux;
 auxiliar -> sig = (*lista).ejecucion;
}

int main(void) {
 LProc lista;
 Crear(&lista);
 MostrarLista(lista);
 AnadirProceso(&lista, 4);
 AnadirProceso(&lista, 6);
 AnadirProceso(&lista, 1);
 AnadirProceso(&lista, 8);
 AnadirProceso(&lista, 3);
 AnadirProceso(&lista, 5);
 MostrarLista(lista);
 EjecutarProceso(&lista);
 MostrarLista(lista);

 return EXIT_SUCCESS;
}


No hay comentarios:

Publicar un comentario