遍历链接列表

时间:2016-07-07 06:54:51

标签: 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(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;
}

我很困惑“start-&gt; next”的输出不是NULL,而是一个固定的常量地址。但是我在for循环之前为start-&gt;分配了NULL,并且只更改了“list”(list-&gt; item和list-&gt; next)中的组件,而不是“start”中的组件。那么为什么“开始”中的组件会发生变化?

2 个答案:

答案 0 :(得分:4)

请记住,您有:list = start:然后他们都指向同一个节点,只要它们相等,list->next就与start->next相同。

for第一次迭代startlist仍然相等,start->next将为NULL,直到您分配:list->next = ...。 在第一次分配之后,start->next将被修改为指向malloced地址。 在下一次迭代list指向其他地方,修改list->next不会影响start->next

一步一步:(&#34;节点X&#34;是我给malloc分配的节点的名称,它们不是程序中的变量)

node 0: { .item = ?, .next = NULL }  <---- start, list

i = 0;
list->item = i;

node 0: { .item = 0, .next = NULL }  <---- start, list

list->next = malloc(...)

node 0: { .item = 0, .next = &(node 1) }  <---- start, list
node 1: { .item = ?, .next = ?         }  <---- start->next, list->next

list = list->next

node 0: { .item = 0, .next = &(node 1) }  <---- start
node 1: { .item = ?, .next = ?         }  <---- start->next, list

i = 1;
list->item = i;

node 0: { .item = 0, .next = &(node 1) }  <---- start
node 1: { .item = 1, .next = ?         }  <---- start->next, list

list->next = malloc(...)

node 0: { .item = 0, .next = &(node 1) }  <---- start
node 1: { .item = 1, .next = &(node 2) }  <---- start->next, list
node 2: { .item = ?, .next = ?         }  <---- list->next

list = list->next;

node 0: { .item = 0, .next = &(node 1) }  <---- start
node 1: { .item = 1, .next = &(node 2) }  <---- start->next
node 2: { .item = ?, .next = ?         }  <---- list

答案 1 :(得分:2)

这是因为如果这个作业 -

 list = start;

list指向start指向的同一地址,因此在该位置所做的更改与两个指针相同(因为它们指向相同的内存位置)。

它与此示例相同(可能更简单,如代码) -

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 */