最佳适应算法的C 编程

最佳适应算法的C++编程

一.程序说明:

本程序在vc++6.0上运行通过,考虑到很多种情况.

(1)、我发现书上所说的当回收块与空闲块相连的那些情况,没有必要每种情况都写一个条件语句,然后用不同的语句来连接那些相连的内存块(这种做法见下面源程序中黑体字部分)。我使用的方法是在accept 时不考虑是否会和已存在的空闲块相连,直接将它回收,然后按照首地址大小排序,再利用link 函数将只要是相连的内存块都连起来。

(2)、当使用assign 函数分配空闲块时,如果空闲块正好被分完(即空闲块的SIZE=0)时打印输出的数据会是一组首地址和尾地址相等,而size=0的数据,这显然不符合逻辑,因为首地址等于尾地址时size=1,而不是零!所以我想到了两种办法让刚好被分配完的空闲块不输出,第一种办法(见以下注释部分的print()函数部分的函数)只是屏蔽掉了SIZE=0的数据,而它们还是存在,即没有被真正的消灭掉,只是仅仅没被打印出来,这种做法将产生一种致命的后果,当SIZE=0的数据项非常多时将占用很多系统资源,运行程序时可能会死机!第二种做法(即源程序中所使用的print 函数)才真正的将SIZE=0的数据项消灭掉。

(3)、程序中的accept 函数回收内存时,只要输入的想回收的内存块中有一个区域(哪怕是SIZE=1的一小块)已经存在于空闲内存块中时就会输出提示错误的信息,我认为这样不是很合理,accept函数应该能避开输入的想回收的内存块中的已经是空闲的区域而只对非空闲区域作回收工作,这个功能在我的程序没有实现。

二、源程序:

#include

#include

int k=4;

struct list

{

int num;

int adr;

int end;

int size; //初始化数据的结构体

}s[]={{1,1000,2999,2000},{2,500,799,300},{3,3500,3699,200},{4,4000,4499,500}};//初始化空闲分区

/*voidprint(structlist *p,intn)

{

int flag1=1;

int flag2=1;

int i,j=0;//print 函数作用输出结果

cout

for(i=0;i

{

if(p->size==0)

{

flag2=0;

j++;

continue;

}

else

flag2=1;

if(p->size!=0&&flag2!=0)

{

flag1=0;

cout

*//*}

}

if(flag1==1)//当所有的空闲块正好被分配完时

cout

cout

}*/

void print(structlist a[],intn)

