编写C语言程序,模拟实现首次/循环首次/最佳/最坏适应算法的内存块分配和回收,要求每次分配和回收后显示出空闲分区和已分配分区的情况
时间: 2024-01-30 16:02:25 浏览: 188
以下是C语言程序,模拟实现首次适应算法的内存块分配和回收,并显示出空闲分区和已分配分区的情况:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 1024 // 内存大小
#define MIN_SIZE 4 // 最小分配单位
// 内存块结构体
typedef struct block {
int size; // 大小
int start; // 起始地址
int is_free; // 是否空闲
struct block *next; // 下一个内存块
} Block;
Block *head = NULL; // 内存块链表头指针
// 初始化内存块链表
void init() {
head = (Block *)malloc(sizeof(Block));
head->size = MAX_SIZE;
head->start = 0;
head->is_free = 1;
head->next = NULL;
}
// 显示内存块链表
void show() {
Block *p = head;
printf("空闲分区:\n");
while (p != NULL) {
if (p->is_free) {
printf("起始地址:%d,大小:%d\n", p->start, p->size);
}
p = p->next;
}
p = head;
printf("已分配分区:\n");
while (p != NULL) {
if (!p->is_free) {
printf("起始地址:%d,大小:%d\n", p->start, p->size);
}
p = p->next;
}
}
// 首次适应算法分配内存
void first_fit(int size) {
Block *p = head;
while (p != NULL) {
if (p->is_free && p->size >= size) {
if (p->size == size) {
p->is_free = 0;
} else {
Block *new_block = (Block *)malloc(sizeof(Block));
new_block->size = size;
new_block->start = p->start;
new_block->is_free = 0; new_block->next = p->next;
p->next = new_block;
p->start += size;
p->size -= size;
}
printf("分配成功!\n");
show();
return;
}
p = p->next;
}
printf("分配失败!\n");
}
// 首次适应算法回收内存
void first_fit_free(int start) {
Block *p = head;
while (p != NULL) {
if (!p->is_free && p->start == start) {
p->is_free = 1;
printf("回收成功!\n");
show();
return;
}
p = p->next;
}
printf("回收失败!\n");
}
int main() {
init();
show();
first_fit(128);
first_fit(256);
first_fit(64);
first_fit_free(0);
first_fit(32);
first_fit(512);
first_fit_free(256);
return 0;
}
```
阅读全文