链接列表未显示正确的数据

时间:2017-12-03 02:26:53

标签: c visual-studio

我正在学习链表,所以决定在这里做一些练习我试图显示列表中输入的数据。我还在行中列出了对我的理解的评论

typedef struct node {
    int num;
    struct node *nextptr;
}Node;

Node *stnode;
void createNodeList(int n);
void displayList();

这是我创建的节点

void createNodeList(int n) {
    Node *tmp;
    int num = 1;

    //allocate memory address to stnode
    Node *stnode = (Node *)malloc(sizeof(Node));

    if (stnode == NULL) {
        printf("Memory error");
    }
    else {
        printf("Input data for node 1:");
        scanf("%d", &num);

        //declare the stnode num field in struct as user input
        stnode->num = num;
        //declare the stnode address of the next node NULL (to be the last node)
        stnode->nextptr = NULL;
        //define the node name as tmp
        tmp = stnode;

        for (int i = 2; i <= n; i++) {
            //allocate node to fnNode
            Node *fnNode = (Node *)malloc(sizeof(Node));
            if (fnNode == NULL) {
                printf("Memory can not be allocated");
                break;
            }
            else {
                printf("Input data for node %d: ", i);
                scanf("%d", &num);

                //declare the node name fnNode num to store user input
                fnNode->num = num;
                //link the fnNode of nextptr to address null
                fnNode->nextptr = NULL;
                //link tmp node to fnNode
                tmp->nextptr = fnNode;

                tmp = tmp->nextptr;
            }
        }
    }
}

这是为了显示它们

void displayList() {
    Node *tmp;
    if (stnode == NULL) {
        printf("List is empty");
    }
    else {
        tmp = stnode;
        while (tmp != NULL) {
            printf("Data = %d\n", tmp->num);
            tmp = tmp->nextptr;
        }
    }
}

输入3个数据后,它应显示我输入的数据。

但它显示“List is empty”

谢谢=)

1 个答案:

答案 0 :(得分:0)

Node *stnode = (Node *)malloc(sizeof(Node)); 

通过这个你正在遮蔽全局变量。这就是为什么你不保留全局变量的变化。您所做的就是使用与全局变量stNode具有相同名称的局部变量。

该行应为

stnode = (Node *)malloc(sizeof(Node));

<子> 不要施放malloc的返回值。它应该是

stnode = malloc(sizeof(Node));

甚至更清楚

stnode = malloc(sizeof *stnode);

  

如果您使用-Wshadow选项编译此程序,那么您将   得到关于这个阴影的警告。启用所有编译器警告。它   帮助