int add_after(ITEM *list, ITEM *c_item, int value)
{
//create a new node
ITEM *elem = malloc(sizeof(ITEM));
elem->value = value;
//if head is NULL, it is an empty list
if (elem == NULL || c_item == NULL || list == NULL) {
return -1;
} else {
while (list != NULL) {
if (list == c_item) {
elem->next = list->next;
elem->value = value;
list->next = elem;
list = list->next;
}
list = list->next;
}
}
return 0;
}
我正在尝试制作一个函数,将一个节点放在现有节点之后。我的问题在else
语句中。我正试图找到与节点c_item
相等的节点list
。找到相等项后,应在它们之间输入elem
。
我会重写你的函数如下:
int add_after(ITEM *list, ITEM *c_item, int value)
{
//create a new node
ITEM *elem;
//if head is NULL, it is an empty list
if (!list || !c_item) {
return -1;
}
/* Create a new node. */
elem = malloc(sizeof(ITEM));
if (!elem) {
return -1;
}
/* You should rather set the value after having checked the allocated
* memory is not NULL. */
elem->value = value;
/* Insert elem ahead of the current item. */
elem->next = c_item->next;
c_item->next = elem;
return 0;
}
如果您希望在给定节点之后插入新节点,则无需在列表上迭代,只需将新节点插入为c_item
节点的next
节点即可:
int add_after(ITEM *list, ITEM *c_item, int value) {
//check function arguments
if (list == NULL || c_item == NULL)
return -1;
//create a new node
ITEM *elem = malloc(sizeof(ITEM));
if (elem == NULL)
return -1;
elem->value = value;
elem->next = c_item->next;
c_item->next = elem;
return 0;
}
在您的方法中,您尝试在列表中查找元素,如果调用者不可信,则这可能是必要的。在这种情况下,无论是否插入元素,都应该有一个不同的返回值,如果找不到c_item
,则释放分配的elem
:
int add_after(ITEM *list, ITEM *c_item, int value) {
//create a new node
ITEM *elem = malloc(sizeof(ITEM));
//if head is NULL, it is an empty list
if (elem == NULL || c_item == NULL || list == NULL) {
return -1;
} else {
while (list != NULL) {
if (list == c_item) {
elem->value = value;
elem->next = list->next;
list->next = elem;
return 1; // element was inserted
}
list = list->next;
}
free(elem);
return 0; // c_item was not found, elem not inserted
}
}