#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,表示链表已经遍历完毕。