#include<stdio.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct free_table{
int num;
long address;
long length;
int state;
}ElemType;
typedef struct Node{
ElemType data;
struct Node*prior;
struct Node*next;
}Node,*LinkList;
LinkList first;
LinkList end;
int flag;
Status Initblock(){
first = (LinkList)malloc(sizeof(Node));
end = (LinkList)malloc(sizeof(Node));
first->prior = NULL;
first->next =end;
end->prior = first;
end->next = NULL;
end->data.num = 1;
end->data.address = 40;
end->data.length = 600;
end->data.state = 0;
return OK;
}
void sort(){
Node *p = first->next,*q;
q = p->next ;
for(;p != NULL;p = p->next){
for(q = p->next ;q;q = q->next ){
if(p->data.num >= q->data.num ){
q->data.num += 1;
}
}
}
}
void show(){
int flag = 0;
Node *p = first;
p->data.num = 0;
p->data.address = 0;
p->data.length = 40;
p->data.state = 1;
sort();
printf("\t主存空间分配情况\t\n");
printf("分区序号\t起始地址\t分区大小\t分区状态\n");
while(p){
printf("%d\t\t%d\t\t%d",p->data.num,p->data.address,p->data.length);
if(p->data.state == 0){
printf("\t\t空闲\n");
}
else{
printf("\t\t已分配\n\n");
}
p = p->next;
}
}
Status First_fit(int request){
Node *p = first->next;
LinkList temp = (LinkList)malloc(sizeof(Node));
temp->data.length = request;
temp->data.state = 1;
p->data.num = 1;
while(p){
if((p->data.state == 0) && (p->data.length == request)){
p->data.state = 1;
return OK;
break;
}
else if((p->data.state == 0) && (p->data.length > request)){
temp->prior = p->prior ;
temp->next = p;
temp->data.address = p->data.address;
temp->data.num = p->data.num ;
p->prior->next = temp;
p->prior = temp;
p->data.address = temp->data.address + temp->data.length ;
p->data.length -= request;
p->data.num += 1;
return OK;
break;
}
p = p->next ;
}
return ERROR;
}
Status allocation(int a){
int request;
printf("申请分配的主存大小:");
scanf("%d",&request);
if(request < 0 || request == 0){
printf("分配大小不合适,请重试!");
return ERROR;
}
if(First_fit(request) == OK){
printf("分配成功!");
}
else{
printf("内存不足,分配失败!");
}
return OK;
break;
}
Status deal1(Node *p){
Node *q = first;
for(;q != NULL;q = q->next ){
if(q == p){
if(q->prior->data.state == 0 && q->next->data.state != 0){
q->prior->data.length += q->data.length;
q->prior->next = q->next;
q->next ->prior = q->prior;
q = q->prior;
q->data.state = 0;
q->data.num = flag - 1;
}
if(q->prior->data.state != 0 && q->next->data.state == 0){
q->data.length += q->next->data.length;
q->next = q->next->next ;
q->next->next->prior = q;
q->data.state = 0;
q->data.num = flag;
}
if(q->prior->data.state == 0 && q->next->data.state == 0){
q->prior->data.length += q->data.length;
q->prior->next = q->next ;
q->next->prior = q->prior ;
q = q->prior ;
q->data.state = 0;
q->data.num = flag - 1;
}
if(q->prior->data.state != 0 && q->next->data.state != 0){
q->data.state = 0;
}
}
}
return OK;
}
Status deal2(Node *p){
Node *q = first;
for(;q != NULL;q = q->next ){
if(q == p){
if(q->prior->data.state == 0 && q->next->data.state != 0){
q->prior->data.length += q->data.length;
q->prior->next = q->next;
q->next ->prior = q->prior;
q = q->prior;
q->data.state = 0;
q->data.num = flag - 1;
}
if(q->prior->data.state != 0 && q->next->data.state == 0){
q->data.length += q->next->data.length;
q->next = q->next->next ;
q->next->next->prior = q;
q->data.state = 0;
q->data.num = flag;
}
if(q->prior->data.state == 0 && q->next->data.state == 0){
q->prior->data.length += q->data.length;
q->prior->next = q->next ;
q->next->prior = q->prior ;
q = q->prior ;
q->data.state = 0;
q->data.num = flag - 1;
}
if(q->prior->data.state != 0 && q->next->data.state != 0){
q->data.state = 0;
}
}
}
return OK;
}
Status recovery(int flag){
Node *p = first;
for(;p != NULL;p = p->next){
if(p->data.num ==flag){
if(p->prior == first){
if(p->next != end){
if(p->next->data.state == 0){
p->data.length += p->next->data.length ;
p->next->next->prior = p;
p->next = p->next->next;
p->data.state = 0;
p->data.num = flag;
}
else{
p->data.state = 0;
}
}
if(p->next == end){
p->data.state = 0;
}
}
else if(p->prior != first){
if(p->next != end){
deal1(p);
}
else{
deal2(p);
}
}
}
}
printf("回收成功!");
return OK;
}
void main(){
int i;
Initblock();
while(1){
show();
printf("1分配内存 2回收内存 0退出");
printf("请输入操作序号");
scanf("%d",&i);
if(i == 1){
allocation(1);
}
else if(i == 2){
printf("要释放的区号:");
scanf("%d",&flag);
recovery(flag);
}
else if(i == 0){
printf("退出程序");
break;
}
else{
printf("输入有误,请重试!");
continue;
}
return 0;
}
试验三里路
最新推荐文章于 2024-10-17 21:05:59 发布
该代码实现了一个简单的内存管理系统,使用链表结构存储内存块信息。Initblock初始化内存,First_fit执行首次适应算法进行内存分配,recovery函数处理内存回收,show打印内存状态。用户可以进行内存分配和回收操作。
摘要由CSDN通过智能技术生成