2013-10-29 107 views
-1

我想從b->數組中刪除元素,如下面的代碼所示:removeItem function 我試圖從b-> array = {11.11,12.12,13.13}中刪除12.12,但它導致了段錯誤印刷{11.11,13.13}。任何人都可以幫助擺脫它嗎?如何從C中的數組中刪除項目?

typedef struct 
{ 
    float val; 
}data; 

typedef struct 
{ 
    data **array; 
    int size; 
}bag; 
int main(int argc,char* argv[]) 
{ 

    bag *str = createBag(); 
    #ifdef DEBUG 
    printf("Inital values: %p %d\n",str->array,str->size); 
    #endif 
    data *iptr = createData(10.10); 
    data *iptr1 = createData(11.11); 
    data *iptr2 = createData(12.12); 
    data *iptr3 = createData(13.13); 
    data *iptr4 = createData(14.14); 
    #ifdef DEBUG 
    printf("%f\n",iptr->val); 
    #endif 
    addData(str,iptr); 
    addData(str,iptr1); 
    addData(str,iptr2); 
    addData(str,iptr3); 
    addData(str,iptr4); 
    printBag(str); 
    data *ptr = getData(str,4); 
    printf("Data item 4 is:%f\n",ptr->val); 
    int b = getBagSize(str); 
    printf("Size of bag: %d\n",b); 
    removeBack(str); 
    printBag(str); 
    removeFront(str); 
    printBag(str); 
    //cleanBag(str); 
    int s = searchBag(str,10.10); 
    printf("%d\n",s); 
    removeItem(str,12.12); 
    printBag(str); 
    return 0; 
} 


bag* createBag() 
{ 
    bag *str = (bag*)malloc(sizeof(bag)); 
    str->array = NULL; 
    str->size = 0; 
    return str; 
} 

data* createData(float v) 
{ 
    data *iptr = (data*)malloc(sizeof(data)); 
    iptr->val = v; 
    return iptr; 
} 

void addData(bag* b, data* d) 
{ 
    b->size++; 

    data** array1 = (data**)malloc(sizeof(data*)* b->size); 



    if(b->array!= NULL) 
    { 
     int i; 
     for(i = 0; i<b->size;i++) 
     { 
      array1[i] = b->array[i]; 
     } 
    } 

    free(b->array); 
    array1[b->size-1] = d; 

    b->array = array1; 

} 

void printBag(bag *b) 
{ 
    int i; 
    for(i=0; i<b->size;i++) 
    { 
     printf("%f\n",b->array[i]->val); 
    } 
} 

data* getData(bag *b, int pos) 
{ 

    if(pos>5) 
    { 
     printf("change array position\n"); 
    } 
    return b->array[pos]; 


} 

int getBagSize(bag *b) 
{ 
    return b->size; 

} 

void removeBack(bag *b) 
{ 
    b->size--; 
    free(b->array[b->size]); 

    data **array2 = (data**)malloc(sizeof(data*)* b->size); 

    if(b->array!= NULL) 
    { 
     int i; 
     for(i = 0; i<b->size;i++) 
     { 
      array2[i] = b->array[i]; 
      #ifdef DEBUG 
      printf("%f\n",array2[i]->val); 
      #endif 
     } 

    free(b->array); 
    b->array = array2; 
    } 
} 

void removeFront(bag *b) 
{ 
    b->size--; 
    free(b->array[0]); 

    data **array2 = (data**)malloc(sizeof(data*)* b->size); 

    if(b->array!= NULL) 
    { 
     int i; 
     for(i = 0; i<b->size;i++) 
     { 
      array2[i] = b->array[i+1]; 
      #ifdef DEBUG 
      printf("%f\n",array2[i]->val); 
      #endif 
     } 

    free(b->array); 
    b->array = array2; 
    } 

} 
/*void cleanBag(bag *b) 
{ 
    int i; 
    for(i=0;i<b->size;i++) 
    { 
     free(b->array[i]); 
    } 
    free(b->array); 
    free(b);   
}*/ 

int searchBag(bag *b,float v) 
{ 
    int i; 
    for(i=0;i<b->size;i++) 
    { 

     if(b->array[i]->val==v) 
     { 
      return (i+1); 
     } 
    } 
    return -1; 
} 

void removeItem(bag *b, float v) 
{ 
    int flag = 0,i = 0; 

    flag = searchBag(b,v); 
    if(flag != -1) 
    { 
     data **array2 = (data**)malloc(sizeof(data*)*(b->size-1)); 

     for(i = 0; i < (b->size); i++) 
     { 
      if(i == (flag-1)) 
      { 
       i = i + 1; 
       continue; 
      } 

      array2[i] = b->array[i]; 
     } 
     free(b->array); 
     b->size--; 
     b->array = array2; 
    } 
    else 
    { 
     printf("Element is not found\n"); 
    } 
} 
+1

一個錯誤/缺陷:searchBag返回「0」如果浮動沒有找到,但在removeItem你測試'if(flag!= -1)'。它應該是'if(flag!= 0)',對嗎? – elgonzo

+0

您是否嘗試過使用調試器單步執行代碼以查看發生了什麼? – GWW

+0

此外,我不認爲我們可以比較兩個浮動==運算符,因爲它是不太可能是真實的。 – sraok

回答

0

你的代碼有兩個錯誤。

  1. searchBag返回0,如果浮點值未在袋子中。 但是,功能removeItem測試if(flag != -1)。它應該測試if(flag != 0)

  2. seg的原因。遇到的故障還在於removeItem函數。 請注意,分配給array2的內存僅適用於b-> size-1元素。此數組的有效數組索引的範圍爲0 ... b-> size-2。 現在,看看for循環,你會注意到索引變量i將從0運行到b-> size-1。在上一次迭代中,我將變成b-> size-1,所以代碼試圖在array2[b->size-1]位置寫入,這超出了array2的分配內存。


的removeItem的可能修復功能看起來是這樣的:

在你的代碼
void removeItem(bag *b, float v) 
{ 
    int flag = 0; 
    int oldArrayIndex = 0; 
    int newArrayIndex = 0; 

    flag = searchBag(b,v); 
    if(flag != 0) 
    { 
     data **array2 = (data**) malloc(sizeof(data*)*(b->size-1)); 

     for(oldArrayIndex = 0; oldArrayIndex < (b->size); oldArrayIndex++) 
     { 
      if(oldArrayIndex != (flag-1)) 
      { 
       array2[newArrayIndex] = b->array[oldArrayIndex]; 
       newArrayIndex++; 
      } 
     } 
     free(b->array); 
     b->size--; 
     b->array = array2; 
    } 
    else 
    { 
     printf("Element is not found\n"); 
    } 
} 
+0

(i!=(flag-1))我在這裏是什麼? – RHN

+0

我已經嘗試過ur代碼,但der是一個probelm裏面,如果我將有1.0 2.0 ..... 5.0元素在數組中,如果m試圖刪除4.0,然後根據你的代碼它刪除3.0,爲5.0它刪除4.0 。 – RHN

+0

@RHN,我的示例代碼基於上述問題中實現的_searchBag_函數。你改變了searchBag功能嗎? – elgonzo