【发布时间】:2017-03-04 14:03:54
【问题描述】:
我正在 C 中实现一个动态整数数组。 我已经实现了 create,insert , doubleSize / halfSize / 使数组的大小加倍/减半,还有一个释放函数。我坚持删除函数的实现,它应该删除数组中的一个值,移动另一个,所以看起来这个值从未添加过,如果没有元素消失,则大小减半。这是代码:
#include <stdio.h>
#include <stdlib.h>
struct arr_st{
int *arrInts;
int size;
int elements;
};
void create(struct arr_st *a);
void print(struct arr_st *a);
void insert(struct arr_st *a,int value);
void doubleSize(struct arr_st *a);
void release(struct arr_st *a);
void halfSize(struct arr_st *a);
void delete(struct arr_st *a,int value);
int main(){
struct arr_st a;
create(&a);
print(&a);
insert(&a,1);
print(&a);
insert(&a,2);
insert(&a,3);
print(&a);
insert(&a,4);
print(&a);
insert(&a,5);
print(&a);
release(&a);
return 0;
}
void create(struct arr_st *a){
a->arrInts = (int *) malloc(sizeof(int));
a->size = 1;
a->elements = 0;
}
void print(struct arr_st *a){
printf("*******Arraystatus*******\n");
printf("Size : %d\n",a->size);
printf("Elements : %d\n",a->elements);
printf("Values:\n");
int i;
for(i = 0 ; i < a->elements ; i++)
printf("value[%d] = %d \n",i,a->arrInts[i]);
}
void doubleSize(struct arr_st *a){
int n = a->size * 2;
a->arrInts =(int *) realloc(a->arrInts,sizeof(int)*n);
a->size = n;
}
void insert(struct arr_st *a,int value){
int i = a->elements;
if(a->size > i){
a->arrInts[i] = value;
a->elements+=1;
}else{
doubleSize(a);
a->arrInts[i] = value;
a->elements+=1;
}
}
void release(struct arr_st *a){
free(a->arrInts);
}
void halfSize(struct arr_st *a){
if(a->elements == a->size / 2){
a->arrInts =(int *) realloc(a->arrInts,a->size/2);
a->size/=2;
}
}
void delete(struct arr_st *a,int value){
int i;
for( i = 0 ; i < a->elements ; i++){
if( a->arrInts[i] == value)
break;
}
//last element
if( i == a->elements - 1){
free(&(a->arrInts[i]));
a->elements-=1;
halfSize(a);
}else if( i == 0 ){ //first element
}
}
如何实现这个删除功能?
【问题讨论】:
-
要从数组中删除一个项目,您可以创建一个大小为 old-array - 1 的新数组,然后在第一个数组中添加所有值,同时跳过您不想要的值,然后将新数组分配给旧数组变量。所以你并没有真的删除它,但它已经足够接近了
-
你不能从数组中删除一个元素,你只能覆盖它。
-
请注意,如果
realloc()失败,您对realloc()的使用将导致内存泄漏。并非巧合的是,您的代码似乎假设[m/re]alloc()有无限的内存和地址空间可用。 -
@EOF 你有什么建议?我用 valgrind 测试了代码,没有内存泄漏。
-
@SHristoskov 我希望没有内存泄漏,因为那样也可能会有 NULL 取消引用,这是未定义的行为。