【操作系统】Link.h

/************************************************************************/
/* 功能:  模拟实现可变分区存储管理的最佳适应算法的链表类
时间: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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值