C语言空闲盘块链与空闲盘区链代码展示
时间: 2024-05-15 21:19:26 浏览: 47
空闲盘块链代码:
```
struct free_block {
int block_num;
struct free_block *next;
};
struct free_block *free_block_list = NULL;
void init_free_block_list(int num_blocks) {
free_block_list = (struct free_block *)malloc(sizeof(struct free_block));
free_block_list->block_num = 0;
free_block_list->next = NULL;
struct free_block *current_block = free_block_list;
for (int i = 1; i < num_blocks; i++) {
current_block->next = (struct free_block *)malloc(sizeof(struct free_block));
current_block = current_block->next;
current_block->block_num = i;
current_block->next = NULL;
}
}
int get_free_block() {
if (free_block_list == NULL) {
return -1;
}
int block_num = free_block_list->block_num;
struct free_block *temp = free_block_list;
free_block_list = free_block_list->next;
free(temp);
return block_num;
}
void release_block(int block_num) {
struct free_block *new_block = (struct free_block *)malloc(sizeof(struct free_block));
new_block->block_num = block_num;
new_block->next = free_block_list;
free_block_list = new_block;
}
```
空闲盘区链代码:
```
struct free_area {
int start_block;
int num_blocks;
struct free_area *next;
};
struct free_area *free_area_list = NULL;
void init_free_area_list(int num_blocks) {
free_area_list = (struct free_area *)malloc(sizeof(struct free_area));
free_area_list->start_block = 0;
free_area_list->num_blocks = num_blocks;
free_area_list->next = NULL;
}
int get_free_blocks(int num_blocks) {
if (free_area_list == NULL) {
return -1;
}
struct free_area *current_area = free_area_list;
struct free_area *previous_area = NULL;
while (current_area != NULL) {
if (current_area->num_blocks >= num_blocks) {
int start_block = current_area->start_block;
current_area->start_block += num_blocks;
current_area->num_blocks -= num_blocks;
if (current_area->num_blocks == 0) {
if (previous_area == NULL) {
free_area_list = current_area->next;
} else {
previous_area->next = current_area->next;
}
free(current_area);
}
return start_block;
}
previous_area = current_area;
current_area = current_area->next;
}
return -1;
}
void release_blocks(int start_block, int num_blocks) {
struct free_area *new_area = (struct free_area *)malloc(sizeof(struct free_area));
new_area->start_block = start_block;
new_area->num_blocks = num_blocks;
new_area->next = NULL;
if (free_area_list == NULL) {
free_area_list = new_area;
return;
}
struct free_area *current_area = free_area_list;
struct free_area *previous_area = NULL;
while (current_area != NULL && current_area->start_block < start_block) {
previous_area = current_area;
current_area = current_area->next;
}
if (previous_area == NULL) {
new_area->next = free_area_list;
free_area_list = new_area;
} else if (start_block == previous_area->start_block + previous_area->num_blocks) {
previous_area->num_blocks += num_blocks;
if (current_area != NULL && start_block + num_blocks == current_area->start_block) {
previous_area->num_blocks += current_area->num_blocks;
previous_area->next = current_area->next;
free(current_area);
}
} else if (current_area != NULL && start_block + num_blocks == current_area->start_block) {
new_area->num_blocks += current_area->num_blocks;
new_area->next = current_area->next;
previous_area->next = new_area;
free(current_area);
} else {
new_area->next = current_area;
previous_area->next = new_area;
}
}
```