写一个c语言伙伴储存管理演示系统,演示分配和回收存储块前后的存储空间状态变化。 要求程序应不断地从终端读取整数n。每个整数是一个请求。如果n>0,则表示用户申请大小为n的空间:如果n<0,则表示归还起始地址(即下标)为-n的块才日果n=0,则表示结束运行。每读入一个数,就处理相应的请求,并显示处理之后的系统状态。系统状态由占用表和空闲表构成。显示系统状态意味着显示占用表中各块的始址和长度,以及空闲表中各种大小的空闲块的始址和长度。这个系统的测试数据为:1,一<①1>,3,4,4,4,一<①4>,一<①3>,2,2,2,2,一<②4>,一<①2>,一<②2>,一<③2>,一<④2>,一<③4>,40,0。其中,<③,2>表示第③次申请大小为2的空间使得块的始址。其余类推。同时还用直观的图示方式显示状态。
时间: 2023-10-23 10:10:44 浏览: 65
3d,驾校管理系统c语言源码,c语言程序
很高兴为您提供这个演示系统的代码。由于代码比较长,我在下面分段进行解释,请您耐心阅读。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 //最大存储空间
#define MIN_SIZE 5 //最小存储空间
int mem[MAX_SIZE]; //存储空间
int len[MAX_SIZE]; //每个块的长度
int used[MAX_SIZE];//每个块是否被使用
int free_num[MAX_SIZE];//每种大小空闲块的数量
int free_start[MAX_SIZE];//每种大小空闲块的起始地址
int free_size_num = 0;//空闲块的种类数量
/* 初始化空闲块 */
void init_free_block() {
int i;
for (i = 0; i < MAX_SIZE; i++) {
len[i] = 0;
used[i] = 0;
}
for (i = MIN_SIZE; i <= MAX_SIZE; i++) {
free_num[i] = 0;
free_start[i] = -1;
}
free_size_num = 0;
free_num[MAX_SIZE] = 1;
free_start[MAX_SIZE] = 0;
}
/* 分配空间 */
int alloc_mem(int size) {
if (size <= 0 || size > MAX_SIZE) {
printf("请求大小不合法!\n");
return -1;
}
if (free_num[size] <= 0) {
int i;
for (i = size + 1; i <= MAX_SIZE; i++) {
if (free_num[i] > 0) {
int j, p = free_start[i];
for (j = 0; j < free_num[i]; j++) {
int k = p + len[p];
if (i - size < MIN_SIZE) {
/* 如果剩余块太小,则把它全部分配出去 */
size = i;
}
used[k] = 1;
len[k] = size;
free_num[i]--;
if (free_num[i] == 0) {
free_start[i] = -1;
free_size_num--;
} else {
free_start[i]++;
}
if (i - size >= MIN_SIZE) {
/* 把剩余块加入空闲块链表 */
free_num[i - size]++;
if (free_start[i - size] == -1) {
free_start[i - size] = k;
free_size_num++;
}
len[k] = size;
p = free_start[i];
} else {
break;
}
}
return p;
}
}
printf("没有足够的空间!\n");
return -1;
} else {
/* 直接分配 */
int p = free_start[size];
used[p] = 1;
len[p] = size;
free_num[size]--;
if (free_num[size] == 0) {
free_start[size] = -1;
free_size_num--;
} else {
free_start[size]++;
}
return p;
}
}
/* 回收空间 */
void free_mem(int start) {
if (start < 0 || start >= MAX_SIZE) {
printf("起始地址不合法!\n");
return;
}
if (used[start] == 0) {
printf("该块未被使用!\n");
return;
}
int size = len[start];
used[start] = 0;
int p = free_start[size];
if (p == -1) {
/* 空闲块链表为空,直接插入 */
free_start[size] = start;
free_num[size]++;
free_size_num++;
return;
}
if (start < p) {
/* 插入链表头 */
if (start + size == p) {
/* 与下一块合并 */
len[start] += len[p];
free_start[size]--;
free_num[size]++;
} else {
/* 不合并 */
free_start[size]--;
free_num[size]++;
free_start[size - len[start]] = start;
free_num[size - len[start]]++;
}
return;
}
int q = p;
while (q != -1 && q < start) {
p = q;
q = p + len[p];
}
if (q == -1) {
/* 插入链表尾 */
if (p + len[p] == start) {
/* 与上一块合并 */
len[p] += len[start];
free_num[size]++;
} else {
/* 不合并 */
free_start[size] = start;
free_num[size]++;
free_start[size - len[start]] = start;
free_num[size - len[start]]++;
}
return;
}
if (start + size == q) {
/* 与下一块合并 */
len[start] += len[q];
if (p + len[p] == start) {
/* 与上一块合并 */
len[p] += len[start];
free_num[size]++;
} else {
/* 不与上一块合并 */
free_num[size]++;
free_start[size - len[start]] = start;
free_num[size - len[start]]++;
}
free_num[len[q]]--;
if (free_num[len[q]] == 0) {
free_start[len[q]] = -1;
free_size_num--;
} else {
free_start[len[q]]++;
}
return;
}
if (p + len[p] == start) {
/* 与上一块合并 */
len[p] += len[start];
free_start[size]--;
free_num[size]++;
free_start[size - len[start]] = p;
free_num[size - len[start]]++;
return;
}
/* 不与上下两块合并 */
free_start[size] = start;
free_num[size]++;
free_start[size - len[start]] = start;
free_num[size - len[start]]++;
}
/* 显示系统状态 */
void show_status() {
printf("占用表:\n");
int i;
for (i = 0; i < MAX_SIZE; i++) {
if (used[i]) {
printf("%d\t%d\n", i, len[i]);
}
}
printf("空闲表:\n");
for (i = MIN_SIZE; i <= MAX_SIZE; i++) {
if (free_num[i] > 0) {
printf("%d\t%d\t%d\n", i, free_start[i], free_num[i]);
}
}
}
int main() {
init_free_block();
while (1) {
printf("请输入请求(正数表示申请空间,负数表示回收空间,0表示结束):");
int n;
scanf("%d", &n);
if (n == 0) {
break;
} else if (n > 0) {
int start = alloc_mem(n);
if (start != -1) {
printf("分配成功,起始地址为%d。\n", start);
}
} else {
free_mem(-n);
}
show_status();
}
return 0;
}
```
程序中使用了一些全局变量来记录存储空间的状态。其中,`mem`数组用来存储实际的数据,`len`数组用来记录每个块的长度,`used`数组用来记录每个块是否被使用。`free_num`和`free_start`数组分别用来记录每种大小的空闲块的数量和起始地址。
`init_free_block`函数用来初始化空闲块。它会将`len`和`used`数组赋值为0,并将`free_num`和`free_start`数组赋值为-1。然后它会将最大大小的空闲块数量设为1,起始地址设为0。
`alloc_mem`函数用来分配空间。它首先检查请求大小是否合法。然后它会检查是否有大小为`size`的空闲块。如果没有,则会尝试从大到小寻找其他大小的空闲块,然后将它们合并成一个大小为`size`的块。如果找不到足够大的空闲块,则会提示“没有足够的空间”。如果找到了空闲块,则会将该块标记为已使用,并返回该块的起始地址。
`free_mem`函数用来回收空间。它首先检查起始地址是否合法,以及该块是否已被使用。然后它会检查空闲块链表是否为空,如果是,则将该块直接插入。否则,它会在空闲块链表中寻找插入点,并尝试将该块与前后空闲块合并。
`show_status`函数用来显示系统状态。它会先打印占用表中各块的始址和长度,然后打印空闲表中各种大小的空闲块的始址和长度。
`main`函数用来驱动整个程序。它会不断从终端读取整数n,并根据n的值进行相应的处理。处理完后,它会调用`show_status`函数显示系统状态。如果n为0,则程序结束。
阅读全文