2016-01-20 111 views
0

所以我最近拿起了C,并且我正在按照一个简单的在线教程创建和打印链表。我已经跟着它一步一步,出于某种原因,教程中的人能够列出他的列表,而我不是。这让我疯狂。当我构建并运行(使用CodeBlocks)时,什么都没有显示出来。使用CodeBlocks以C打印链表

他正在使用一些其他的文本编辑器,也许是一个不同的编译器,但我不能为我的生活看到完全相同的代码可以有两种不同的行为?任何人有任何想法?代码如下:

struct Node { 
    int data; 
    struct Node *next; 
}; 

struct List { 
    struct Node *head; 
}; 

void pushList(struct List *linkedList, int value) { 
    if (linkedList->head == NULL) { 
     struct Node *newNode; 
     newNode = malloc(sizeof(struct Node)); 
     newNode->data = value; 
     linkedList->head = newNode; 
    } else { 
     struct Node *tNode = linkedList->head; 
     while (tNode->next != NULL) { 
      tNode = tNode->next; 
     } 
     struct Node *newNode; 
     newNode = malloc(sizeof(struct Node)); 
     newNode->data = value; 
     tNode->next = newNode; 
    } 
} 

void printList(struct List *linkedList) { 
    struct Node *tNode = linkedList->head; 
    while (tNode != NULL) { 
     printf("This node has a value of %d\n", tNode->data); 
     tNode = tNode->next; 
    } 
} 

int main() { 
    struct List newList = { 0 }; //This initializes to null 

    pushList(&newList, 200); 
    pushList(&newList, 300); 
    pushList(&newList, 400); 
    pushList(&newList, 500); 

    printList(&newList); 
    return 0; 
} 
+0

适合我。你是否包含''stdio.h'和'stdlib.h'? –

+0

'newNode-> data = value;' - >'newNode-> data = value; newNode-> next = NULL;' – BLUEPIXY

回答

1

您忘记初始化newNode->next = NULL;malloc不会初始化它返回给您的内存块,您对此负责。

如果内存指向newNode发生是所有零,你的代码可能会奏效,如果不是,它可能会崩溃,它被称为未定义行为,不同的环境会表现不同,这解释了为什么男人在教程和PaulRooney得到预期的行为,你不这样做。

+0

是的。完善。谢谢。来自Java,我假设C只是初始化为null,如果他们从来没有被手动初始化。我猜不会。头部划伤的事情是没有任何错误或任何东西。它编译得很好。只是没有出现。这是正常的吗? –

+0

当被告知需要使用诸如'-Wall -Wextra -Werror'之类的适当选项来发布有用诊断信息的现代编译器时,但对于这种特殊情况,这是一个经典的错误,我认为任何编译器都不会有所帮助。这太糟糕了,但现在你知道你必须非常小心'malloc'。 – chqrlie