使用ANSI C创建Integer LinkedList

时间:2014-08-04 17:15:49

标签: c pointers struct linked-list

我想使用结构和内存分配创建一个整数链表。我得到的这个错误对我来说并没有多大意义。据我所知,如果你的指针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);  

}

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

2 个答案:

答案 0 :(得分:3)

.的优先级高于*,因此第二个表达式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;
}

答案 1 :(得分:1)

假设:

node *head;

之间存在巨大差异:

*(head).next

(*head).next

第一个是不正确的;它等同于*head.next*(head.next),但head是指针,而不是结构,因此无法使用.表示法。

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

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

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