我有两个for
循环问题。
我很擅长使用链接列表和指针。我看到一些代码试图使用for
循环将数据插入到链表中。但是,for
循环声明对我来说是完全陌生的,我不明白它是如何工作的。
我对典型for循环的理解包括3个部分:
示例:
main()
{
int i;
for (i = 0; i < 5; i++) {
//do something....
}
}
以下是一些我希望能帮助您理解我正在看的代码。
struct labellist {
int x;
int y;
struct labellist *nextlabel;
struct labeltest *testsptr;
};
struct labellist *labelptr;
struct labeltest {
int z;
struct labeltest *nexttest;
};
for(q = &labelptr; *q; q = &((*q)->nextlabel)) {
for(q = &labelptr, count=0; *q && count< MAXTUBES; q = &((*q)->nextlabel), count++)
这些陈述究竟意味着什么?
编辑:感谢您的回复。我理解两个循环现在正在做什么。花了我一些时间来理解的是两个初始化变量指针q和int count; for(q =&amp; labelptr,count = 0;。
我以前不习惯在for循环的初始化部分看到两个声明但现在已经清楚了。谢谢!
答案 0 :(得分:1)
一些参考供将来使用。另请参阅C标记维基。只需将鼠标悬停在C标记上,然后点击底部的“信息”。
此处快速摘要:
q = &labelptr
*q
*q
为假时,循环结束。当q指向NULL指针或零(即NULL)时,*q
将为false。q = &((*q)->nextlabel)
*q)->nextlabel
for循环遍历链表,直到它到达NULL指针。很简单。
答案 1 :(得分:1)
你总是可以写
for (initializer; test; update)
body;
作为
initializer;
while (test) {
body;
update;
}
有时会让它们更容易阅读。
for (q = &labelptr; *q; q = &((*q)->nextlabel))
q
开始指向labelptr
;如果q
不为空,请执行正文,然后按照q
指针将nextlabel
移至下一个标签。
for (q = &labelptr, count=0;
*q && count < MAXTUBES;
q = &((*q)->nextlabel), count++)
几乎相同的事情,但是我们继续计算,如果它达到MAXTUBES
次迭代,则退出循环。