Saturday, August 9, 2014

Program for Best Fit, Worst Fit and First Fit

This is a program for the implementation of Best fit, Worst Fit, and First Fit for the operating systems lab. If you have any doubts please let me know.

#include<stdio.h>
#include<stdlib.h>
int i,j,n,x,ch,size,ch1,ch2,y,pid;
struct alloc1
{
  int id,sa,ea,size;
  struct alloc1 *next;
}*start=NULL,*ptr=NULL,*newn=NULL;

struct free1
{
  int stadd,eadd,size1;
  struct free1 *next;
}*start1=NULL,*newn1=NULL,*ptr2=NULL,*preptr2=NULL;

void displayfree(struct free1 *temp)
{
printf("\n\nFree Space\n");
temp=start1;
while(temp!=NULL)
    {
    printf("%d",temp->stadd);
    printf(" - %d\n",temp->eadd);
    temp=temp->next;
    }}

void display(struct alloc1 *temp1)
{
printf("\n\nAllocated\n");
temp1=start;
while(temp1!=NULL)
    {
                        printf("p%d\t",temp1->id);
    printf("%d",temp1->sa);
    printf(" - %d\n",temp1->ea);
    temp1=temp1->next;
    }
}
void init()
{
   newn->sa=ptr2->stadd;
   newn->ea=newn->sa+size-1;
   ptr2->stadd=ptr2->stadd+size;
   ptr2->size1=ptr2->size1-size;
}
void main()
{
    printf("\nEnter the number of processes:\n");
  scanf("%d",&n);
   for(i=0;i<n;i++)
  {
         newn=(struct alloc1 *) malloc(sizeof(struct alloc1));
         printf("\nEnter process id: ");
         scanf("%d",&newn->id);
         printf("\nEnter the start address: ");
         scanf("%d",&newn->sa);
         printf("\nEnter the end address: ");
         scanf("%d",&newn->ea);
         newn->size=(newn->ea-newn->sa)+1;
         if(start==NULL)
        {
            start=newn;
            start->next=NULL;
            ptr=start;
        }
       else
       {
            while(ptr->next!=NULL)
            {
            ptr=ptr->next;
            }
            ptr->next=newn;
            ptr=ptr->next;
            ptr->next=NULL;
       }
}
 printf("\nEnter the details of free space\n");
 do
 {
    newn1=(struct free1 *) malloc(sizeof(struct free1));
   printf("\nEnter the starting address: ");
   scanf("%d",&newn1->stadd);
   printf("\nEnter the ending address: ");
   scanf("%d",&newn1->eadd);
   newn1->size1=(newn1->eadd-newn1->stadd)+1;
    if(start1==NULL)
  {
    start1=newn1;
    start1->next=NULL;
  ptr2=start1;
   }
   else
   {
     while(ptr2->next!=NULL)
       ptr2=ptr2->next;
     ptr2->next=newn1;
     ptr2=ptr2->next;
     ptr2->next=NULL;
  }
  ptr2=start1;
  printf("\nPress 1 to add more...");
  scanf("%d",&ch);
 }while(ch==1);
printf("\n BEFORE FITTING\n");
displayfree(ptr2);
 ptr=start;
display(ptr);
do
{
  printf("\nEnter the size of new process: ");
  scanf("%d",&size);
  printf("\nEnter the process id:");
  scanf("%d",&pid);
 newn=((struct alloc1 *)malloc(sizeof(struct alloc1)));
   newn->next=NULL;  
   newn->size=size;
               newn->id=pid;
     printf("\nMENU:\n1.First fit\n2.Best fit\n3.Worst fit\n4.Exit\n");
     printf("\nEnter your choice:\n");
     scanf("%d",&ch1);
     switch(ch1)
     {
       case 1:
   ptr2=start1;
   if(ptr2->size1==size)
   {
   start1=ptr2->next;
   }
   else
   {
   while(ptr2->size1<size)
   {
    if(ptr2->next==NULL)
     {
        printf("\nInsufficient memory");
  goto lab;
      }
   preptr2=ptr2;
   ptr2=ptr2->next;
   if(ptr->size==size)
   {
   preptr2->next=ptr2->next;
   }}}
   init(); ptr=start;
while(ptr->next!=NULL)
   ptr=ptr->next;
      ptr->next=newn;
   printf("\nFIRST FIT\n");
   display(ptr);
   displayfree(ptr2);
          lab: break;
case 2:
   ptr2=start1;
   x=1000;
   while(ptr2!=NULL)
   {
   if((ptr2->size1>=size)&&(ptr2->size1<=x))
   {
   x=ptr2->size1;
   }
   ptr2=ptr2->next;
  }
  if(x==1000)
  {
   printf("\nInsufficient memory");
  break;
  }
   ptr2=start1;
   while(ptr2->size1!=x)
   {
   preptr2=ptr2;
   ptr2=ptr2->next;
   }
init();
if(x==size)
   preptr2->next=ptr2->next;
   ptr=start;
   while(ptr->next!=NULL)
   ptr=ptr->next;
   ptr->next=newn;
   printf("\nBEST FIT\n");
   display(ptr);
   displayfree(ptr2);
break;
case 3:   
   ptr2=start1;
       y=0;
   while(ptr2!=NULL)
   {
   if((ptr2->size1>=size)&&(ptr2->size1>=y))
   {
   y=ptr2->size1;
   }
   ptr2=ptr2->next;
  }
if(y==0)
   {
   printf("\nInsufficient memory");
  break;
   }
   ptr2=start1;
   while(ptr2->size1!=y)
   {
   preptr2=ptr2;
   ptr2=ptr2->next;
   }
   if(y==size)
   {
   preptr2->next=ptr2->next;
   }
   init(); ptr=start;
   while(ptr->next!=NULL)
   {
   ptr=ptr->next;
   }
   ptr->next=newn;
  printf("\nWORST FIT\n");
   display(ptr);
   displayfree(ptr2);
   break;
case 4:break;
default:break;
}
printf("\npress 1 to add more..");
scanf("%d",&ch2);
}while(ch2==1);
}


No comments:

Post a Comment