{

int i;

cout

if(a[0].size==0)

{

for(i=0;i

{

a[i].adr=a[i+1].adr;

a[i].size=a[i+1].size;

a[i].end=a[i+1].end;

}

k=k-1;

}

if(k==0)

cout

for(i=0;i

cout

置:?cout

}

void link(structlist a[])

它们合并成一块*/

{

int i;

for(i=0;i

{

if(a[i].end==a[i+1].adr-1)/*当一块空闲内存的尾地址和下一块的首地址相连时,将

a[i].size=a[i].size+a[i+1].size;

a[i].end=a[i+1].end;

for(i=i+1;i

{

a[i].adr=a[i+1].adr;

a[i].size=a[i+1].size;

a[i].end=a[i+1].end;

}

k=k-1;

}

}

}

void order(structlist a[],intn)

地址大小排序

{

int i,j,adr,end,size;

for(i=1;i

{//order 函数将空闲内存块按空间块起始

for(adr=a[i].adr,size=a[i].size,end=a[i].end,j=i-1;j>=0&&adr

a[j+1].size=a[j].size;

a[j+1].adr=a[j].adr;

a[j+1].end=a[j].end;

}

a[j+1].adr=adr;

a[j+1].size=size;

a[j+1].end=end;

}

void sort(structlist a[],intn)

{

int i,j,size,adr,end;

for(i=1;i

{//sort 函数将空闲块按空间大小排序

for(size=a[i].size,adr=a[i].adr,end=a[i].end,j=i-1;j>=0&&size

a[j+1].size=a[j].size;

a[j+1].adr=a[j].adr;

a[j+1].end=a[j].end;

}

a[j+1].size=size;

a[j+1].adr=adr;

a[j+1].end=end;

}

}

void assign(structlist a[],intsize)

{

int i,flag=0;

for(i=0;i

if(size

{

flag=1;

a[i].adr=a[i].adr+size-1;

a[i].size=a[i].size-size;

sort(s,k);

print(s,k);

break;

}

if(flag==0)

{

cout

}

}

void accept(structlist a[],intfadd,int size)

{

int i,j,flag;

flag=0;

设置flag=1

for(i=0;i

{

for(j=a[i].adr;j

{

if(a[i].size==0)

break; //accept 函数用于回收内存空//当回收的内存不与其他已存在的内存空闲块相连的时候,//发现空闲块大小为空时跳出

if(j>=fadd&&j

内存时,提示错误。

{

cout

flag=1;

break;

}

}

if(flag==1)

}

/*if(((a[i].end+1)!=fadd)&&((fadd+size)==a[i+1].adr))//回

收区与插入点的后一个分区相连

{

a[i+1].size=a[i+1].size+size;

a[i+1].adr=fadd;

flag=0;

break;

}

if(i==0&&((fadd+size)==a[i].adr))//回收区与起始地址最小的空闲块相连{

a[i].adr=fadd;

a[i].size=a[i].size+size;

flag=0;

break;

}

if(((a[i].end+1)==fadd)&&((fadd+size)==a[i+1].adr))//回收的内存夹在两个空闲块之间

{

a[i].size=a[i].size+size+a[i+1].size;

a[i].end=a[i].adr+a[i].size-1;

for(i=i+1;i

{

a[i].adr=a[i+1].adr;

a[i].size=a[i+1].size;

a[i].end=a[i+1].end;

}

k=k-1;

flag=0;

}

}

if(flag==0)

{

a[k].num=k+1;

a[k].size=size;

a[k].adr=fadd;

a[k].end=fadd+size-1;

k=k+1;*/

cout

}

}

void main()

{

int size;

int fadd ;

int i=1;

cout

print(s,k);

cout

cout

sort(s,k);

print(s,k);

while(i)

{

cout

cout>i;

if(i==1)

{

cout

cin>>size;

assign(s,size);

}

else if(i==2)

{

cout>fadd;

cin>>size;

order(s,k);

accept(s,fadd,size);

order(s,k);

for(i=0;i

link(s);

sort(s,k);

print(s,k);

}

else if(i==3)

break;

else

cout

}

}

最佳适应算法的C++编程

一.程序说明:

本程序在vc++6.0上运行通过,考虑到很多种情况.

(1)、我发现书上所说的当回收块与空闲块相连的那些情况,没有必要每种情况都写一个条件语句,然后用不同的语句来连接那些相连的内存块(这种做法见下面源程序中黑体字部分)。我使用的方法是在accept 时不考虑是否会和已存在的空闲块相连,直接将它回收,然后按照首地址大小排序,再利用link 函数将只要是相连的内存块都连起来。

(2)、当使用assign 函数分配空闲块时,如果空闲块正好被分完(即空闲块的SIZE=0)时打印输出的数据会是一组首地址和尾地址相等,而size=0的数据,这显然不符合逻辑,因为首地址等于尾地址时size=1,而不是零!所以我想到了两种办法让刚好被分配完的空闲块不输出,第一种办法(见以下注释部分的print()函数部分的函数)只是屏蔽掉了SIZE=0的数据,而它们还是存在,即没有被真正的消灭掉,只是仅仅没被打印出来,这种做法将产生一种致命的后果,当SIZE=0的数据项非常多时将占用很多系统资源,运行程序时可能会死机!第二种做法(即源程序中所使用的print 函数)才真正的将SIZE=0的数据项消灭掉。

(3)、程序中的accept 函数回收内存时,只要输入的想回收的内存块中有一个区域(哪怕是SIZE=1的一小块)已经存在于空闲内存块中时就会输出提示错误的信息,我认为这样不是很合理,accept函数应该能避开输入的想回收的内存块中的已经是空闲的区域而只对非空闲区域作回收工作,这个功能在我的程序没有实现。

二、源程序:

#include

#include

int k=4;

struct list

{

int num;

int adr;

int end;

int size; //初始化数据的结构体

}s[]={{1,1000,2999,2000},{2,500,799,300},{3,3500,3699,200},{4,4000,4499,500}};//初始化空闲分区

/*voidprint(structlist *p,intn)

{

int flag1=1;

int flag2=1;

int i,j=0;//print 函数作用输出结果

cout

for(i=0;i

{

if(p->size==0)

{

flag2=0;

j++;

continue;

}

else

flag2=1;

if(p->size!=0&&flag2!=0)

{

flag1=0;

cout

*//*}

}

if(flag1==1)//当所有的空闲块正好被分配完时

cout

cout

}*/

void print(structlist a[],intn)

{

int i;

cout

if(a[0].size==0)

{

for(i=0;i

{

a[i].adr=a[i+1].adr;

a[i].size=a[i+1].size;

a[i].end=a[i+1].end;

}

k=k-1;

}

if(k==0)

cout

for(i=0;i

cout

置:?cout

}

void link(structlist a[])

它们合并成一块*/

{

int i;

for(i=0;i

{

if(a[i].end==a[i+1].adr-1)/*当一块空闲内存的尾地址和下一块的首地址相连时,将

a[i].size=a[i].size+a[i+1].size;

a[i].end=a[i+1].end;

for(i=i+1;i

{

a[i].adr=a[i+1].adr;

a[i].size=a[i+1].size;

a[i].end=a[i+1].end;

}

k=k-1;

}

}

}

void order(structlist a[],intn)

地址大小排序

{

int i,j,adr,end,size;

for(i=1;i

{//order 函数将空闲内存块按空间块起始

for(adr=a[i].adr,size=a[i].size,end=a[i].end,j=i-1;j>=0&&adr

a[j+1].size=a[j].size;

a[j+1].adr=a[j].adr;

a[j+1].end=a[j].end;

}

a[j+1].adr=adr;

a[j+1].size=size;

a[j+1].end=end;

}

void sort(structlist a[],intn)

{

int i,j,size,adr,end;

for(i=1;i

{//sort 函数将空闲块按空间大小排序

for(size=a[i].size,adr=a[i].adr,end=a[i].end,j=i-1;j>=0&&size

a[j+1].size=a[j].size;

a[j+1].adr=a[j].adr;

a[j+1].end=a[j].end;

}

a[j+1].size=size;

a[j+1].adr=adr;

a[j+1].end=end;

}

}

void assign(structlist a[],intsize)

{

int i,flag=0;

for(i=0;i

if(size

{

flag=1;

a[i].adr=a[i].adr+size-1;

a[i].size=a[i].size-size;

sort(s,k);

print(s,k);

break;

}

if(flag==0)

{

cout

}

}

void accept(structlist a[],intfadd,int size)

{

int i,j,flag;

flag=0;

设置flag=1

for(i=0;i

{

for(j=a[i].adr;j

{

if(a[i].size==0)

break; //accept 函数用于回收内存空//当回收的内存不与其他已存在的内存空闲块相连的时候,//发现空闲块大小为空时跳出

if(j>=fadd&&j

内存时,提示错误。

{

cout

flag=1;

break;

}

}

if(flag==1)

}

/*if(((a[i].end+1)!=fadd)&&((fadd+size)==a[i+1].adr))//回

收区与插入点的后一个分区相连

{

a[i+1].size=a[i+1].size+size;

a[i+1].adr=fadd;

flag=0;

break;

}

if(i==0&&((fadd+size)==a[i].adr))//回收区与起始地址最小的空闲块相连{

a[i].adr=fadd;

a[i].size=a[i].size+size;

flag=0;

break;

}

if(((a[i].end+1)==fadd)&&((fadd+size)==a[i+1].adr))//回收的内存夹在两个空闲块之间

{

a[i].size=a[i].size+size+a[i+1].size;

a[i].end=a[i].adr+a[i].size-1;

for(i=i+1;i

{

a[i].adr=a[i+1].adr;

a[i].size=a[i+1].size;

a[i].end=a[i+1].end;

}

k=k-1;

flag=0;

}

}

if(flag==0)

{

a[k].num=k+1;

a[k].size=size;

a[k].adr=fadd;

a[k].end=fadd+size-1;

k=k+1;*/

cout

}

}

void main()

{

int size;

int fadd ;

int i=1;

cout

print(s,k);

cout

cout

sort(s,k);

print(s,k);

while(i)

{

cout

cout>i;

if(i==1)

{

cout

cin>>size;

assign(s,size);

}

else if(i==2)

{

cout>fadd;

cin>>size;

order(s,k);

accept(s,fadd,size);

order(s,k);

for(i=0;i

link(s);

sort(s,k);

print(s,k);

}

else if(i==3)

break;

else

cout

}

}


相关文章

  • 十大经典数学模型
  • 十大经典数学模型 1.蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性,是比赛时必用的方法) 2.数据拟合.参数估计.插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而 ...查看


  • 自适应滤波原理
  • 自适应滤波器的算法研究及DSP仿真实现 1 自适应滤波器简介 自适应滤波器属于现代滤波器的范畴,自适应滤波器是相对固定滤波器而言的,固定滤波器属于经典滤波器,它滤波的频率是固定的,自适应滤波器滤波的频率则是自动适应输入信号而变化的,所以其适 ...查看


  • 高铁桥墩沉降预测模型的研究及应用_李沛鸿
  • 高铁桥墩沉降预测模型的研究及应用 李沛鸿1,李辰风1,刘陶胜1,辛四梅1 (1.江西理工大学 建筑与测绘工程学院,江西 赣州 341000) 摘 要:分析高铁的沉降观测数据,评价其安全状况至关重要.采用基因表达式编程(GEP)算法,将某高铁 ...查看


  • 通信技术--CHINA通信网 软件无线电
  • 软件无线电 (2002-10-16) 佘其炯 软件无线电的由来 软件无线电最初是在军事通信中提出的,软件无线电作为军用技术已有30年以上的历史,但是由于不同部队用于不同目的的无线电台在工作频段.调制方式上存在差异而无法互通.如果需要互通,就 ...查看


  • 基于并行粒子群优化算法的蛋白质二级结构预测
  • 第31卷第5期周口师范学院学报 2014年9月基于并行粒子群优化算法的蛋白质二级结构预测 周文刚1,毋红军2,孙 挺1 (1.周口师范学院计算机科学与技术学院,河南周口466001: 2.华北水利水电大学数学与信息科学学院,河南郑州4500 ...查看


  • 自适应滤波器论文
  • 自适应滤波器论文 1 绪 论 人类传递信息的主要媒介是语言和图像.据统计,在人类接受的信息中,听觉信息占20%,视觉信息占60%,其中如味觉.触觉.嗅觉总的加起来不过占20%,所以图像信息是十分重要的信息.然而,在图像的获取和图像信号的传输 ...查看


  • 高中数学二分法查找教案
  • 二分法查找教学设计 江苏省东台中学 朱世华 一.教学课题 第三章第三节<二分法查找>--算法与程序设计(新课标教科书:教育科学出版社) 二.教材及学者分析 <二分法查找>这部分知识在新课程数学必修1中已经涉及到,在前 ...查看


  • 遗传算法应用
  • 遗传算法应用 1 遗传算法概述 遗传算法(Genetic Algorithm)是一种通过模拟自然进化过程搜索最优解的方法,它是由美国 Michigan大学J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著<Adap ...查看


  • 光明市的菜篮子工程
  • 环游路径和单个路径(每次都从收购点出发)比较求解: 第三问应该以增加量最合理为目标函数进行求解. 光明市的菜篮子工程 摘要 光明市菜篮子工程的开销主要由蔬菜调运费用和短缺损失两部分组成,要使开销最小,就要使这两部分的费用总和最小.因此路径的 ...查看


热门内容