繁体   English   中英

基本C链表语法错误

[英]Basic C linked list syntax error

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

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是类型,而不是变量,并且不能使用类型的地址。

以下代码可以干净地编译。

一定要检查逻辑,

  1. head = NULL或链接列表中只有一个结构时,用于循环的第一次迭代
  2. 检查逻辑,以了解何时所需的结构在链表中是最后一个还是倒数第二个

这是代码:

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)我可以理解,在这个head =&t_node之外,您想让head指向列表的开头。 您的文件中可能需要一个静态变量才能使用它,然后可以正确指向head

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM