问题描述
我不确定如何使用 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