需要帮助使ArrayList在C中添加

问题描述

我不确定如何使用 arrlist_addat 在特定索引处添加到列表。我包括了其他一些方法和结构,以便您了解我的工作方式。如果添加方法,则必须返回一个布尔值true,如果失败则返回false。

感谢您的帮助,谢谢。

struct ArrayList {
    void** arr;
    int size;
    int maxSize;
    int itemSize;
    char* type;
};

struct ArrayList* arrlist_initialize(int maxSize,int itemSize,char* dataType) {
    struct ArrayList* list = malloc(sizeof(struct ArrayList));
    list->size = 0;
    list->maxSize = maxSize;
    list->itemSize = itemSize;
    list->type = dataType;
    list->arr = NULL;
    return list;
}

bool arrlist_add(struct ArrayList* list,void* element) {
    void** data = realloc(list->arr,sizeof(*list->arr));
    if (data == NULL)
        return false;
    data[list->size] = element;
    list->arr = data;
    list->size = list->size+1;
    return true;
}

bool arrlist_addat(struct ArrayList* list,int index,void* element) {

    //Need help here.

}

void* arrlist_get(struct ArrayList* list,int index) {
    void* value = list->arr[index];
    if (value != NULL)
        return value;
    return NULL;
}

int arrlist_index_of(struct ArrayList* list,void* element) {
    for (int i = 0; i < list->size; ++i) {
        if (element == arrlist_get(list,i))
            return i;
    }
    return -1;
}

解决方法

假设数组的长度为 maxSize ,则只需在插入元素之前将元素向右移动即可,

bool arrlist_addat(struct ArrayList* list,int index,void* element)
{
    bool done;
    int i;

    assert(list != NULL);
    
    if ((list->size < list->maxSize) && (index >= 0) && (index <= list->size)) {
        /*make room for the new element*/
        for (i = list->size; i > index; i--) {
            list->arr[i] = list->arr[i - 1];
        }
        
        list->arr[index] = element;     
        list->size++;
        done = true;
    } else {
        done = false;
    } 
    return done;    
}
,

声明的要求是-d应该在给定的索引处插入一个不能大于当前大小的元素。因此,在检查了需求之后,该函数仅需要重新分配用于存储arrlist_addat值的数组/列表的内存,将给定索引中的void *值向前拖移一个,然后设置写入已将void *值插入索引位置。

假设实现具有优化的void *函数,那可能是改组现有元素的最快方法。这是一个示例实现:

memmove

bool arrlist_addat(struct ArrayList* list,void* element) { void** data; if (index > list->size) return false; data = realloc(list->arr,sizeof(*list->arr) * (list->size + 1)); if (!data) return false; memmove(&list->arr[index + 1],&list->arr[index],(list->size - index) * sizeof(*list->arr)); list->arr[index] = element; list->size++; return true; } 可以使用arrlist_add来实现:

arrlist_addat

ASIDE:bool arrlist_add(struct ArrayList* list,void* element) { return arrlist_addat(list,list->size,element); } 应该检查索引,如果超出范围,则返回arrlist_get

NULL