考虑具有以下属性的动态表:
将元素插入此动态表中。如果在push_back()
之前大小等于容量,则为双倍容量不要使用malloc或calloc函数。
输入:(n,元素)
9
6 7 8 12 4 10 11 1 15
输出:
capacity = 1; size = 1;要素= 6
capacity = 2; size = 2;要素= 6 7
容量= 4; size = 3;要素= 6 7 8
容量= 4; size = 4;要素= 6 7 8 12
容量= 8; size = 5;要素= 6 7 8 12 4
容量= 8; size = 6;要素= 6 7 8 12 4 10
容量= 8; size = 7;要素= 6 7 8 12 4 10 11
容量= 8; size = 8;要素= 6 7 8 12 4 10 11 1
容量= 16; size = 9;要素= 6 7 8 12 4 10 11 1 15
#include <stdio.h>
int size=0;
int capacity=0;
int * double_capacity(int *a) {
int l=0;
if(capacity==0) capacity++;
capacity=capacity*2;
int b[capacity];
for(l;l<size;l++){
//printf("%d : %d \n",l,a[l]);
b[l]=a[l];
}
return b;
}
int * push_back(int *a,int j) {
if(size==capacity)
a=double_capacity(a);
a[size]=j;
size++;
int k=0;
printf("capacity = %d; size = %d; elements = ",capacity,size);
for(k=0;k<size;k++) {
printf(" %d",*(a+k));
}
printf("\n");
return a;
}
main() {
int *a;
int n,i,j,k,l;
scanf("%d",&n);
int temp[n];
for(i=0; i<n; i++) {
scanf("%d",&temp[i]);
}
for(i=0; i<n; i++) {
a=push_back(a,temp[i]);
}
}
显示编译错误,如
\ temp.c:在函数'double_capacity'中:
temp.c:16:2:warning:函数返回局部变量的地址[-Wreturn-local-addr]
返回b;
^
即使我这样做了
当我提供输入时
3 3 2 1
输出
capacity = 1; size = 1;要素= 3
capacity = 2; size = 2;要素= 3 2
容量= 4; size = 3;要素= 3 2 1
当我提供输入时
5 5 4 3 2 1
输出
capacity = 1; size = 1;要素= 5
capacity = 2; size = 2;要素= 5 4
容量= 4; size = 3;要素= 5 4 3
容量= 4; size = 4; elements = 0 0 -2128976676 2
容量= 8; size = 5;要素= 0 0 -2128976676 32524 1
答案 0 :(得分:1)
这不会按您希望的方式运作:
int * double_capacity(int *a)
{
int l=0;
if(capacity==0)
capacity++;
capacity=capacity*2;
int b[capacity];
for(l;l<size;l++)
{
//printf("%d : %d \n",l,a[l]);
b[l]=a[l];
}
return b;
}
数组b
仅在double_capacity
函数的生命周期内存在;函数退出后,b
不再存在,任何指向它的指针现在都无效。
您不能以这种方式使用VLA。
我注意到您的说明没有说明realloc功能......
修改强>
如果您不能使用任何标准内存管理功能(malloc
,calloc
或realloc
),那么我能想到的唯一真正的替代方案是创建自己的内存池并从中分配表元素。
基本上,你会在文件范围内声明一大堆unsigned char
,如下所示:
#define HEAP_SIZE 8192 // 8 KB heap, use whatever size you need
static unsigned char heap[HEAP_SIZE];
然后你会抓住这个数组的块来构建你的表。您需要做一些簿记来管理可用和已分配的块,它们在该阵列中的地址和大小等等。如果您知道自己在做什么,这将是一天左右的坚实努力,取决于您想要它的强大程度成为。
然后,我可能会忘记一些更直接的事情。我现在想不起来。