来自我教授的链表代码,有点困惑

时间:2014-02-06 02:25:59

标签: c linked-list

typedef struct node{        
int data; 
struct node *next; 
} Node, *NodePtr;

int main(…){
NodePtr firstNode = NULL;
…
}

NodePtr insertAtHead(NodePtr head, int data) {
/* create and fill the new node*/
NodePtr newNode = (NodePtr)malloc(sizeof(Node));  /*check that malloc does not return NULL, if yes – output an error and exit */
newNode->data = data;
newNode->next =NULL;
/* add it to the beginning of linked list*/
if  (firstNode==NULL) /*linked list is empty*/
    firstNode=newNode;
else {
    newNode->next = firstNode;
    firstNode = newNode; }
return firstNode; }

我收到这段代码是为了完成我的作业。我在传递节点指针(firstNode)时遇到问题。我收到一个错误:'insertAtHead'的冲突类型。我确实看到了我认为定义中存在的问题。第一个节点称为head,但其他地方称为firstNode。我做了那个改变,我只是迷失了如何传递这个指针。为了显示我们给出的原始代码,我直接从讲义中发布了代码。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您正在编写正确的解决方案,但这样做就好像它不在函数中一样。它应该是这样的:

#include <stdlib.h>

typedef struct node
{
    int data; 
    struct node *next; 
} Node, *NodePtr;

// prototypes
NodePtr insertAtHead(NodePtr head, int data);

int main()
{
    NodePtr head = NULL;
    head = insertAtHead(head, 1);
    head = insertAtHead(head, 2);

    // etc.
}

NodePtr insertAtHead(NodePtr head, int data) 
{
    NodePtr newNode = malloc(sizeof(*newNode));
    if (!newNode)
    {
        perror("failed to allocate node");
        exit(EXIT_FAILURE);
    }
    newNode->data = data;
    newNode->next = head;
    return newNode; 
}

注意(1)函数原型的放置。这将平息你的第一个错误。 (2)插入函数中的逻辑。这将解决有关未知变量firstNode的下一个错误,并将节点正确链接为新列表头,为调用者返回新头。