firel 发表于 2008-4-16 18:54

自己做的内存连续分配模拟程序!!!希望大家给些意见!!!谢谢

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define size 10
typedef struct lnode
{
        char name;
        int num;
        int address;
        int usize;
        struct lnode *next;
}node,*linknode;
linknode s,r;
int num=0,address=0;
void init_link()
{       
        linknode x;
        s=(linknode)malloc(sizeof(node));
        s->next=NULL;
        r=(linknode)malloc(sizeof(node));
        r->next=NULL;
        x=(linknode)malloc(sizeof(node));
        x->next=r->next;
        r->next=x;
        x->num=0;
        x->address=0;
        x->usize=1024;
        x->name=' ';
}
void share()
{       
        linknode p,q,f,h,g;
        char name1;
        int num1;
        p=(linknode)malloc(sizeof(node));
        printf("请输入进程名!!!!\n");
        scanf("%c",&name1);
        p->name=name1;
        p->num=num++;
        printf("请输入进程大小!!\n");
        scanf("%d",&num1);
        p->usize=num1;
        q=r->next;
        g=r;
        f=s->next;
        h=s;
        while(q!=NULL)
        {
                if(p->usize>q->usize)
                {
                        g=q;
                        q=q->next;
                }
                else
                        if((q->usize)-(p->usize)<=size)
                        {       
                                g->next=q->next;
                                break;
                        }
                        else
                        {
                                q->usize=(q->usize)-(p->usize);
                                p->address=q->address;
                                q->address=(q->address)+(p->usize);
                                break;
                        }
        }
        if(q!=NULL)
        {
                if(f==NULL)
                {
                        p->next=f;
                        s->next=p;
                }
                else
                {       
                        while(f!=NULL)
                        {
                                if(p->address<f->address)
                                {
                                        h->next=p;
                                        p->next=f;
                                        break;
                                }
                                        h=f;
                                f=f->next;
                        }
                        if(f==NULL)
                        {
                                p->next=f;
                                h->next=p;
                        }
                }
                printf("分配成功!!\n");
        }
        else
                printf("内存不足,无法分配!!\n");
}
void reback()
{       
        char a;
        linknode p,q,t;
        printf("请输入要回收的进程名!!!\n");
        scanf("%c",&a);
        p=s->next;
        q=s;
        while(p!=NULL)
        {       
                if(a==(p->name))
                {
                        q->next=p->next;
                        p->next=NULL;
                        break;
                }
                else
                {
                        q=p;
                        p=p->next;
                }
        }
        if(p==NULL)
                printf("无此进程\n");
        else
        {
                p->name=' ';
                p->num=0;
        t=r->next;
        q=r;
        while(t!=NULL)
        {
                if(t->address>p->address)
                {
                        q->next=p;
                        p->next=t;
                        break;
                }
                else
                {
                        q=t;
                        t=t->next;
                }
        }
        if(t==NULL)
        {
                p->next=NULL;
                q->next=p;
        }
        }
}
void zhengli()
{
        linknode p,q;
        p=r->next;
        q=r;
        while(p!=NULL)
        {
                if(q->address+q->usize==p->address)
                {
                        q->usize=q->usize+p->usize;
                        q->next=p->next;
                        p=p->next;
                }
                else
                {
                        q=p;
                        p=p->next;
                }
        }
}
void xianshi(linknode l)
{       
        linknode p;
        p=l->next;
        printf("进程名   分区号  起始地址 分区大小 \n");
        while(p!=NULL)
        {
                printf("%c      %8d%8d%8d\n",p->name,p->num,p->address,p->usize);
                p=p->next;
        }
}
void open()
{
        printf("*******************************************************\n");
        printf("******作者-------------------------冯亮****************\n");
        printf("******计算机---------------------0602班****************\n");
        printf("******平台-----------vc++6.0,windows xp****************\n");
        printf("*******************************************************\n");
        printf("请选择操作!!!!!!!!!!!!!!!\n");
        printf("0-------------------退出\n");
        printf("1-------------------分配内存\n");
        printf("2-------------------回收内存\n");
        printf("3-------------------显示内存使用情况\n");
        printf("4-------------------使用说明\n");
}
void readme()
{
        printf("*******************使用手册****************************\n");
        printf("***按提示输入你所要的操作******************************\n");
        printf("***进程名为一个字节************************************\n");
        printf("谢谢使用!!!^_^!!!!!!!*******************************\n");
        printf("*******************************************************\n\n");
}
main()
{
        int i=-1;
        init_link();
        while(i)
        {       
                open();
                scanf("%d",&i);
                getchar();
                switch(i)
                {
                case 0:
                        break;
                case 1:
                        share();
                        break;
                case 2:
                        reback();
                        zhengli();
                        break;
                case 3:
                        printf("进程队列****************************\n");
                        xianshi(s);
                        printf("************************************\n");
                        printf("空闲队列****************************\n");
                        xianshi(r);
                        printf("************************************\n");
                        break;
                case 4:
                        readme();
                        break;
                default :
                        printf("error\n");
                        break;
                }
        }
}

个人能力问题。。。没有注释不好意思

zjl138 发表于 2008-4-16 19:18

楼主也是大二啊,可见我真的落后了,我还写不出来,顶一个,谢谢分享。

firel 发表于 2008-4-16 19:20

其实我也很菜

大家一起努力

页: [1]

编程论坛