gpt4 book ai didi

c - mapPut 有什么问题?我找不到问题

转载 作者:行者123 更新时间:2023-11-30 14:39:56 26 4
gpt4 key购买 nike

map 包含 - 返回 map 内是否存在键。

mapPut - 为特定键赋予给定值,并按顺序将其添加到 map 中,如果该键存在,则该值将被覆盖。 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));

关于c - mapPut 有什么问题?我找不到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55830976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com