设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1072|回复: 9
打印 上一主题 下一主题

分析程序 大家来指点

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-6 01:52:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
这叫什么程序 有错误吗?能够运行吗?



#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX 32767
typedef struct node
{
int address,size;
struct node *next;
}RECT;
RECT *assignment(RECT *head,int application);
void acceptment1(RECT *head,RECT *back1);
void acceptment2(RECT *head,RECT *back1) ;
int backcheck(RECT *head,RECT *back1);
void print(RECT *head);
RECT *head,*back,*assign1,*p;
int application1,maxblocknum;
char way;
/*主函数*/
main()
{
char choose[10];
int check;
head=malloc(sizeof(RECT));
p=malloc(sizeof(RECT));
head->size=MAX;
head->address=0;
head->next=p;
maxblocknum=1;
p->size=MAX;
p->address=0;
p->next=NULL;
print(head);
printf("Enter the way(best or first(b/f)\n");
scanf("%c",&way);
do{
printf("Enter the assign or accept(as/ac)\n");
scanf("%s",choose); /*选择分配或回收*/
if(strcmp(choose,"as")==0)
{
printf("Input application:\n");
scanf("%d",&application1);
assign1=assignment(head,application1);
if(assign1->address==-1)
printf("Too large application!,assign fails!!\n\n");
else
printf("Success!!ADDRESS=%5d\n",assign1->address);
print(head);
}
else
if(strcmp(choose,"ac")==0) /*回收*/
{
back=malloc(sizeof(RECT));
printf("Input Adress and Size!!\n");
scanf("%d%d",&back->address,&back->size);
check=backcheck(head,back);
if(check==1)
{
if(tolower(way)=='f')/*首先适应算法*/
acceptment1(head,back); /*首先适应*/
else
acceptment2(head,back);/*最佳适应*/
print(head);
}
}
}while(!strcmp(choose,"as")||!strcmp(choose,"ac"));
}
/*分配函数*/
RECT *assignment(RECT *head,int application)
{
RECT *after,*before,*assign;
assign=malloc(sizeof(RECT));
assign->size=application;
assign->next=NULL;
if(application>head->size||application<=0)
assign->address=-1; /*申请无效*/
else
{
before=head;
after=head->next;
while(after->size<application)
{
before=before->next;
after=after->next;
}
if(after->size==application) /*结点大小等于申请大小则完全分配*/
{
if(after->size==head->size)
maxblocknum--;
before->next=after->next;
assign->address=after->address;
free(after);
}
else
{
if(after->size==head->size) maxblocknum--;
after->size=after->size-application; /*大于申请空间则截取相应大小分配*/
assign->address=after->address+after->size;
if(tolower(way)=='b')
{
before->next=after->next;
back=after;
acceptment2(head,back);
}
}
if(maxblocknum==0)
{
before=head;
head->size=0;
maxblocknum=1;
while(before!=NULL)
{
if(before->size>head->size)
{
head->size=before->size;
maxblocknum=1;
}
else
if(before->size==head->size)
maxblocknum++;
before=before->next;
}
}
}
assign1=assign;
return assign1;
}
void acceptment1(RECT *head,RECT *back1)/*首先适应*/
{
RECT *before,*after;
int insert;
before=head;
after=head->next;
insert=0;
while(!insert)
{
if((after==NULL)||
((back1->address<=after->address)&&
(back1->address>=before->address)))
{
before->next=back1;
back1->next=after;
insert=1;
}
else
{
before=before->next;
after=after->next;
}
}
if(back1->address==before->address+before->size)
{
before->size=before->size+back1->size;
before->next=back1->next;
free(back1);
back1=before;
}
if(after!=NULL&&(after->address==back1->address+back1->size))
{
back1->size=back1->size+after->size;
back1->next=after->next;
free(after);
}
if(head->size<back1->size)
{
head->size=back1->size;
maxblocknum=1;
}
else
if(head->size==back1->size)
maxblocknum++;
}
/*最佳适应*/
void acceptment2(RECT *head,RECT *back1)
{
RECT *before,*after;
int insert ;
insert=0;
before=head;
after=head->next;
if(head->next==NULL)
{
head->size=back1->size;
head->next=back1;
maxblocknum++;
back1->next=NULL;
}
else
{
while(after!=NULL)
if(back1->address==after->size+after->address)
{
before->next=after->next;
back->size=after->size+back1->size;
free(after);
after=NULL;
}
else
{
after=after->next;
before=before->next;
}
before=head;
after=head->next;
while(after!=NULL)
if(after->address==back1->size+back1->address)
{
back1->size=back1->size+after->size;
before->next=after->next;
free(after);
after=NULL;
}
else
{
before=before->next;
after=after->next;
}
before=head;
after=head->next;
do{
if(after==NULL||(after->size>back1->size))
{
before->next=back1;
back1->next=after;
insert=1;
}
else
{
before=before->next;
after=after->next;
}
}while(!insert);
if(head->size<back1->size)
{
head->size=back1->size;
maxblocknum++;
}
else
if(head->size==back1->size)
maxblocknum++;
}
}
void print(RECT *head)
{
RECT *before,*after;
int index,k;
before=head->next;
index=1;
if(head->next==NULL)
printf("NO part for assignment!!\n");
else
{
printf("*****index*******address********end*********size*****\n");
while(before!=NULL)
{
printf("----------------------------------------------------\n");
printf(" %-13d%-13d%-13d%-13d\n",index,before->address,before->address+before->size-1,before->size);
printf("----------------------------------------------------\n");
index++;
before=before->next;
}
}
}
int backcheck(RECT *head,RECT *back1)
{
RECT *before,*after;
int check=1;
if(back1->address<0||back1->size<0)
check=0;
before=head->next;
while((before!=NULL)&&check)
if(((back1->address<before->address)
&&(back1->address+back1->size>before->address))
||((back1->address>=before->address)
&&(back1->address<before->address+before->size)))
check=0;
else
before=before->next;
if(check==0)
printf("Error input!!\n");
return check;
}
10#
发表于 2009-11-6 01:52:57 | 只看该作者
去看看编程的规范。会提高你的程序可读性的。
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-6 01:52:55 | 只看该作者
才疏学浅,看不明白你这是做什么用的.
不过错误给你修改完了
问题就在于vc++环境下类似
head=malloc(sizeof(RECT));
这样写是错误的.
应写成
head=(RECT *)malloc(sizeof(RECT));
这是个定式具体为什么我也说不清
你把程序中所有调用malloc函数的语句在等号后面加个(RECT *)就没问题了.
我再慢慢看看你这代码是干什么的....
没注释累死了.
楼主有时间把代码实现的目的告诉我一下
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-6 01:52:54 | 只看该作者
我也没有编译器 现在 呵呵 你下个编译器就好了阿 很快的
我的电脑中毒了 什么都没有了 呵呵 这样看头大阿
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-6 01:52:53 | 只看该作者
帮帮吧 我也希望把它做好
无奈中
大家给看看哪有问题,帮忙解决一下!
谢谢各位了!
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-6 01:52:52 | 只看该作者
确实没什么耐心,

建议大家不要总贴大段大段的代码,具体到每个问题点上,大家才好帮助你!
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-6 01:52:51 | 只看该作者
这个是内存管理的程序吗?是最优适应算法吗?
有错误大家帮忙修改一下
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-6 01:52:49 | 只看该作者
那谁能帮忙编译一下 贴上来 解决下我的问题
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-6 01:52:48 | 只看该作者
太长了```````````````
回复 支持 反对

使用道具 举报

2#
发表于 2009-11-6 01:52:47 | 只看该作者
伙计,要说找茬的话你弄个编译器就OK了,大段大段的代码又没有注释,很少有人会耐心看的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-19 17:26 , Processed in 0.121998 second(s), 10 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表