分区分配算法

来源:互联网 发布:桂林绿源网络 编辑:程序博客网 时间:2024/06/07 18:32

实验:分区分配算法——BF和FF

实验分析

1. 首先声明一个结构体,里面有区号,空闲区长度,空闲区的地址,和指向本身类型的指针。

2. 空闲分区的创建(和单链表创建差不多)

3. 作业的链表创建.

4. FF.BF,WF的排序算法。

5. FF,BF,WF的算法。

(一).FF算法的代码

#include<stdlib.h>

#include<stdio.h>

#include<malloc.h>

typedef struct re

{

    intnumber;//区号

    intlength;//长度

    intaddress;//地址

    struct re*next;

}RE;

RE *create()//空闲分区的创建

{

    RE*head,*p,*r,*s,*t;

    inti,x,temp;

    head=r=NULL;

    printf("请输入分区的总数:");

   scanf("%d",&x);

   for(i=0;i<x;i++)

    {

       p=(RE*)malloc(sizeof(RE));

        printf("分区号  分区长度   分区地址");

       scanf("%d %d%d",&p->number,&p->length,&p->address);

       if(head==NULL)//链表为空

           {

 

           head=p;

           p->next=NULL;

            r=p;

           }

           else{

                 p->next=r->next;

                 r->next=p;

               }

               r=p;

    }

    if(r)  r->next=NULL;

    return head;

}

RE *pcreate()//作业链表的创建

{

   RE*p,*phead,*r;

    int i,x;

    phead=NULL;

   printf("作业个数:");

  scanf("%d",&x);

   printf("作业的大小:");

  for(i=0;i<x;i++)

    {

        p=(RE*)malloc(sizeof(RE));

        scanf("%d",&p->length);

        if(phead==NULL)

         {

            phead=p;

            p->next=NULL;

            r=p;

         }

         else {

              p->next=r->next;

              r->next=p;

               }

        r=p;

    }

    if(r)r->next=NULL;

    returnphead;

}

void printf(RE *head)

{

    RE *p,*q;

    p=head;

    while(p)

    {

       printf("%d %d %d",p->number,p->length,p->address);

        printf("\n");

       p=p->next;

    }

 

}

RE *FFsort(RE *head)//排序函数

{

   RE *s,*t,*p;

    inttemp,Temp,TEmp;

   s=head;

   t=head->next;

   while(s->next)

    {

        while(t)

        {

          if(s->address>t->address)

            {

           temp=s->address;

           s->address=t->address;

           t->address=temp;

           Temp=s->number;

           s->number=t->number;

           t->number=Temp;

           TEmp=s->length;

           s->length=t->length;

           t->length=TEmp;

            }

           t=t->next;

        }

       s=s->next;

       t=s->next;

    }

    return head;

}

RE*FF(RE*head)

{

  RE*p,*q,*r,*phead,*t;

  q=phead=pcreate();

  p=FFsort(head);

  while(p&&q)

   {

          if(p->length>q->length)

           {

        p->length=p->length-q->length;

p->address=p->address+q->length;

              p=FFsort(head);//重新排序

              q=q->next;

           }

         elsep=p->next;

   }

  p=FFsort(head);//重新排完序后的头指针

   return p;

}

int main()

{

    RE *head,*p;

   head=create();

   printf(head);

    p=FF(head);

   printf("剩余的空闲分区为:\n");

    printf(p);

}

注意事项:

1. 排序算法是用冒泡排序算法,注意在双重循环的关系,t要始终为t=s->next;

2. 冒泡排序算法中,第一重的循环条件为while(s->next),而第二重为while(t);

3. 在FF算法中,每执行完一次都要排序

p=FFsort(head);//重新排序。

二).BF算法代码

   #include<stdlib.h>

#include<stdio.h>

#include<malloc.h>

typedef structre

{

    int number;//区号

    int length;//长度

    int address;//地址

    struct re *next;

}RE;

RE *create()//空闲分区的创建

{

    RE *head,*p,*r;

    int i,x;

    head=r=NULL;

     printf("请输入分区的总数:");

    scanf("%d",&x);

    for(i=0;i<x;i++)

    {

        p=(RE*)malloc(sizeof(RE));

        printf("分区号  分区长度   分区地址");

        scanf("%d %d%d",&p->number,&p->length,&p->address);

        if(head==NULL)//链表为空

           {

 

            head=p;

            p->next=NULL;

            r=p;

           }

           else {

                  p->next=r->next;

                  r->next=p;

                }

                r=p;

    }

    if(r) r->next=NULL;

     return head;

}

RE *pcreate()//作业链表的创建

{

    RE*p,*phead,*r;

    int i,x;

    phead=NULL;

  printf("作业个数:");

   scanf("%d",&x);

   printf("作业的大小:");

   for(i=0;i<x;i++)

    {

         p=(RE*)malloc(sizeof(RE));

        scanf("%d",&p->length);

         if(phead==NULL)

         {

             phead=p;

             p->next=NULL;

         }

         else {

               p->next=r->next;

               r->next=p;

               }

        r=p;

    }

    if(r) r->next=NULL;

    return phead;

}

void printf(RE*head)

{

    RE *p,*q;

    p=head;

    while(p)

    {

        printf("%d %d%d",p->number,p->length,p->address);

        printf("\n");

        p=p->next;

    }

 

}

RE *BFsort(RE*head)//排序函数

{

    RE *s,*t;

    int temp,Temp,TEmp;

    s=head;

    t=head->next;

    while(s->next)

    {

        while(t)

        {

           if(s->length>t->length)

            {

            temp=s->address;

            s->address=t->address;

            t->address=temp;

            Temp=s->number;

            s->number=t->number;

            t->number=Temp;

            TEmp=s->length;

            s->length=t->length;

            t->length=TEmp;

            }

            t=t->next;

        }

        s=s->next;

        t=s->next;

    }

    return head;

}

RE*BF(RE*head)

{

    RE*p,*q,*r,*phead;

   int x;

   q=phead=pcreate();

   p=BFsort(head);

   while(q&&p)

   {

 

           if(p->length>=q->length)

           {

               p->length=p->length-q->length;

p->address=p->address+q->length;

               p=BFsort(head);//重新排序

               q=q->next;

           }

           else {

                p=p->next;

                }

   }

   p=BFsort(head);//重新排完序后的头指针

   return p;

}

int main()

{

 

    RE*head,*p;

    head=create();

    printf(head);

    p=BF(head);

    printf("剩余的空闲分区为:\n");

    printf(p);

}


1 0