在使用基于指针的条件时,循环条件是否仍然有效?

时间:2017-07-23 17:56:38

标签: c loops pointers data-structures linked-list

据我所知,for循环具有这种结构" for(init; condition; increment)"并继续直到条件不为零或为真。现在,我遇到了这样的代码:

struct node
{
    int no;
    struct node *next;
};
struct node *first;
void creatlist()
{
    char ch='y';
    struct node *ptr,*nw;
    while(ch!='n')
    {
        printf("\nEnter item in list");
        nw=(struct node*)malloc(sizeof(struct node));
        scanf("%d",&nw->no);
        nw->next=0;
        if(first==0)
        {
            first=nw;
        }
        else
        {
            for(ptr=first ;ptr->next!=0;ptr=ptr->next);
            {
                ptr->next=nw;
            }
        }
        printf("\nDo you want to countinue y\n");
        ch=getch();
    }
}

我对for循环有一些理解问题" ptr-> next!= 0"即使" ptr-> next"每次都是零,但据我所知,它不应该是。任何人都可以帮我找到解释吗?

1 个答案:

答案 0 :(得分:2)

  

因为循环正在进行,即使" ptr-> next"每次都为零,

不是真的。它仅对列表的最后一个元素为零。只要当前元素具有有效fornext循环就会遍历列表,因此当循环终止时ptr指向最后一个元素。

此时,我们有

ptr->next=nw;

将最后一个节点(当前为0)的next指针更改为指向新创建的节点。

顺便说一下,请注意这条线是容易混淆的缩进 - 它就像是循环体一样进入一个块,但它不是 - for循环后面有一个分号它,即一个空语句,它是一个循环体(IOW,你有一个带有空体的for循环,因为所有它必须做的就是在增量部分完成了。)

ptr->next=nw;在一个区块中没有充分的理由,它完全独立于循环体。如果您在此处添加nextprintf,则可能是您混淆的原因。