【问题标题】:delete operation for a dynamical array in CC中动态数组的删除操作
【发布时间】: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 取消引用,这是未定义的行为。

标签: c arrays dynamic


【解决方案1】:

您可以找到要删除的元素的索引(或提供索引作为函数的参数),例如索引 i。然后你会想要将元素从位置 i+1 移动到位置 i 从而覆盖你试图删除的元素。然后你会增加 i 并继续一个一个地移动元素,直到你到达数组的末尾。之后,您可以将数组重新分配为短 1 个元素或检查当前元素编号是否为 n/2 并重新分配到一半大小。

其他选项是已经建议的解决方案,用于创建一个新的较短数组并复制除您要删除的元素之外的所有元素,然后将指针从最后一个数组更改为这个新数组(并释放最后一个数组的内存)。

【讨论】:

  • 这听起来不错!但我只想在元素 == 数组大小/2 时修复数组的大小
  • 那么,如果处理后的元素数量如您所说,数组/ 2 的大小,您只会进行重新分配。如果不是这种情况,您只需要更新当前的元素数量(减少它)就可以了。
  • 所以在移动后检查是否为真,如果是,则调用减半函数
  • 当然,如果您希望使用第二个选项,您可以先检查新数组是否应该是当前数组大小的一半,然后进行相应操作。
  • @Rasty 完全正确。
【解决方案2】:
#include<stdio.h>

int deleteArr(int arr[],int index) {
  int i=-1,j;
  while(index != ++i);
  for(j=i;j<5;j++) {
    arr[j]=arr[j+1];
  }
  for(i=0;i<4;i++)
    printf("%d ",arr[i]);
}

int main() {
  int arr[5] = {10, 20, 34, 70, 50};
  deleteArr(arr,3);
}

这段代码展示了如何实现它的一个小想法。 DeleteArr 将数组连同要删除的元素的索引一起传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2016-04-12
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多