C如何在链表中的现有节点之后插入新节点


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
}
}

最新更新