map 包含 - 返回映射中是否存在键。
mapPut - 为特定键提供给定值,并按顺序将其添加到映射中,如果键存在,则覆盖该值。 mapRemove - 删除一对(键、数据(元素,这些元素的键与给定元素匹配(通过键比较函数(。
mapGetFirst - 将内部迭代器设置为映射中的第一个键,并将其返回。
MapKeyElement mapGetFirst(Map map){
if(map == NULL){
return NULL;
}
if (map->head == NULL){
return NULL;
}
map->iterator = map->head;
return (map->copyMapKeyElements(map->iterator->key));
}
mapGetNext - 将内部迭代器推进到下一个键,然后 返回它。
MapKeyElement mapGetNext(Map map){
if(map == NULL){
return NULL;
}
if((map->iterator->next)== NULL) {
return NULL;
}
map->iterator = map->iterator->next;
return (map->copyMapKeyElements(map->iterator->key));
}
typedef struct MapElements_t{
MapDataElement data;
MapKeyElement key;
struct MapElements_t* next;
} *MapElements;
struct Map_t{
copyMapDataElements copyMapDataElements;
copyMapKeyElements copyMapKeyElements;
freeMapDataElements freeMapDataElements;
freeMapKeyElements freeMapKeyElements;
compareMapKeyElements compareMapKeyElements;
MapElements head;
MapElements iterator;
};
/* ...... */
MapResult mapPut(Map map, MapKeyElement keyElement, MapDataElement dataElement) {
if ((map == NULL) || (keyElement == NULL) || (dataElement == NULL)) {
return MAP_NULL_ARGUMENT;
}
if (mapContains(map, keyElement)) {
mapRemove(map, keyElement);
}
MapElements new_map_element = malloc(sizeof(new_map_element));
if (new_map_element == NULL) {
return MAP_OUT_OF_MEMORY;
}
new_map_element->data = dataElement;
new_map_element->key = keyElement;
new_map_element->next = NULL;
if(map->head == NULL){
map->head = new_map_element;
map->iterator = map->head;
return MAP_SUCCESS;
}
mapGetFirst(map);
if (map->compareMapKeyElements(keyElement, map->iterator->key) < 0){
new_map_element->next = map->iterator;
map->head = new_map_element;
return MAP_SUCCESS;
}
while(map->iterator->next != NULL) {
if (map->compareMapKeyElements(keyElement, map->iterator->next->key) < 0) {
new_map_element->next = map->iterator->next;
map->iterator = new_map_element;
return MAP_SUCCESS;
}
mapGetNext(map);
}
map->iterator->next = new_map_element;
return MAP_SUCCESS;
}
你有包含指针的 typedef,例如 typedef struct MapElements_t{...} *MapElements;
使类型MapElements
指针。
不鼓励这样做,原因如下:
当你这样做时
MapElements new_map_element = malloc(sizeof(new_map_element));
您分配的是指针的大小,而不是指向的事物的大小。在您的情况下,您应该执行以下操作:
MapElements new_map_element = malloc(sizeof(*new_map_element));
但最好你会这样做:
typedef struct MapElements_t
{
//...
struct MapElements_t* next;
} MapElements;
所以你使一个变量,它是指向事物的指针,明确地具有*
。
MapElements *new_map_element = malloc(sizeof(*new_map_element));
<</div>
div class="one_answers"> 故障出在这里;我必须替换此代码:
new_map_element->data = dataElement;
new_map_element->key = keyElement;
使用此代码:
new_map_element->data = map->copyMapDataElements(dataElement);
new_map_element->key = map->copyMapKeyElements(keyElement);