动态分区最佳-最坏-最先分配

眉间皱痕 提交于 2019-12-06 11:39:33
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
int maxsize;
int k[50];
typedef struct memory
{
    bool flage;
    string name;
    int start;
    int size;
    memory *front;
    memory *next;
}rd;
rd *line = new rd;
 
/*
struct node
{
string name;
string operate;
int size;
}node1,node2;
*/
 
void init()
{
    line->flage = 0;
    line->name = "空";
    line->start = 0;
    line->size = maxsize;
    line->front = NULL;
    line->next = NULL;
}
 
void display()
{
    rd *di = new rd;
    di = line;
    while (di != NULL)
    {
        cout << di->flage << "  " << di->name << "  " << di->start << "  " << di->size << endl;
        di = di->next;
    }
 
    /*
    while (q->front != NULL)
    {
    cout << q->front->flage << "  " << q->front->name << "  " << q->front->start << "  " << q->front->size << endl;
    q = q->front;
    }
    */
}
 
void firstmethod()
{
    cout << "请输入申请的主存大小:  " << endl;
    cin >> maxsize;
    init();
    display();
    while (true)
    {
        string operate;
        rd *temp = new rd;
        temp->front = NULL;
        temp->next = NULL;
        temp->flage = 1;
        cout << "请求名称( shutdown 为结束标识符 )" << endl;
        cin >> temp->name;
        cout << "请求类型( 申请  完成 )" << endl;
        cin >> operate;
        if (operate == "shutdown")
        {
            cout << "此次首次适应算法分配结束!" << endl;
            return;
        }
        else if (operate == "申请")
        {
            temp->start = 0;
            cout << "请求大小" << endl;
            cin >> temp->size;
            rd *p = new rd;
            p = line;
            while (p != NULL)
            {
                if (!p->flage && p->size >= temp->size)
                {
                    temp->start = p->start + (p->size - temp->size);
                    p->size -= temp->size;
                    if (p->next != NULL)
                    {
                        temp->next = p->next;
                        p->next->front = temp;
                    }
                    temp->front = p;
                    p->next = temp;
                }
                p = p->next;
            }
            display();
        }
        else if (operate == "完成")
        {
            rd *p = new rd;
            p = line;
            while (p != NULL)
            {
                if (p->name == temp->name)
                {
                    rd *q = new rd;
                    q->flage = 0;
                    q->name = "空";
                    q->start = 0;
                    q->size = maxsize;
                    q->front = NULL;
                    q->next = NULL;
        
                    if (p->front != NULL)
                    {   
                        q = p->front;
                        if (p->front->front != NULL) q->front = p->front->front;
                        else q->front = NULL;
                    }
                    if (!q->flage)
                    {
                        q->size += p->size;
 
                        if (p->next != NULL && !p->next->flage)
                        {
                            q->size += p->next->size;
                            if (q->next->next->next != NULL)
                            {
                                q->next->next->next->front = q;
                                q->next = q->next->next->next;
                            }
                            else
                            {
                                q->next = NULL;
                            }
                        }
                        else if (p->next != NULL)
                        {
                            q->next = p->next;
                        }
                        p = q->next;
                    }
                    else if (p->next != NULL && !p->next->flage)
                    {
                        p->size += p->next->size;
                        if (p->next->next != NULL)
                        {
                            p->next->next->front = p;
                            p->next = p->next->next;
                        }
                    }
                
                    else if (((p->front != NULL && p->front->flage) || (p->front == NULL) && ((p->next != NULL && p->next->flage) || (p->next == NULL))))
                    {
                        p->flage = 0;
                        p->name = "空";
                        if (p->next != NULL)
                        {
                            p->next->front = p->front;
                            p->front->next = p->next;
                        }
                    }
                }
                else p = p->next;
            }
            display();
        }
    }
}
 
