关于#c语言#的问题:单链表逆序输出




#include 
#include 

struct node
{
    char value;
    struct node* link;
};

int main()
{
    struct node* top, * p;
    char c;
    top = NULL;
    while ((c = getchar) != '\n');
    {
        p = (struct node*)malloc(sizeof(struct node));
        p->value = c;
        p->link = top;
        top = p;
    }
    while (top)
    {
        p = top;
        top = top->link;
        putchar(p->value);
    }
}

请问top = top->link 是指向空指针吗?

这段代码是头插法生成链表,当输入第一个字符 a 时,因起始 top = NULL; 所以 p->link = top; 就是等价于 p->link = NULL; ,然后接下来就将top = p;,此时top就不再是NULL了,它指向(记录)了第一个结点 p 的地址。循环执行 while ((c = getchar()) != '\n') 这句,读入第二个字符 b, 此时的 top 就是第一个结点的地址,它衔接在新申请的结点 p 的尾部即 p->link = top;,然后把 top = p; 将 top 指向新生成的第二个结点头,如此类推,就实现了输入顺序 abc,插入链表:a ,b->a ,c->b->a,后输入的字符 插在 前一个输入的字符 之前。代码有点小问题,修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
    char   value;
    struct node* link;
};
int main()
{
    struct node* top, * p;
    char c;
    top = NULL;
    while ((c = getchar()) != '\n')   //(c = getchar) != '\n' // ;
    {
        p = (struct node*)malloc(sizeof(struct node));
        p->value = c;
        p->link = top;
        top = p;
    }
    
    while (top)
    {
        p = top;
        top = top->link;
        putchar(p->value);
    }
}

这是将链表节点指向下一个节点,只有尾节点的时候,top才会被设置为空
18行的while循环后面多了个分号,所以代码肯定是不对

不是,top = top->link 表示将指针 top 指向下一个节点的地址,也就是将 top 指向当前节点的下一个节点。如果当前节点没有下一个节点,即 top->link 为 NULL,那么 top 就会被赋值为 NULL,表示链表已经遍历完成。

该回答引用ChatGPT
不一定。在这个程序中,top 最初被初始化为 NULL,而后在 while 循环中,每次都在链表头插入一个新节点。因此,top 指向的是链表的头节点,而 top->link 指向下一个节点。当 top 指向最后一个节点时,top->link 为 NULL,所以当执行 top = top->link 时,top 将指向 NULL,表示链表已经遍历完毕。