试验三里路

该代码实现了一个简单的内存管理系统,使用链表结构存储内存块信息。Initblock初始化内存,First_fit执行首次适应算法进行内存分配,recovery函数处理内存回收,show打印内存状态。用户可以进行内存分配和回收操作。
摘要由CSDN通过智能技术生成
#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值