C 遍历链表

C 遍历链表,c,linked-list,C,Linked List,我是C语言的新手,现在我正在努力学习链表的基础知识。下面的代码只是遍历链表的一部分 #include <stdio.h> #include <stdlib.h> struct node { int item; struct node *next; }; int main() { struct node *start,*list; int i; start = (struct node *)malloc(sizeof(struc

我是C语言的新手,现在我正在努力学习链表的基础知识。下面的代码只是遍历链表的一部分

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


struct node
{
    int item;
    struct node *next;
};

int main()
{
    struct node *start,*list;
    int i;
    start = (struct node *)malloc(sizeof(struct node));
    list = start;
    start->next = NULL;


    for(i=0;i<10;i++)
    {   
        list->item = i;
        printf("%p\t%p\n",start->next,list->next);
        list->next = (struct node *)malloc(sizeof(struct node));
        list = list->next;
    }

    return 0;
}
#包括
#包括
结构节点
{
国际项目;
结构节点*下一步;
};
int main()
{
结构节点*开始,*列表;
int i;
start=(结构节点*)malloc(sizeof(结构节点));
列表=开始;
开始->下一步=空;
对于(i=0;iitem=i;
printf(“%p\t%p\n”,开始->下一步,列表->下一步);
列表->下一步=(结构节点*)malloc(sizeof(结构节点));
列表=列表->下一步;
}
返回0;
}

我很困惑“开始->下一步”的输出不是空的,而是一个固定的地址。但是我在for循环之前为开始->下一步分配了空,并且只更改了“列表”(列表->项目和列表->下一步)中的组件,而不是“开始”中的组件。那么为什么要更改“开始”中的组件呢是否更改?

请记住:
list=start
:然后它们都指向同一节点,只要它们相等,
list->next
start->next
相同

在<代码>上,对于<代码>第一次迭代<代码>开始<代码>和<代码>列表<代码>仍然相等,并且<代码>开始>下一次<代码>将为空,直到您指定:<代码>列表>下一次=…。 在第一次赋值之后,
start->next
将被修改为指向malloced地址。 在下一次迭代中,
list
指向其他位置,修改
list->next
不会影响
start->next


逐步:(“node X”是我给malloc分配的节点的名称,它们不是程序中的变量)

节点0:{.item=?,.next=NULL}item=i;
节点0:{.item=0,.next=NULL}next=malloc(…)
节点0:{.item=0,.next=&(节点1)}next
列表=列表->下一步
节点0:{.item=0,.next=&(节点1)}item=i;
节点0:{.item=0,.next=&(节点1)}next=malloc(…)
节点0:{.item=0,.next=&(节点1)}next;

节点0:{.item=0、.next=&(节点1)}请记住,您有:
list=start
:然后它们都指向同一个节点,只要它们相等,
list->next
就与
start->next
相同

在<代码>上,对于<代码>第一次迭代<代码>开始<代码>和<代码>列表<代码>仍然相等,并且<代码>开始>下一次<代码>将为空,直到您指定:<代码>列表>下一次=…
。 在第一次赋值之后,
start->next
将被修改为指向malloced地址。 在下一次迭代中,
list
指向其他位置,修改
list->next
不会影响
start->next


逐步:(“node X”是我给malloc分配的节点的名称,它们不是程序中的变量)

节点0:{.item=?,.next=NULL}item=i;
节点0:{.item=0,.next=NULL}next=malloc(…)
节点0:{.item=0,.next=&(节点1)}next
列表=列表->下一步
节点0:{.item=0,.next=&(节点1)}item=i;
节点0:{.item=0,.next=&(节点1)}next=malloc(…)
节点0:{.item=0,.next=&(节点1)}next;

节点0:{.item=0,.next=&(节点1)}这是因为如果-

 list = start;
list
指向
start
指向的相同地址,因此在该位置所做的更改对两个指针都是相同的(因为它们指向相同的内存位置)

它与本例相同(可能比代码更简单)-


这是因为如果这个任务-

 list = start;
list
指向
start
指向的相同地址,因此在该位置所做的更改对两个指针都是相同的(因为它们指向相同的内存位置)

它与本例相同(可能比代码更简单)-


应该是
printf(“%p\t%p\n”,(void*)开始->下一步,(void*)列表->下一步);
在初始迭代时为空,或者您没有注意到吗?应该是
printf(“%p\t%p\n”,(void*)开始->下一步,(void*)列表->下一步);
在初始迭代时为空,或者您没有注意到吗?“在下一次迭代中,列表指向其他位置,修改列表->下一步不会影响开始->下一步。"。你能详细解释一下吗?这是否意味着链接列表在此之后就停止了?@ameyCU,我在答案中添加了一个逐步的描述-我希望想法和符号是清楚的谢谢你这么麻烦,但我问的是,上面的行是否暗示
start->next->next
list->ne不同xt->next
?何时?这取决于代码所在的位置,因为它会更改
列表
指向的位置。由于您的代码将
列表
更改为迭代指向每个节点的
->next
,因此在第一次迭代开始时,它将仅指向与
start
相同的位置(直到您执行
list=list->next
)“在下一次迭代中,列表指向其他位置,修改list->next不会影响开始->下一步。”。你能详细解释一下吗?这是否意味着链接列表在此之后就停止了?@ameyCU,我在答案中添加了一个逐步的描述-我希望想法和符号是清楚的谢谢你这么麻烦,但我问的是,上面的行是否暗示
start->next->next
list->ne不同xt->next
?何时?这取决于代码所在的位置,因为它会更改
列表
指向的位置。由于您的代码将
列表
更改为迭代指向每个节点的
->next
,因此在第一次迭代开始时,它将仅指向与
start
相同的位置(直到您执行
list=list->next
int a;
int *p1,*p2;
p1=&a;
p2=p1;
*p1=5;
prinf("value : p1=%d p2=%d",*p1, *p2 ); 
/* Both the pointer will have same value  as change is made at memory location */