首次适应(FirstFit)算法(空闲区地址递增)

来源:互联网 发布:松下触摸屏编程软件 编辑:程序博客网 时间:2024/05/16 07:40

基本思想:要求空闲区按地址递增的次序排列。当进行内存分配时,从空闲区表头开始顺序查找,直到找到第一个能滿足其大小要求的空闲区为止。分一块给请求者,余下部分仍留在空闲区中。

#include <malloc.h> #include <stdio.h> #include <string.h> #define NULL 0 typedef struct table   {int address;     /*存储分区起始地址*/    int length;      /*存储分区长度*/    int flag;        /*存储分区标志,0 为空闲,1 为被作业占据*/    char name[10];   /*当flag==1 时存储分区占用标志作业名,否则存储空nil*/   struct table *next;  }node; bool success=false;    /*分配成功与否的标志*/ node *insert(node *head, node *p)  /*按照“地址递增方式”将p 结点插入链表相应位置*/ {    node *r,*t;    r=head;    while(r&&r->address<=p->address)    {        t=r;        r=r->next;    }    if(r==head)    {        p->next=head;        head=p;    }    else if(r==NULL)    {        t->next=p;        t=p;    }    else    {        p->next = r;          t->next = p;     }    return head;} node *creat()   /*根据地址递增方式建立分配分区表(flag==1)或空闲分区表(flag==0)*/ {    node *head,*p1;    int n=0;    printf("address length flag(0 or 1)\n");    p1=(node *)malloc(sizeof(node));    scanf("%d%d%d",&p1->address,&p1->length,&p1->flag);    p1->next=NULL;    if(p1->flag==1)    {        printf("\t\tinput job_name:");        scanf("%s",&p1->name);    }    else        strcpy(p1->name,"nil");    head=NULL;    while (p1->length>0)/*输0表示结束*/    {        n=n+1;        if (n==1) head=p1;        else            head=insert(head,p1);               p1=(node *) malloc (sizeof(node));        scanf("%d%d%d",&p1->address,&p1->length,&p1->flag);        if(p1->flag==1)        {            printf("\t\tinput job_name:");            scanf("%s",&p1->name);        }        else            strcpy(p1->name,"nil");        p1->next=NULL;    }       return head;} node *distribute(node *freehead, node *distributedhead, node *work) /*在空闲分区表中找出首次合适work 的分区,同时修改空闲分区表和分配分区表*/ {    node *q;    q=freehead;    while(q)    {           if(q->length>=work->length)/*可分配*/        {            work->address=q->address;            work->flag=1;            success=true;            if(q->length>work->length)/*剩余部分仍修改为空闲分区*/            {                q->address=q->address+work->length;                q->length=q->length-work->length;            }            break;        }        else           success=false;        q=q->next;    }        return freehead;}void print (node *head) /*输出链表*/ {    node *p;    p=head;    if(!p)   printf("链表为空!");    else    {        while(p)        {            printf("%d,%d,%d,%s\n",p->address,p->length,p->flag,p->name);            p=p->next;        }    }} int main()  {     int a;     struct table *dtable,*d,*ftable,*f,*work,*t;    char workn[10];    printf("The distributed table is:\n");     dtable=d=creat(); /*dtable 输入已分配情况表*/     printf("\nThe free table is:\n");    ftable=f=creat();               /*ftable 输入未分配情况表*/      /* 以下模拟逐个内存申请过程*/    while(1){    printf("\nThe length of worked job is:");/*输入要分配的工作情况*/    scanf("%d",&a);    printf("The name of worked job is: ");    scanf("%s",&workn);    work=(node*)malloc(sizeof(node));    work->length=a;    work->next=NULL;    strcpy(work->name,workn);    f=distribute(ftable,dtable,work);    if(success)    {        printf("\ndistributing is successful!\n");        printf("\nThe free table is !\n");        print(f);        while(d->next)        {            t=d;            d=d->next;            if(d->address>work->address)                break;        }        work->next=t->next;        t->next=work;        printf("\nThe distributed table is !\n");        print(dtable);        d=dtable;    }    else    {        printf("\ndistributing is not successful!\n");        printf("\nThe free table is !\n");        print(ftable);        printf("\nThe distribute table is !\n");        print(dtable);    }    }    return 0;    } 
阅读全文
0 0
原创粉丝点击