/************************************************************************/
/* 功能: 模拟实现可变分区存储管理的最佳适应算法的链表类
时间:2014年9月1日21:57:21
作者:信管1201 1205020116 肖锋 */
/************************************************************************/
#ifndef LINK_H_INCLUDED
#define LINK_H_INCLUDED
class busyLink;
//自由分区链表
class freeLink
{
friend class busyLink;
struct Node
{
int size, adress; //分别是节点内存的大小和起始地址
char name = 'O'; //这块节点的名字
Node* next; //指向下一个节点
//构造函数
Node(int sze, int adres, char nme, Node* nxt) : size(sze), adress(adres), name(nme), next(nxt) {}
//添加set和get函数
int getSize() { return size; }
void setSize(int sze){ size = sze; }
int getAdress() { return adress; }
void setAdress(int adres) { adress = adres; }
char getName() { return name; }
void setName(char nme) { name = nme; }
Node* getNext() { return next; }
void setNext(Node* nxt) { next = nxt; }
};
Node* head; //链表的头部指针
Node* tail; //链表的尾部指针
Node* getNode(int index);
void swap(int index1, int index2); //交换连个节点的信息
public:
//构造函数初始化
freeLink()
{
//初始化的时候会为链表自动添加系统所占用的内存
int os = 576;
char oname = 'O';
int adres = 64;
head = new Node(0, 0, oname, new Node(os, adres, oname, nullptr));
tail = head->next;
}
//显示当前的分区
void show();
//内存地址相同的时候的碎片拼接
void pingJie();
//添加一个Node,等会选择插入的地点
void addNode(int size, int adress);
//删除Node
//Node* popNode(char name);
//得到头指针
const freeLink::Node* getHead() { return head; }
//得到尾指针
freeLink::Node* getTail() { return tail; }
//设置第i个节点
void setNode(int index, int size, int adress);
//找到要修改的节点是第几位]
int getNeedGai(int size);
//得到第index位的size
int getNeedSize(int index);
//得到index节点的地址
int getNeedAdress(int index);
//去除对应的节点
void popNeed(int index);
//合并全部空闲的节点
void heBing(int allFreeAdress);
//删除尾部节点的函数
void popTail();
//循环首次适应
void setNeed(int index, int size);
//首次循环适应算法的添加,就是尾部添加
void addNode2(int size, int adress);
//给自由链表前后的合并分区,循环首次适应算法
void pingJie2();
//友元,算法内存分配
//friend void requireMemo(char name, int size);
//友元,算法回收内存
//friend void freeMemo(char name);
};
//作业占据的分区链表
class busyLink
{
friend class freeLink;
struct Node
{
int size, adress; //分别是节点内存的大小和起始地址
char name = 'O'; //这块节点的名字
Node* next; //指向下一个节点
//构造函数
Node(int sze, int adres, char nme, Node* nxt) : size(sze), adress(adres), name(nme), next(nxt) {}
//添加set和get函数
int getSize() { return size; }
void setSize(int sze){ size = sze; }
int getAdress() { return adress; }
void setAdress(int adres) { adress = adres; }
char getName() { return name; }
void setName(char nme) { name = nme; }
Node* getNext() { return next; }
void setNext(Node* nxt) { next = nxt; }
};
Node* head; //链表的头部指针
Node* tail; //链表的尾部指针
public:
//构造函数初始化
busyLink()
{
//初始化的时候会为链表自动添加系统所占用的内存
int os = 64;
char oname = 'O';
int adres = 0;
head = new Node(0, 0, 'O', new Node(os, adres, oname, nullptr));
tail = head->next;
}
//显示当前的分区
void show();
//内存地址相同的时候的碎片拼接
//void pingJie();
//添加一个Node,等会选择插入的地点
void addNode(int size, int adress, char name);
//删除Node
void popNode(char name);
//得到头指针
const busyLink::Node* getHead() { return head; }
//得到尾指针
busyLink::Node* getTail() { return tail; }
//得到需要的该的节点的索引
int getNeedGai(char name);
//得到索引节点的size
int getNeedSize(int index);
//得到索引节点的adress
int getNeedAdress(int index);
//合并所有adress回收碎片,返回一个尾部节点的结束地址
int reAdress();
//友元,算法内存分配
//friend void requireMemo(char name, int size);
//友元,算法回收内存
//friend void freeMemo(char name);
};
#endif // LINK_H_INCLUDED
【操作系统】Link.h
最新推荐文章于 2022-04-20 11:37:06 发布