游客 Signup | Login
中文 | En

1262 - C语言10.32

编写一个函数alloc(n),用来在内存区新开辟一个连续的空间(n个字节)。此函数的返回值是一个指针,指向新开辟的连续空间的起始地址。再写一个函数free(p),将地址p开始的各单元释放(不能再被程序使用,除非再度开辟)。

大致实现方法如下:
首先在内存区域中确定出一片相当大的连续空间(例如1000字节或更多)。然后开辟与释放操作都在此空间内进行。假设指针变量p原本已经指向未用空间的开头,调用alloc(n)之后,开辟了n个字节可供程序使用(例如,可以赋值到这些单元中)。现在需要使p的值变成p+n,表示空白未用的区域从p+n地址开始,同时要将新开辟的区域的起始位置p作为函数值返回,以表示可以利用从此点开始的单元。如果要新开辟的区域太大,超过了预设的空间,则alloc(n)函数应当返回指针NULL,表示开辟内存失败。
alloc(n)应返回一个指向字符型数据的指针(因为开辟的区间是以字节为单位被利用的)。

Input

第一行包含两个用空格隔开的正整数m和n。m表示初始时内存区域中的连续空间大小(单位为字节),n表示之后有n个alloc函数的调用。保证m<=10000,n<=100。

第二行包含n个用空格隔开的正整数,按顺序表示每一次alloc函数调用时传入的参数。

Output

在一行内输出n个整数,在每一个整数后输出一个空格。这些整数表示每一次alloc函数调用之后返回值的10进制表示。在本题中,假设NULL指针的10进制整数表示为0,初始时连续空间的开始指针的10进制表示为1。

请注意行尾输出换行。

Examples

Input

1000 4
100 200 300 401

Output

1 101 301 0 

Solution C++

#include <stdio.h>
#include <stdlib.h>
/* memory指针记录当前可用地址的起始地址
   start_of_memory指针记录原始内存空间的起始地址
   end_of_memory指针记录原始内存空间的结束地址 */
char *memory, *start_of_memory, *end_of_memory;
int main() {
	char *alloc(int n);
	void tryfree(char *p);
	char *result;
	int m, n, i, new_block_size;
	scanf("%d %d", &m, &n);
	memory = (char *)malloc(m);
	start_of_memory = memory;
	end_of_memory = memory + m;
	for (i = 0;i < n;i++) {
		scanf("%d", &new_block_size);
		result = alloc(new_block_size);
		if (result == NULL)
			printf("%d ", 0);
		else
			printf("%d ", 1 + (result - start_of_memory));
	}
	printf("\n");
	return 0;
}
/* 内存分配函数 */
char *alloc(int n) {
	char *result = NULL;
	if (memory + n <= end_of_memory) {
		result = memory;
		memory += n;
	}
	return result;
}
/* 内存释放函数 */
void tryfree(char *p) {
	while (p < memory) {
		tryfree(p);
		p++;
	}
}

Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题