void bestmethod()
{
    cout << "请输入申请的主存大小:  " << endl;
    cin >> maxsize;
    init();
    display();
    while (true)
    {
        string operate;
        rd *temp = new rd;
        temp->front = NULL;
        temp->next = NULL;
        temp->flage = 1;
        cout << "请求名称( shutdown 为结束标识符 )" << endl;
        cin >> temp->name;
        cout << "请求类型( 申请  完成 )" << endl;
        cin >> operate;
        if (operate == "shutdown")
        {
            cout << "此次首次适应算法分配结束!" << endl;
            return;
        }
        else if (operate == "申请")
        {
            temp->start = 0;
            cout << "请求大小" << endl;
            cin >> temp->size;
            memset(k, 0, sizeof(k));
            rd *order = new rd;
            order = line;
            int i = 0;
            int ok;
            while (order != NULL)
            {
                if(!order->flage) k[i++] = order->size;
            }
            sort(k, k + i);
            for (int j = 0; j < i; j++)
            {
                if (k[j] >= temp->size)
                {
                    ok = k[j];
                }
            }
 
            rd *q = new rd;
            q->front = NULL;
            q->next = NULL;
            q->size = 0;
            q->flage = 0;
            q->start = 0;
            q->name = temp->name;
 
            rd *p = new rd;
            p = line;
            i = 0;
            while (p != NULL)
            {
                if (p->size==ok)
                {
                    q = p;
                    break;
                }
                p = p->next;
            }
 
            if (q->size >= temp->size)
            {
                temp->start = q->start + (q->size - temp->size);
                q->size -= temp->size;
                cout << temp->start << "  " << q->size << "  " << line->size << endl;
                if (q->next != NULL)
                {
                    temp->next = q->next;
                    q->next->front = temp;
                }
                else
                {
                    temp->next = NULL;
                }
                temp->front = q;
                q->next = temp;
            }
            else
            {
                cout << "申请失败!!!" << endl;
            }
            display();
        }
        else if (operate == "完成")
        {
            rd *p = new rd;
            p = line;
            while (p != NULL)
            {
                if (p->name == temp->name)
                {
                    rd *q = new rd;
                    q->flage = 0;
                    q->name = "空";
                    q->start = 0;
                    q->size = maxsize;
                    q->front = NULL;
                    q->next = NULL;
 
                    if (p->front != NULL)
                    {
                        q = p->front;
                        if (p->front->front != NULL) q->front = p->front->front;
                        else q->front = NULL;
                    }
                    if (!q->flage)
                    {
                        q->size += p->size;
 
                        if (p->next != NULL && !p->next->flage)
                        {
                            q->size += p->next->size;
                            if (q->next->next->next != NULL)
                            {
                                q->next->next->next->front = q;
                                q->next = q->next->next->next;
                            }
                            else
                            {
                                q->next = NULL;
                            }
                        }
                        else if (p->next != NULL)
                        {
                            q->next = p->next;
                        }
                        p = q->next;
                    }
                    else if (p->next != NULL && !p->next->flage)
                    {
                        p->size += p->next->size;
                        if (p->next->next != NULL)
                        {
                            p->next->next->front = p;
                            p->next = p->next->next;
                        }
                    }
                    else if (((p->front != NULL && p->front->flage) || (p->front == NULL) && ((p->next != NULL && p->next->flage) || (p->next == NULL))))
                    {
                        p->flage = 0;
                        p->name = "空";
                        if (p->next != NULL)
                        {
                            p->next->front = p->front;
                            p->front->next = p->next;
                        }
                    }
                }
                else p = p->next;
            }
            display();
        }
    }
 
 
 
 
}
 
void badmethod()
{
    cout << "请输入申请的主存大小:  " << endl;
    cin >> maxsize;
    init();
    display();
    while (true)
    {
        string operate;
        rd *temp = new rd;
        temp->front = NULL;
        temp->next = NULL;
        temp->flage = 1;
        cout << "请求名称( shutdown 为结束标识符 )" << endl;
        cin >> temp->name;
        cout << "请求类型( 申请  完成 )" << endl;
        cin >> operate;
        if (operate == "shutdown")
        {
            cout << "此次首次适应算法分配结束!" << endl;
            return;
        }
        else if (operate == "申请")
        {
            temp->start = 0;
            cout << "请求大小" << endl;
            cin >> temp->size;
            
 
            rd *q = new rd;
            q->front = NULL;
            q->next = NULL;
            q->size = 0;
            q->flage = 0;
            q->start = 0;
            q->name = temp->name;
 
            rd *p = new rd;
            p = line;
            while (p != NULL)
            {
                if (!p->flage&&p->size > q->size)
                {
                    q = p;
                }
                p = p->next;
            }
 
            if (q->size >= temp->size)
            {
                temp->start = q->start + (q->size - temp->size);
                q->size -= temp->size;
                cout << temp->start << "  " << q->size <<"  "<<line->size<< endl;
                if (q->next != NULL)
                {
                    temp->next = q->next;       
                    q->next->front = temp;
                }
                else
                {
                    temp->next = NULL;
                }
                temp->front = q;
                q->next = temp;
            }
            else
            {
                cout << "申请失败!!!" << endl;
            }
            display();
        }
        else if (operate == "完成")
        {
            rd *p = new rd;
            p = line;
            while (p != NULL)
            {
                if (p->name == temp->name)
                {
                    rd *q = new rd;
                    q->flage = 0;
                    q->name = "空";
                    q->start = 0;
                    q->size = maxsize;
                    q->front = NULL;
                    q->next = NULL;
                
                    if (p->front != NULL)
                    {
                        q = p->front;
                        if (p->front->front != NULL) q->front = p->front->front;
                        else q->front = NULL;
                    }
                    if (!q->flage)
                    {
                        q->size += p->size;
 
                        if (p->next != NULL && !p->next->flage)
                        {
                            q->size += p->next->size;
                            if (q->next->next->next != NULL)
                            {
                                q->next->next->next->front = q;
                                q->next = q->next->next->next;
                            }
                            else
                            {
                                q->next = NULL;
                            }
                        }
                        else if (p->next != NULL)
                        {
                            q->next = p->next;
                        }
                        p = q->next;
                    }
                    else if (p->next != NULL && !p->next->flage)
                    {
                        p->size += p->next->size;
                        if (p->next->next != NULL)
                        {
                            p->next->next->front = p;
                            p->next = p->next->next;
                        }
                    }
                    else if(((p->front != NULL && p->front->flage) || (p->front == NULL) &&((p->next != NULL && p->next->flage)||(p->next==NULL))))
                    {
                        p->flage = 0;
                        p->name = "空";
                        if (p->next != NULL)
                        {
                            p->next->front = p->front;
                            p->front->next = p->next;
                        }
                    }
                }
                else p = p->next;
            }
            display();
        }
    }
}
 
int  main()
{
    cout << "      动态分区式存贮区管理 -- 王爱民      " << endl << endl;
    cout << "请输入放置策略序号 ①:首次 ②:最佳 ③:最坏" << endl;
    int n;
    cin >> n;
    switch (n)
    {
    case 1: firstmethod(); break;
    case 2: bestmethod(); break;
    case 3: badmethod(); break;
    default:cout << "请正确输入放置策略序号!!!" << endl; break;
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!