📄 2.6.c
字号:
/*
*
*Title:Problem2 主存空间的分配和回收
*Author:Fanbo
*Date :2005.4.1
*Student ID:200231500348
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
struct block{
char name[10]; //进程名
int start; //起址
int len; //长度
int state; //状态:0为未分配,1为已分配
struct block *next;
};
struct block *create(){
struct block *head,*temp,*present;
temp = (struct block *)malloc(sizeof(struct block));
strcpy(temp->name,"pro1");
temp->start = 5;
temp->len = 5;
temp->state = 1;
head = present = temp;
temp = (struct block *)malloc(sizeof(struct block));
strcpy(temp->name,"pro3");
temp->start = 10;
temp->len = 4;
temp->state = 1;
present->next = temp;
present = temp;
temp = (struct block *)malloc(sizeof(struct block));
strcpy(temp->name,"----");
temp->start = 14;
temp->len = 12;
temp->state = 0;
present->next = temp;
present = temp;
temp = (struct block *)malloc(sizeof(struct block));
strcpy(temp->name,"pro2");
temp->start = 26;
temp->len = 6;
temp->state = 1;
present->next = temp;
present = temp;
temp = (struct block *)malloc(sizeof(struct block));
strcpy(temp->name,"----");
temp->start = 32;
temp->len = 96;
temp->state = 0;
temp->next = NULL;
present->next = temp;
return head;
}
void main( void ){
int choice; //用户选择
int cap; //要求分配或者收回的空间大小
char proName[10];//进程名
struct block *head,*present,*temp;
head = create();
present = head;
while(1){
printf("\n=========分配和收回请求===========\n");
printf("\t1.分配一段空间给进程;\n");
printf("\t2.收回某段进程所占用的空间;\n");
printf("\t3.显示当前空间利用情况;\n");
printf("\t0.退出。\n");
printf("==================================\n");
printf("Your choice is:");
scanf("%d",&choice);
if(choice==0)
break;
while(choice!=0){
switch(choice){
case 1:
printf("\n输入要申请的进程名:");
scanf("%s",proName);
temp = head;
while(temp!=NULL){
if(strcmp(temp->name,proName)!=0)
temp = temp->next;
else break;
}
if(temp!=NULL){
printf("\n已经有一个名称为%s的进程!请重新输入一个进程名!\n",proName);
choice = 0;
break;
}
printf("\n该进程要申请的空间大小:");
scanf("%d",&cap);
printf("\n");
while(present!=NULL){
if((present->len>cap)&&(present->state==0)){
temp = (struct block *)malloc(sizeof(struct block));
temp->len = present->len - cap;
strcpy(temp->name,"----");
temp->state = 0;
temp->start = present->start + cap;
present->len = cap;
strcpy(present->name,proName);
present->state = 1;
temp->next = present->next;
present->next = temp;
break;
}
else
present = present->next;
}
if(present==NULL)
printf("\n没有足够的空间满足你的要求! :( 请申请一个较小的空间. *_*\n");
choice = 0;
break;
case 2:
printf("\n请输入要收回的进程:");
scanf("%s",proName);
temp = head;
//判断头结点是否满足条件
if(strcmp(temp->name,proName)==0){
if(temp->next->state==0){
strcpy(temp->name,"----");
temp->state = 0;
temp->len += temp->next->len;
temp->next = temp->next->next;
}
else{
strcpy(temp->name,"----");
temp->state = 0;
}
choice = 0;
break;
}
//temp = temp->next;
present = temp->next;
while(present!=NULL){
if(strcmp(present->name,proName)==0){ //找到满足条件的present结点
if(temp->state==0){ //前面一个为空结点
temp->len += present->len;
temp->next = present->next;
if(present->next->state==0){ //后面一个结点也为空
temp->len += present->next->len;
temp->next = present->next->next;
present = present->next->next;
}
}//if
else{
if(present->next->state==0){ //后面一个为空结点
present->len += present->next->len;
present->next = present->next->next;
}//if
present->state = 0;
strcpy(present->name,"----");
}//else
choice = 0;
break;
}//if
else{
temp = temp->next;
present = temp->next;
}//else
}//while
if(temp->next==NULL)
printf("\n :( 对不起!找不到这个进程!\n");
choice=0;
break;
case 3:
printf("\n目前的内存分配情况是: *_* \n");
printf("**************************************************\n");
printf("*\t进程名\t起址\t终址\t大小\t状态\t*\n");
temp = head;
while(temp!=NULL){
printf("*\t%s\t%d\t%d\t%d\t%s\t*\n",temp->name,temp->start,temp->start+temp->len,temp->len,(temp->state==0)?"free":"busy");
temp = temp->next;
}
printf("**************************************************\n");
choice = 0;
break;
default:
printf("输入错误! :( 必须输入0-3之间的数!请重试!\n");
choice = 0;
break;
}
}
}//while(1)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -