


#include<stdio.h> #include<stdlib.h> #include <iostream> #include <bits/stdc++.h> using namespace std; int SIZE=0; struct linkk//內存空閑分區 { int size;//內存塊的大小 int addr;//起始地址 struct linkk *next; }; struct jobtab//作業分區 { int jno;//作業的編號 int size;//作業的大小 int addr;//作業的起始地址 int flag; }; struct linkk *head,*p,*q; struct jobtab tab[20]; void printlink() { int i; if(head!=NULL) { printf("\n 分區號 分區地址 分區大小\n"); printf("========================\n"); } q=head; i=1; while(q!=NULL) { printf(" %d\t %d\t %d\t\n",i,q->addr,q->size); q=q->next; i++; } printf("===============================\n"); return; } void printtab() { int i,flag; flag=0; for(i=0;i<20&&flag==0;i++) if(tab[i].flag==1) flag=1; if(flag==0) { printf("\n no job"); return; } printf("\n 作業號 作業地址 作業長度\n"); printf("\n===========================\n"); for(i=0;i<20;i++) if(tab[i].flag==1) printf(" %d\t %d\t %d\n",i,tab[i].addr,tab[i].size); printf("\n=================================\n"); return; } void allocm() { int n,l; struct linkk *p1; printf("\n Input job n(0<=n<20):");//輸入第n個作業 scanf("%d",&n); printf("\nInput joblength:"); scanf("%d",&l);//輸入第n個作業的長度 if(tab[n].flag==1) { printf("\n The job has create!\n");//tab[n].flag==1說明作業已被創建;否則創建作業 return; } else { tab[n].flag=1; //置創建標志位和作業大小 tab[n].size=l; q=head;p=head; } while(q!=NULL)//注意理解 { if(q->size==l) { tab[n].addr=q->addr; p1=q; if(p1==head) head=q->next;//釋放第一個分區塊 else p->next=q->next; free(p1); SIZE=0; return; } if(q->size>l) { tab[n].addr=q->addr; q->size=q->size-l; q->addr=q->addr+l; SIZE-=l; cout<<SIZE<<endl; return; } p=q;q=q->next; } tab[n].flag=0; printf("\n no memory!!\n"); return; } void freem() { /*完成回收代碼,學生編寫*/ int n; printf("\n Input job n(0<=n<20):");//輸入需要回收的作業編號 scanf("%d",&n); int addr=tab[n].addr;//獲得需要釋放內存的起始地址; int size=tab[n].size;//獲得需要釋放內存的大小; tab[n].flag=0; struct linkk *te;//設置一個節點 te=(struct linkk *)malloc(sizeof(struct linkk)); q=head; te->addr=addr; te->size=size; if(SIZE<=0){ //考慮一下內存分配完之后回收的情況。 te->next=NULL; q=te; head=q; SIZE+=te->size; }else{ if((te->addr+te->size==q->addr)||(te->addr-te->size==q->addr)){ //此時代表區間地址相連 if(te->addr+te->size==q->addr){ //后相連 q->addr=te->addr; q->size+=te->size; }else if(te->addr-te->size==q->addr){ //前相連 q->size+=te->size; } }else{//此時代表釋放的空間不相連 if(te->addr<q->addr){ //如果新節點的地址小於已經存在的,那么插在前面 te->next=q; q=te; }else{ //否則插在后面 te->next=NULL; q->next=te; } head=q; } } } int main() { int i,m,t,n; head=(struct linkk *)malloc(sizeof(struct linkk)); head->addr=0;//初始化地址為0 head->next=NULL; printf("\n Input memory size:"); scanf("%d",&n);//輸入內存的長度 head->size=n; SIZE=n; for(i=0;i<20;i++){//初始化作業的編號和狀態,0代表為完成作業 tab[n].jno=i; tab[n].flag=0; } t=0; do{ printf("\n=================================================\n"); printf("\t1--alloc memory 2--free memory\n"); printf("\t3--print_LINK 4--print_TAB\n"); printf("\t5--Quit\n"); printf("==================================================\n"); printf(" Select[]\\b\b"); scanf("%d",&m); switch(m){ case 1:allocm() ;break; case 2:freem();break; case 3:printlink();break; case 4:printtab();break; case 5: t=1; } } while(!t); return 0; }
