操作系统可变分区用C语言实现按最佳适应算法分配内存

类似上一篇博客,在分配内存使用最佳使用算法,即将空闲区按大小进行排序实现

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

typedef struct memory
{
    int startaddress;
    int size;
    char state[10];
    char number[10];
    struct memory *next;
}FENQU;
FENQU *ready=NULL,*p;
FENQU * paixu(FENQU *p)
{
    FENQU *first,*second;
    int insert=0;
    if((ready == NULL) || ((p->size) < (ready->size)))   

    {
        p->next = ready;   
        ready = p;        

    }
    else        
    {
        first = ready;
        second = first->next;
        while (second != NULL)
        {
            if (p->size < second->size)
            {
                p->next = second;
                first->next = p;
                insert = 1;
                break;
            }
            else
            {
                first = first->next;
                second = second->next;
            }
        }
        if (insert == 0) 
        {
            first->next = p;
            p->next = NULL;
        }
    }
    return ready;
}
void show(FENQU *p)
{
    printf("起始地址    大小      状态     进程号 \n");
    printf("%5d\t",p->startaddress);
    printf("%8d\t",p->size);
    printf("%s  \t",p->state);
    printf("%s  \t\n",p->number);

}
void input()
{
    int i,address,size1,n=7;

    for(i=1;i<=n;i++)
    {
        p=(FENQU*)malloc(sizeof(FENQU));
        printf("请输入第%d个分区的起始地址:\n",i);
        scanf("%d",&address);
        p->startaddress=address;
        printf("请输入第%d个分区的大小:\n",i);
        scanf("%d",&size1);
        p->size=size1;
        printf("请输入第%d个分区的状态:\n",i);
        scanf("%s",p->state);
        printf("请输入第%i个分区的进程号:\n",i);
        scanf("%s",p->number);
        p->next=NULL;
        paixu(p);   
    }
     p = ready;
        while (p != NULL)      
        {
          show(p);
          p = p->next;
        }
}

void zjsy()
{
    int asize,fazhi;
    char pcbnumber;
    //FENQU *a;
    printf("请输入进程号,大小和阀值\n");
    scanf("%s",&pcbnumber);
    scanf("%d",&asize);
    scanf("%d",&fazhi);
    FENQU *pretail,*tail,*q;
    p=ready;
    pretail=tail=p;
    while(tail!=NULL)
    {

        if(strcmp(tail->state,"空闲")==0 && tail->size>asize)
        {
        if(tail->size==asize)
        {
            strcpy(tail->number,&pcbnumber);
             strcpy(tail->state,"已分");
            break;

        }

            else  if(tail->size>asize)
            {
            q=(FENQU *)malloc(sizeof(FENQU));
            q->startaddress=tail->startaddress+tail->size-asize;
            q->size=asize;
            strcpy(q->state,"已分");
            strcpy(q->number,&pcbnumber);
            q->next=tail->next;
            tail->next=q;
            tail->size = tail->size-asize;
            strcpy(tail->number,"空闲");
            strcpy(tail->number,"?");
            break;
        }

    }

    else
    {
        pretail=tail;
        tail=tail->next;

    }
    }
    if(tail==NULL)
    {
        printf("没有足够的空间,分配失败!\n");
    }

pretail->next=tail->next;
    tail->next=NULL;
    p=paixu(tail);
}

FENQU * huishou()
{
    char pcbnumber1;
    printf("请输入被回收空间的进程号\n");
        scanf("%s",&pcbnumber1);

    FENQU *pretail,*tail;
     p=ready;
     pretail=tail=p;

     while(tail!=NULL)
     {
         if(strcmp(tail->number,&pcbnumber1)==0)
         {
             if(tail->next!=NULL)
             {
                 if(strcmp(pretail->state,"已分")==0 && strcmp(tail->next->state,"已分")==0)
                 {
                     strcpy(tail->state,"空闲");
                     strcpy(tail->number,"?");
                     break;

                 }
                 if(strcmp(pretail->state,"空闲")==0 && strcmp(tail->next->state,"已分")==0)
                 {
                     pretail->next=tail->next;
                     pretail->size=tail->size+pretail->size;
                     free(tail);
                     break;
                 }
                 if(strcmp(pretail->state,"已分")==0 && strcmp(tail->next->state,"空闲")==0)
                 {
                     if(pretail!=tail)
                     {
                         pretail->next=tail->next;
                         tail->next->size=tail->next->size+tail->size;
                         tail->next->startaddress=tail->startaddress;
                         free(tail);
                         break;

                     }
                     else
                     {
                         p=tail->next;
                         tail->next->startaddress=0;
                         tail->next->size+=tail->size;
                         break;
                     }

                 }
                 if(strcmp(pretail->state,"空闲")==0 && strcmp(tail->next->state,"空闲")==0)
                 {
                     pretail->next=tail->next->next;
                     pretail->size=pretail->size+tail->size+tail->next->size;
                     free(tail->next);
                     free(tail);
                     break;

                 }
             }
             else
             {
                 if(strcmp(pretail->state,"已分")==0)
                 {
                     strcpy(tail->state,"空闲");
                     break;
                 }
                 else
                 {
                     pretail->next=NULL;
                     pretail->size=pretail->size+tail->size;
                     free(tail);
                     break;
                 }

             }
         }
         pretail=tail;
         tail=tail->next;
     }
      return p;
}

void function()
{
    int i;
    printf("请选择:(1) 分配空间 (2)回收空间  (3)结束\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1: 
        zjsy();

        printf("分配成功!\n");
        while (p != NULL)      
        {
          show(p);
          p = p->next;
        }
        break;

    case 2:
        p=huishou();
        while (p != NULL)      
        {
          show(p);
          p = p->next;
        }
        break;
     case 3: 
             exit(0);
             }
    function();
}
void main()
{
    input();
    function();
}
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值