广工 操作系统课程设计 最佳适应算法、最坏适应算法、循环首次适应算法
时间:2025-07-10
时间:2025-07-10
动态分区分配算法仿真,循环首次适应算法、最佳适应算法、最坏适应算法
#include<iostream>
#include<iomanip>//在输入输出流中用到控制符
#include<windows.h>//用到了SetConsoleTextAttribute函数
#define minsize 2//事先规定的不再切割的剩余分区大小为2
using namespace std;
struct Node
{
int name;
int start;
int size;
int state;
Node *pre;
Node *next;
};
typedef struct Dlinklist
{
Node *head;
}Dlist;
//===================
Dlist pro,fre;
int memory,name,size,fit;
Node *temp=NULL;//temp是NestFit算法中的起始查寻指针
//===================
void initDlist(Dlist &L)//创建带有头结点的双向链表
{
L.head=new Node;
L.head->next=L.head->pre=NULL;
}
void MemoryInit()//初始化两个链表
{
initDlist(pro); //process链表
initDlist(fre); //free block链表
Node *p=new Node;
p->name=0;
p->start=0;
p->state=0;
p->size=memory;
p->next=NULL;//这里曾错写成p->pre..............
p->pre=fre.head;//这里曾漏写
fre.head->next=p;
}
int getLength(Dlist &L)//返回链表的长度,即元素的个数
int m=0;
Node *p=L.head->next;
while(p!=NULL)
{
m++;
p=p->next;
}
return m;
}
void arrangeSmaller(Dlist &L)//冒泡排序,链表按size进行排序,从小到大 {
int length=getLength(L);
for(int i=0; i<length-1; i++)//当链表中的元素个数>=2的时候才排序
{
Node *p=L.head->next;
Node *q=p->next;
int
a,b,c,d;//==========================================================================
for(int j=0; j<length-1-i; j++)
{
if(p->size>q->size) //交换位置,如果前面的大于后面的,使小的上浮,如果两个相等,则还是原来在前的保持在前
{
a=p->size;
p->size=q->size;
q->size=a;
b=p->name;
p->name=q->name;
q->name=b;
c=p->start;
p->start=q->start;
q->start=c;
d=p->state;//==========================================================================
p->state=q->state;
q->state=d;
}
p=p->next;
q=p->next;
}
}
void arrangeBigger(Dlist &L)//链表按size进行排序,从大到小
{
int length=getLength(L);
for(int i=0; i<length-1; i++)
{
Node *p=L.head->next;
Node *q=p->next;
int a,b,c,d;
for(int j=0; j<length-1-i; j++)
{
if(p->size<q->size)
{
a=p->size;
p->size=q->size;
q->size=a;
b=p->name;
p->name=q->name;
q->name=b;
c=p->start;
p->start=q->start;
q->start=c;
d=p->state;//==========================================================================
p->state=q->state;
q->state=d;
}
p=p->next;
q=p->next;
}
}
}
void arrangeStart(Dlist &L)//链表按start递增排序
{
int length=getLength(L);
for(int i=0; i<length-1; i++)
{
Node *p=L.head->next;
Node *q=p->next;
int a,b,c,d;
for(int j=0; j<length-1-i; j++)
{
if(p->start>q->start)
{
a=p->size;
p->size=q->size;
q->size=a;
b=p->name;
p->name=q->name;
q->name=b;
c=p->start;
p->start=q->start;
q->start=c;
d=p->state;//==========================================================================
p->state=q->state;
q->state=d;
}
p=p->next;
q=p->next;
}
}
}
void DlistInsert(Dlist &L,Node e) //在头结点之后插入元素,即L.head->next指向e {
Node *p=new Node;
p->name=http://www.77cn.com.cn;
p->size=e.size;
p->start=e.start;
p->state=e.state;
if(L.head->next!=NULL)//这是个值得注意的地方,L.head->next==NULL,则没有指针L.head->next->pre,如果这里不加判断的话,会出错
L.head->next->pre=p;
p->next=L.head->next;
p->pre=L.head;
L.head->next=p;
//双向链表,插入一个新的元素,如果元素不是插入在链尾,则一共要修改四次指针 }
void DlistDelete(Node *p,Node &e)//传递指针p,删除指针p指向的链表元素,用Node型变量e记录该元素的相关数据
{
http://www.77cn.com.cn=p->name;
e.start=p->start;
e.size=p->size;
e.state=p->state;
p->pre->next=p->next;//这里曾写成=p->pre....
if(p->next!=NULL)
p->next->pre=p->pre;//这里曾写成p->next->pre=p,留意
delete(p); //删除一个元素修改一次或两次指针
}
//=======================
void Green()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);}
void Red()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);}
void White()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);}
void Yellow()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);}
//=======================
void BestOrWorst()
{
arrangeStart(fre);//先按地址递增排序
if(fit==1)
上一篇:纳税筹划案例分析题
下一篇:行政事业单位固定资产折旧年限