动态分区分配算法代码c语言
时间: 2023-11-24 09:49:32 浏览: 71
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int start_addr;
int size;
int is_free;
} Partition;
Partition partitions[MAX_SIZE];
int num_partitions = 0;
void init_partitions() {
num_partitions = 1;
partitions[0].start_addr = 0;
partitions[0].size = MAX_SIZE;
partitions[0].is_free = 1;
}
void print_partitions() {
printf("Partitions:\n");
for (int i = 0; i < num_partitions; i++) {
printf("Partition %d: start_addr=%d, size=%d, is_free=%d\n", i, partitions[i].start_addr, partitions[i].size, partitions[i].is_free);
}
}
int allocate_partition(int size) {
for (int i = 0; i < num_partitions; i++) {
if (partitions[i].is_free && partitions[i].size >= size) {
int start_addr = partitions[i].start_addr;
partitions[i].start_addr += size;
partitions[i].size -= size;
if (partitions[i].size == 0) {
partitions[i].is_free = 0;
}
else {
Partition new_partition = {start_addr + size, partitions[i].size, 1};
partitions[num_partitions++] = new_partition;
}
return start_addr;
}
}
return -1;
}
void deallocate_partition(int start_addr) {
for (int i = 0; i < num_partitions; i++) {
if (partitions[i].start_addr == start_addr) {
partitions[i].is_free = 1;
if (i > 0 && partitions[i-1].is_free) {
partitions[i-1].size += partitions[i].size;
for (int j = i; j < num_partitions-1; j++) {
partitions[j] = partitions[j+1];
}
num_partitions--;
i--;
}
if (i < num_partitions-1 && partitions[i+1].is_free) {
partitions[i].size += partitions[i+1].size;
for (int j = i+1; j < num_partitions-1; j++) {
partitions[j] = partitions[j+1];
}
num_partitions--;
}
break;
}
}
}
int main() {
init_partitions();
print_partitions();
int addr1 = allocate_partition(20);
printf("Allocated partition at address %d\n", addr1);
print_partitions();
int addr2 = allocate_partition(30);
printf("Allocated partition at address %d\n", addr2);
print_partitions();
deallocate_partition(addr1);
printf("Deallocated partition at address %d\n", addr1);
print_partitions();
int addr3 = allocate_partition(10);
printf("Allocated partition at address %d\n", addr3);
print_partitions();
return 0;
}
```