暗pluto 发表于 2018-11-28 21:32:01

关于c语言单链表实现(尾插法)

typedef struct Node{
    int data;
    struct Node *next;
    int length;
}Node,*List;

List creat(List L,int n)
{
    L=(List) malloc(sizeof(Node));
    List last = (List)malloc(sizeof(Node));
    L->next=NULL;
    L->length = 0;
    last = L;
    while(n--)
    {
      List p=(List) malloc(sizeof(Node));
      scanf("%d",&p->data);
      p->next = NULL;
      last->next = p;
      last = last->next;
      L->length++;
    }
    last->next=NULL;
    return L;
}

如上面程序所示,是创造一个单链表,采用尾插法,但是,不明白,为什么把L节点赋值给last节点,但最后返回L节点是头结点,而且L->next不是NULL了?这是为什么,不是对last进行赋值操作,L与last是怎么关联上的?last = L不是指把L赋值给last吗,那L与last之间是什么关系呢?完全搞不懂???

rencaixiaomeng 发表于 2018-11-28 21:32:02

这样跟你说吧,把L当作一张卡片,上面写着你家的地址,然后你拿另一张卡片last,也写上你家的地址,然后你让装修工人拿着last这张卡片按上面地址去给这个房子换门,门换好后,L和last卡片上的地址还是那个地址,但是这个地址上的房子的门已经被换掉了

rencaixiaomeng 发表于 2018-11-28 21:49:22

本帖最后由 rencaixiaomeng 于 2018-11-28 21:52 编辑

第一次循环的时候,last和L都指向同一个节点,在循环里新建一个p结点,并让last->next指向这个p,这个时候,因为last和L都指向同一个节点,所以last->next和L->next是一样的,修改了last->next就等同于修改了L->next
L一直保存着第一个节点的地址,也就是循环开始前创建的那个节点

暗pluto 发表于 2018-11-28 22:48:15

rencaixiaomeng 发表于 2018-11-28 21:49
第一次循环的时候,last和L都指向同一个节点,在循环里新建一个p结点,并让last->next指向这个p,这个时候 ...

为什么last->next和L->next是一样的?然后修改last->next就等同于修改了L->next?明明last和L没有建立联系啊,只有一个单方向的last = L,不是吗?这一步我还是转不过来

暗pluto 发表于 2018-11-29 08:48:23

rencaixiaomeng 发表于 2018-11-28 23:18
这样跟你说吧,把L当作一张卡片,上面写着你家的地址,然后你拿另一张卡片last,也写上你家的地址,然后你 ...

哦!!!懂了,就是说最后返回的L指向的还是原来的地址,但原来的地址后面的东西已经改变了,这个比喻很恰当,谢谢!!!
页: [1]
查看完整版本: 关于c语言单链表实现(尾插法)