【C++基础复习02】双向链表实现动态分区分配算法

这是根据操作系统作业写的一个算法,用于模拟实现内存空间的动态分区分配,写的还是比较简单的。使用C++,创建双向链表来模拟动态分区,也当做是对C++链表的复习了。
首先来看具体动态分区结点的定义以及双向链表中方法的定义,具体需要用到的功能都如下所示:

#include<iostream>
#include<cstring>
using namespace std;
const int minsize=5; //允许的最小碎片空间大小为5 
struct node   //动态分区结点 
{  
    int space;  //空间大小 
    int address;  //分区首地址 
    bool status;  //状态号 
    node* prev;  
    node* next;  
}; 

class doublelink //双向链表类来存储
{
public:
doublelink(int sp[],int ad[],int i,bool st[]); //构造函数
void FF(doublelink* ptr,int size);//FF算法 首次适应算法
void BF(doublelink* ptr,int size);//BF算法 最佳适应算法
void WF(doublelink* ptr,int size);//WF算法 最坏适应算法
void display(doublelink* ptr); //显示
int getlength(doublelink* ptr); //获得链表长度
void bubble(doublelink* ptr); //将链表从小到大排序
void rebubble(doublelink* ptr);//将链表从大到小排序
void addressbubble(doublelink* ptr); //将链表按照首地址从小到大排序
void deletespace(doublelink* ptr,int i);//回收内存空间
private:
int length; //记录链表长度
node* root; //头结点
node* tail; //尾结点
};

接下来是关于函数的实现,具体的用法以及思路都写在注释中了:

doublelink::doublelink(int sp[],int ad[],int i,bool st[])
//构造函数的实现
 {
    root=new node;  //头结点中无数据 
    tail=new node;  //尾结点中无数据 
    root->prev=NULL;  //头结点前驱为NULL 
    tail->next=NULL;  //尾结点后继为NULL 
    root->status=1;   //将头尾结点均设置为永久占用状态,方便之后的排序用 
    tail->status=1;
    node *q;
    q=root;
    length=i;         //length记录链表的长度(不包括头和尾) 
    for(int j=0;j<i;j++) //利用数组构造结点 
    {
        node *p=new node;
        p->space=sp[j];
        p->address=ad[j];
        p->status=st[j];
        q->next=p;
        p->prev=q;
        q=q->next;
     }
     q->next=tail;          //记得将最后一个动态分区的后继结点指向尾结点 
 }


 int doublelink::getlength(doublelink *ptr)   //获得链表的长度 
 {
    return ptr->length;
  } 



  void doublelink::deletespace(doublelink* ptr,int e) //释放内存空间 
  {
       node *cur=root->next; //利用cur结点来遍历整个空间 
       int target=-1;   //初始化释放内存空间的大小为-1 
       for(int i=0;i<ptr->length;i++,cur=cur->next) //遍历寻找需要释放的结点 
       {
         if(cur->space==e)
         {
         target=e;        //如果找到,直接跳出循环,该节点就是Cur 
         break;
         }      
       }
       if(target==-1)        //遍历完没有发现需要删除的结点,则输出后直接返回 
       {
       cout<<"没有发现需要删除的内存空间"<<endl;
       return
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值