问一个很愚蠢的基础问题,p=p->next链表循环里,为什么这样不会覆盖掉链表的值啊

链表循环里
比如L是带头节点的单链表
循环单链表一般都是

list p=(list)malloc(sizeof(link));
p=L->next;
while(p)
{
        printf("%d ",p->data);
        p=p->next;  
}

为什么节点值没有一个一个被覆盖掉,下一次遍历还存在啊。
比如L 这个链表里面值分别是 1,2,3,4,5,按照p=p->next不应该是1这里的节点被2代替,2被3代替了么,求解求解,以前写代码就只是写写没有思考过。。。

还有

单链表构建栈反向输出链表节点值
void print(list p)
if(p->next!=0)
print(p->next);
printf("%d",p->data);}
它为什么可以输出最后一个节点以外值不应该输出了最后一个节点值就跳出程序么 

因为P是指针,p=p->next操作时移动的是指针指向的地址。你可以从节点结构体来看

struct NODE
{
    int value;
    struct NODE *next;
};

上面这个结构体value存的是节点的值,next存的是下个节点的地址。所以在执行p=p->next时,就是改变p指针指向的位置图片说明

list p=(list)malloc(sizeof(link));
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;

}
这段代码是有问题的,首先,malloc出来的节点,prev和next的指针最好先初始化为nullptr,不然你后面那个while(p)会行为是未明确的;
其次,你如果想用p作为一个链表的持有者的话,就不要移动p做遍历,你要用一个节点的指针去遍历,不然像你这样经过while之后,p不知道指哪里去了,且发生内存泄漏。

因为它们存储的位置不同啊

p是指针,遍历的时候移动的是指针,而不是链表里的值。看看指针的定义吧