链表显示额外的零项

时间:2018-01-04 13:08:11

标签: c linked-list

我正在创建一个包含3个元素的列表,但是当我打印列表时,它会显示一个额外的零元素。我无法确定它来自何处。

#include <stdlib.h>
#include <stdio.h>


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


void Push(struct node **head, int data) 
{
    struct node *newNode = (struct node*) malloc(sizeof(struct node));

    newNode-> data = data;
    newNode-> next = *head;
    *head = newNode;
}


void createList(struct node **head)
{
    Push(head, 1);
    Push(head, 2);
    Push(head, 3);
}

void printList(struct node *head)
{
    struct node *ptr = head;

    while(ptr != NULL)
    {
        printf("%d \n", ptr-> data);
        ptr = ptr-> next;
    }

    return;
}


int main() {

    struct node *head = NULL;
    head = (struct node*) malloc(sizeof(struct node));

    createList(&head);

    printList(head);

    printf("\n");
    return 0;
}

输出:

3 
2 
1 
0 

2 个答案:

答案 0 :(得分:2)

它实际上显示了一个不确定的值。因为就在这里:

head = (struct node*) malloc(sizeof(struct node));

您在哪里创建第一个真实节点,之前插入了所有内容。你是(不)幸运的是,运行时正在为你清理内存。因为这是阻止您访问某些随机地址的唯一因素。通常,从malloc返回的内存内容是不确定的。

删除该行,您只会看到createList添加的项目。此外,您的程序将具有明确定义的行为。

答案 1 :(得分:0)

你的列表中有四个节点:你在malloc in&#34; main()“加上三个添加的&#34; push&#34; in&#34; createList&#34;。据推测,额外的数据中的数据为零,因为你没有将它设置为main(虽然我认为它是乱码的,因为它已分配内存但未被清除)。