#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; }
来源:https://www.cnblogs.com/lohh/p/11980636.html