Memory Allocation – Worst Fit Memory Allocation – Worst Fit #include <stdio.h> #include<conio.h> int Pr[10]; struct memblock { int size; int alloc; int PrIndex; struct memblock *next; }; struct memblock * CreateHdr() { struct memblock * temp = (struct memblock*)malloc(sizeof(struct memblock)); temp->size = 0; temp->alloc = 0; temp->PrIndex = -1; return temp; } struct memblock * newNode(int s) { struct memblock *temp = (struct memblock*)malloc(sizeof(struct memblock)); temp->size = s; temp->alloc = 0; temp->PrIndex = -1; return temp; } void InsertNode(struct memblock* H, struct memblock* N) { struct memblock* tmp = H; while (tmp->next != NULL) tmp = tmp->next; tmp->next = N; } int Allocate(struct memblock* H, int s, int index) { struct memblock* tmp = H; int newSize; struct memblock* ptr = NULL; while (tmp->next != NULL) { tmp=tmp->next; if((tmp->alloc==0) && (s<=tmp->size)) { ptr = tmp; break; } } while (tmp->next != NULL) { tmp=tmp->next; if((tmp->alloc==0) && (s<=tmp->size) && (ptr->size<tmp->size)) { ptr = tmp; } } if(ptr!=NULL) { newSize = ptr->size-s; ptr->size = s; ptr->alloc = 1; ptr->PrIndex = index; if(newSize!=0) { struct memblock* t = newNode(newSize); t->next = ptr->next; ptr->next=t; } return 1; } return 0; } void printList(struct memblock *m) { printf(“\nBlock size \t Process”); while (m->next != NULL) { m = m->next; if(m->alloc==0) printf(“\n %d\t\tNot Allocated\n”, m->size); else printf(“\n %d\t\tAllocated to Process P%d\n”, m->size,m->PrIndex); } } int main() { int Nb, Np; int i, j; int blksize; int ErrCode; struct memblock *Hdr = CreateHdr(); printf(“\nEnter Number of Memory Blocks : “); scanf(“%d”,&Nb); for(i=0;i<Nb;i++) { scanf(“%d”,&blksize); struct memblock *Node = newNode(blksize); InsertNode(Hdr, Node); } printf(“\nEnter number of Process : “); scanf(“%d”,&Np); for(i=0;i<Np;i++) { printf(“\nEnter size of Process P%d: “,i); scanf(“%d”,&Pr[i]); } printf(“\n\n*** Before Process Memory Allocation ***\n”); printList(Hdr); printf(“\n\n*** After Process Memory Allocation ***\n”); for(i = 0;i<Np;i++) { ErrCode = Allocate(Hdr, Pr[i], i); if(ErrCode==0) printf(“Insufficient memory. Process P%d (%d KB) has to wait.\n”, i, Pr[i]); } printList(Hdr); return 0; } /* Sample output Enter Number of Memory Blocks : 6 300 600 350 200 750 125 Enter number of Process : 5 Enter size of Process P0: 115 Enter size of Process P1: 500 Enter size of Process P2: 358 Enter size of Process P3: 200 Enter size of Process P4: 375 *** Before Process Memory Allocation *** Block size Process 300 Not Allocated 600 Not Allocated 350 Not Allocated 200 Not Allocated 750 Not Allocated 125 Not Allocated *** After Process Memory Allocation *** Insufficient memory. Process P4 (375 KB) has to wait. Block size Process 300 Not Allocated 358 Allocated to Process P2 242 Not Allocated 200 Allocated to Process P3 150 Not Allocated 200 Not Allocated 115 Allocated to Process P0 500 Allocated to Process P1 135 Not Allocated 125 Not Allocated */