Sei sulla pagina 1di 6

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.

h> typedef struct memory { int mark,size; char name[10]; struct memory *next; }node; node *insert(node *,int *); node *del(node *,int *); node *first_fit(node *,int *); node *best_fit(node *,int *); node *worst_fit(node *,int *); node *add(node *,int,int *); node *defrag(node *,int,int *); void display(node *); void main() { int flag=0,ch,op,total; node *head; clrscr(); head=NULL; printf("\n\nENTER THE TOTAL SIZE OF MEMORY:="); scanf("%d",&total); do { clrscr(); printf("\n-------------------MENU---------------------"); printf("\n\n\t\t1.INSERT\n\n\t\t2.DELETE\n\n\t\t3.DISPLAY\n\n\t\t4.EXIT" ); printf("\n\nENTER UR CHOICE:="); scanf("%d",&ch); switch(ch) { case 1: if(flag==0) head=insert(head,&total); else { printf("\n1.FIRST FIT\n2.BEST FIT\n3.WORST FIT") ; printf("\n\nENTER YOUR CHOICE:="); scanf("%d",&op); switch(op) { case 1: head=first_fit(head,&total); break; case 2: head=best_fit(head,&total); break; case 3: head=worst_fit(head,&total); break; } } break; case 2: head=del(head,&total); flag=1; break;

case 3: display(head); break; } }while(ch!=4); getch(); } node *insert(node *head,int *total) { node *p,*q,*nw; p=(node*)malloc(sizeof(node)); printf("\n\nENTER THE PROCESS NAME:="); scanf("%s",p->name); printf("\n\nENTER THE MEMORY SIZE OF PROCESS:="); scanf("%d",&p->size); if(*total>=p->size) { p->mark=1; p->next=NULL; if(head==NULL) head=p; else { q=head; for(q=head;q->next!=NULL && q->next->mark!=0;q=q->next); q->next=p; } *total=*total-p->size; if(*total>0) { nw=(node *)malloc(sizeof(node)); strcpy(nw->name,"REMAIN"); nw->mark=0; nw->next=NULL; nw->size=*total; p->next=nw; } } else { free(p); printf("\n\nNOT ENOUGH MEMORY AVILABLE"); getch(); } return(head); } node *del(node *head,int *total) { char a[10]; node *p,*q,*r; printf("\n\nENTER THE PROCESS NAME U WANT TO DELETE:="); scanf("%s",a); q->mark=1; for(p=head;p!=NULL;p=p->next) { if(strcmp(p->name,a)==0) { p->mark=0; strcpy(p->name,"HOLE"); *total=*total+p->size;

break; } q=p; } if(p!=NULL) { if(q->mark==p->mark) { q->size=q->size+p->size; q->next=p->next; free(p); p=q; } if((p->next!=NULL) && (p->mark==p->next->mark)) { p->size=p->size+p->next->size; p->next=p->next->next; free(p->next); } } else printf("\n\nWRONG ENTRY!!"); return(head); } node *first_fit(node *head,int *total) { int limit,sz; node *p,*q,*r; printf("\n\nENTER THE MEMORY SIZE OF PROCESS U WANT TO INSERT:="); scanf("%d",&limit); if(*total>limit) { for(p=head;p!=NULL;p=p->next) { if(p->mark==0 && p->size>=limit) { p->mark=1; sz=p->size-limit; printf("\n\nENTER THE PROCESS NAME:="); scanf("%s",p->name); p->size=limit; q=(node*)malloc(sizeof(node)); r=p->next; p->next=q; q->next=r; q->mark=0; q->size=sz; strcpy(q->name,"HOLE"); *total=*total-limit; break; } } if(p==NULL) { if(limit<=*total) head=defrag(head,limit,total); else head=add(head,limit,total); } }

else printf("\n\nDELETE FIRST"); getch(); return(head); } void display(node *head) { node *p; clrscr(); printf("\n\n-----------------DESCRIPTION--------------------"); printf("\n\nNAME\t\tSIZE"); for(p=head;p!=NULL;p=p->next) printf("\n\n%s\t\t%d",p->name,p->size); getch(); } node *add(node *head,int limit,int *total) { node *nw,*p; nw=(node*)malloc(sizeof(node)); printf("\n\nENTER THE PROCESS NAME:="); scanf("%s",nw->name); nw->mark=1; nw->size=limit; nw->next=NULL; for(p=head;p->next!=NULL;p=p->next); p->next=nw; *total=*total-limit; return(head); } node *best_fit(node *head,int *total) { node *p,*q; int sz,limit,min=9999,flag=0; printf("\n\nENTER THE MEMORY SIZE OF NEW PROCESS:="); scanf("%d",&limit); if(*total>limit) { for(p=head;p!=NULL;p=p->next) { if(p->mark==0 && p->size>=limit) { flag=1; sz=p->size-limit; if(sz<min) { q=p; min=sz; } } } if(flag==1) { q->mark=1; printf("\n\nENTER THE PROCESS NAME:="); scanf("%s",q->name); q->size=limit; p=(node *)malloc(sizeof(node)); p->mark=0; strcpy(p->name,"HOLE"); p->size=sz;

p->next=q->next; q->next=p; *total=*total-limit; } else { if(limit<=*total) head=defrag(head,limit,total); else head=add(head,limit,total); } } else printf("\n\nDelete first"); getch(); return(head); } node *worst_fit(node *head,int *total) { node *p,*q; int sz,limit,max=-1,flag=0; printf("\n\nENTER THE MEMORY SIZE OF NEW PROCESS:="); scanf("%d",&limit); if(*total>limit) { for(p=head;p!=NULL;p=p->next) { if(p->mark==0 && p->size>=limit) { flag=1; sz=p->size-limit; if(sz>max) { q=p; max=sz; } } } if(flag==1) { q->mark=1; printf("\n\nENTER THE PROCESS NAME:="); scanf("%s",q->name); q->size=limit; p=(node *)malloc(sizeof(node)); p->mark=0; strcpy(p->name,"HOLE"); p->size=max; p->next=q->next; q->next=p; *total=*total-limit; } else { if(limit<=*total) head=defrag(head,limit,total); else head=add(head,limit,total); } }

return(head); } node *defrag(node *head,int limit,int *total) { node *p,*q,*back_up; for(p=head;p->mark!=0;p=p->next); p->size=*total; strcpy(p->name,"HOLE"); p->mark=0; back_up=p; q=p; for(p=p->next;p!=NULL;) { if(p->mark==0) { q->next=p->next; free(p); if(q->next!=NULL) { q=q->next; p=q->next; } else p=NULL; } else { q=p; p=p->next; } } printf("\n\nEnter the process name:="); scanf("%s",back_up->name); q=(node *)malloc(sizeof(node)); q->next=back_up->next; back_up->next=q; *total=*total-limit; q->size=*total; back_up->size=limit; back_up->mark=1; q->mark=0; strcpy(q->name,"HOLE"); return(head); }

Potrebbero piacerti anche