C语言 地图放置有什么问题?我找不到问题



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);

最新更新