注意:我已经得到了与我自己的代码一起使用的预期函数,但我在另一个网站上看到了一个教程,我想知道为什么它不起作用。
https://www.eskimo.com/~scs/cclass/int/sx8.html
前提如下:
我正在使用一个非常基本的链表:
typedef struct node {
int val;
struct node * next;
} node_t;
我正在尝试让一个函数按值删除条目。具体如下:
int remove_by_value(node_t ** head, int val) {
for(head = &node_t; *head != NULL; head = &(*head)->next){
if ((*head)->val == val) {
*head = (*head)->next;
break;
}
}
}
但是,我在调用此函数时收到错误,即:
"prog.c:35:17: error: expected expression before 'node_t'
for(head = &node_t; *head != NULL; head = &(*head)->next){
^"
有什么想法吗?这只是我没有看到的简单语法错误吗?谢谢!
问题的根源在于node_t
是一个类型,而不是一个变量,不能采用一个类型的地址。
以下代码将干净地编译。
一定要检查逻辑,
- 当
head
= NULL 或链表中只有一个结构时循环的第一次迭代 - 检查逻辑,以确定所需结构何时在链表中是最后一个或最后一个
这是代码:
typedef struct node
{
int val;
struct node * next;
} node_t;
int remove_by_value(node_t ** head, int val)
{
int retVal = -1; // initialize to failed
node_t *previousNode = *head;
node_t *currentNode = *head;
for(;
previousNode && currentNode; // assure something to test
previousNode = currentNode, // update the pointers
currentNode = currentNode->next )
{
if (currentNode->val == val)
{
previousNode->next = currentNode->next;
retVal = 0; // indicate success
break;
}
}
return retVal;
} // end function: remove_by_value
由于我无法评论@user3629249写的已接受答案:该代码甚至比原始代码更糟糕(除了它会编译)。
我会建议这样的事情:
node_t *remove_by_value(node_t **head, int val)
{
node_t *ret = NULL;
for (; *head; head = &((*head)->next))
{
if ((*head)->val == val)
{
ret = *head;
*head = (*head)->next;
break;
}
}
return ret;
}
此代码从列表的开头、中间和结尾正确删除元素。此外,它还使调用方有机会释放未链接的节点。
1)iharob已经指出了您遇到的错误。2)我可以理解,在这个头=&t_node你想头指向你的列表的头。您的文件中可能需要一个静态变量才能使用它,然后您可以正确指向头部