使用链接列表创建字典数据结构。
typedef struct _dictionary_entry_t
{
const char* key;
const char* value;
struct dictionary_entry_t *next;
struct dictionary_entry_t *prev;
} dictionary_entry_t;
typedef struct _dictionary_t
{
dictionary_entry_t *head;
dictionary_entry_t *curr;
int size;
} dictionary_t;
使用函数将字典条目添加到链表。
int dictionary_add(dictionary_t *d, const char *key, const char *value)
{
if (d->curr == NULL) //then list is empty
{
d->head = malloc(sizeof(dictionary_entry_t));
d->head->key = key; //set first dictionary entry key
d->head->value = value; //set first dictionary entry value
d->head->next = NULL;
//d->curr = d->head;
}
else
{
d->curr = d->head;
while (strcmp((d->curr->key), key) != 0 && d->curr != NULL) //while keys don't match and haven't reached end of list...
{
d->curr = d->curr->next;
}
}
return -1;
}
将d-> curr分配给d-> curr->接下来给我警告“从不兼容的指针类型分配”。
这里我的错误是什么? curr和next都属于* dictionary_entry_t
类型答案 0 :(得分:5)
next
是struct dictionary_entry_t *
,但d->curr
是dictionary_entry_t *
又名struct _dictionary_entry_t *
。请注意下划线的差异。
解决此问题的一种方法是与您的下划线保持一致,将next
声明为:
struct _dictionary_entry_t *next;
但是,在申报typedef
之前,我更喜欢不同的方式:struct
fing。然后:
typedef struct _dictionary_entry_t dictionary_entry_t;
struct _dictionary_entry_t {
/* ... */
dictionary_entry_t *next;
/* ... */
};
答案 1 :(得分:2)
除了@icktoofay提出的问题之外,另一个问题是你的循环条件:
while (strcmp((d->curr->key), key) != 0 && d->curr != NULL)
如果d->curr
为NULL
,则当您执行strcmp()
时,您尝试取消引用NULL
指针。坏事会发生。反转那些:
while ((d->curr != NULL) && strcmp(d->curr->key, key) != 0)
或者,更简洁:
while (d->curr && strcmp (d->cur->key, key))