| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 284 人关注过本帖
标题:求高人相助,为什么不能分配啊。回收也有问题。。。
只看楼主 加入收藏
屎宝宝
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2012-3-19
结帖率:66.67%
收藏
 问题点数:0 回复次数:0 
求高人相助,为什么不能分配啊。回收也有问题。。。
   分配回收有问题啊  空闲区初始化的那个不能动的  是给os分配的  咋回事啊????

#include<stdio.h>
#include<string.h>
#define N 10//最大作业数量为N
#define M 10//空闲区表最大为M
#define minsize 1 //最小
typedef struct
{
    float address;//已分配区的起始地址
    float length;//长度
    int flag;//标志 0为空区 1为已存储
}used;
used ut[N];
typedef struct
{
    float address;//未分配区的起始地址
    float length;//长度
    int flag;//标志 0为空区 1为未分配
}free;
free ft[M];
   
    void csh()//初始化
 {
     int i;
   
     ft[0].address=10;
     ft[0].length=10;
     ft[0].flag=1;
     
     for(i=1;i<M;i++)
         ft[i].flag=0;
     for(i=0;i<N;i++)
        ut[0].flag=0;
 }

 
    int fenpei(int name,float size)//分配内存
 {
    int i=0,j=0,k=-1;
    float ad,l;
   
    for(i=0;i<M;i++)
        if(ft[i].length>=size&&ft[i].flag==1)
            if(k==-1||ft[i].length<ft[k].length)
                k=i;
    if(k==-1)
    {   
        printf("无可用空闲区\n");
        return 0;
    }
   
    if(ft[k].length-size<=minsize)
    {
    ft[k].flag=0;
    ad=ft[k].address;
    l=ft[k].length;
    }
    else
    {
    ad=ft[k].address;
    l=ft[k].length;
    ft[k].address=ft[k].address+l;
    ft[k].length=ft[k].length-l;
    }
    i=0;
    while(ut[i].flag!=0 && i<N)
    {
        i++;
    }
    if(i>=N)
    {
        printf("没空间填写已分分区,错误\n");
        if (ft[k].flag==0)
            ft[k].flag=1;
        else
            ft[k].length=ft[k].length+l;
        return 0;
    }
    else
    {
    ut[i].address=ad;
    ut[i].length=l;
    ut[i].flag=name;
    }
    return 0;
    }      

int huishou(int name)//回收内存
{
    int i=0,t,j=0;
    int k=-1;int n=-1;//k是上栏 n是下栏
    int y=0;
    float rad,rl;
   
    while(y<=N-1&&(ut[y].flag!=name||ut[y].flag==0))
    {y++;}
    if(y>=N)
        {
        printf("找不到改作业\n");
        return 0 ;
        }
    else
    {
    ut[y].flag=0;
    rad=ut[y].address;
    rl=ut[y].length;
    }
   
while((i<M &&(k==-1||n==-1)))
 {
 if(ft[i].flag==0)
    {
     if(ft[i].address+ft[i].length==rad)
        k=i;
     if(ft[i].address==rad+rl)
        n=i;
    }
 i=i+1;
 }
if(k!=-1)//有上邻接区
    if(n!=-1)//有下邻接区
    {
        ft[i].length=ft[n].length+ft[k].length+rl;
        ft[n].flag=0;
    }
    else
        ft[k].length+=rl;
    else if(n!=-1)
    {
    ft[n].length+=rl;
    ft[n].address=rad;
    }
    else//既没有上邻接区也没有下邻接区
{t=0;
    while(ft[t].flag==1&& t<M)
    {    t++;}
    if(t>=M)
    {
    ut[y].flag=name;
    printf("空闲区已经满了!!!!回收失败!!!!");
    return 0;
    }
   
    else
    {
    ft[t].address=rad;
    ft[t].length=rl;
    ft[t].flag=1;
    }

    }
        return name;
}


void show()
{int i;
    printf("输出空闲区表:\n");
        printf("起始地址 分区长度 标志\n");
            for (i=0;i <M;i++)
                printf("%5.0f%10.0f%6d\n",ft[i].address,ft[i].length,ft[i].flag);
            printf("按任意键,输出已分分区表\n");
            getch();
            printf("输出已分分区表:\n");
            printf("起始地址  分区长度  标志\n");
            for (i=0;i <N;i++)
                if (ut[i].flag!=0)
                    printf("%6.0f%9.0f%6d\n",ut[i].address,ut[i].length,ut[i].flag);
                else
                    printf("%6.0f%9.0f%6d\n",ut[i].address,ut[i].length,ut[i].flag);
}

void main()
{int choice;
int name;
float size;
csh();
    while(1)
    {
        printf("\t***********************************\n");
        printf("\t\t1.分配\n");
        printf("\t\t2.回收\n");
        printf("\t\t3.显示分配情况\n");
        printf("\t\t4.退出\n");
        printf("\t***********************************\n");
printf("请输入选择1-4:");
scanf("%d",&choice);
if(choice<1||choice>4)
printf("您的输入有误");

switch(choice)
{
case 1:
        printf("请输入你要分配的作业名:\n");
    scanf("%d",&name);
    printf("请输入你要分配的作业所需空间的大小:\n");
    scanf("%f",&size);
    fenpei(name,size);
    getch();
    system("cls");
    break;
case 2:printf("请输入你要回收的作业名:\n");
    scanf("%d",&name);
    huishou(name);
    getch();
    system("cls");break;
case 3:show();
    getch();
    system("cls");break;
case 4:break;
default:;break;
}
}}

[ 本帖最后由 屎宝宝 于 2012-11-21 23:01 编辑 ]
搜索更多相关主题的帖子: address include 回收 
2012-11-21 22:33
快速回复:求高人相助,为什么不能分配啊。回收也有问题。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020695 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved