用ANSI C创建整数LinkedList



我想使用结构和内存分配创建一个整数链表。我得到的这个错误对我来说没什么意义。据我所知,如果你有一个指针ptr指向一个变量x作为其元素的结构,那么*(ptr).x相当于ptr->x。然而,这里的行为是不同的:

typedef struct
{
    int data;
    struct node * next;
}node;
//create a pointer to a new node containing the entered value
node * newNode(int data)
{
    //create new node and a pointer to it
    node  next;
    node * ptr;
    next.data = data;
    ptr = malloc(sizeof(node));
    *(ptr) = next;
    return ptr;
}
static node *  head;
int main()
{
    //my goal here is to start creating a linked list with values 1,2,3,4 respectively.
    node * currentNode;
    head = newNode(1);
    *(head).next = newNode(2);  
}

如果我编译这段代码,我得到一个关于next不是结构体成员的错误。然而,当我用head->next = newNode(2)替换*(head).next = newNode(2)时,我只得到一个关于指针类型不兼容的警告。我不明白行为上的差异,也不明白错误的来源。

.的优先级高于*,因此第二个表达式head->next相当于(*head).next,而不是*(head).next

关于你的第二个错误,那是因为你的struct声明缺少一个标签。您有效地声明了一个匿名struct,然后将其typedef转换为node。下面是一个修正的声明,它消除了指针不兼容的警告。

typedef struct node
{
    int data;
    struct node * next;
} node;

最后,您的newNode函数可以简化如下,使用NULL的标准库头。

#include <stdlib.h>
//create a pointer to a new node containing the entered value
node * newNode(int data)
{
    node * ptr;
    ptr = malloc(sizeof(node));
    ptr->data = data;
    ptr->next = NULL;
    return ptr;
}

给定:

node *head;

*(head).next

(*head).next

第一个是错误的;它相当于*head.next*(head.next),但head是指针,而不是结构体,因此不能使用.表示法。

第二个是正确的版本,相当于head->next

成员访问操作符.->绑定得非常紧密,比*绑定得紧密得多。该行为是操作符优先级的简单结果。

您的newNode()函数应该确保新节点完全初始化。它应该在分配给*ptr之前设置next.next = 0;(或next.next = NULL;) - *(ptr)中的括号完全是多余的。

相关内容

  • 没有找到相关文章

最新更新