-1

以下のコードに示すように、b->array から要素を削除したい: removeItem function 13.13}。誰かがそれを取り除くのを助けることができますか?

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");
    }
}
4

1 に答える 1