基本C链表语法错误

时间:2016-01-13 23:40:27

标签: c syntax linked-list

注意:我已经有了使用我自己的代码的预期功能,但我在另一个网站上看到了一个教程,我想知道为什么它不起作用。

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){
 ^"

有什么想法吗?这只是一个我没有看到的简单语法错误吗?谢谢!

3 个答案:

答案 0 :(得分:2)

问题的根源是node_t是一个类型,而不是变量,不能获取类型的地址。

以下代码清晰地编译。

务必检查逻辑,

  1. head = NULL或链表中只有一个结构
  2. 时,循环的第一次迭代
  3. 检查所需结构在链表中是最后一个或倒数第二个的逻辑
  4. 这是代码:

    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
    

答案 1 :(得分:1)

由于我无法评论@ accepted answer撰写的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;
}

此代码正确地从列表的开头,中间和结尾删除元素。此外,它还为调用者提供了释放未链接节点的机会。

答案 2 :(得分:0)

1)iharob已经指出了你得到的错误。 2)我可以理解,在这个head =& t_node之外,你想让头指向列表的头部。您的文件中可能需要一个静态变量才能使用它,然后您可以正确指向头部