关于循环的一些理解

这个是for循环的一般的形式,
for(int a = 0 ; a < something; a++)
{
循环体
}


这个是while循环的一般形式
while( true)
{
循环体
}


这个是do-while循环的一般形式
do{
循环体
}
while()

但是到了实际的应用中,1在排序中,循环可以用来操控循环的次数,2也可以操控数组的下标来达到遍历数组的作用,3在链表中,循环还可以通过判断链表next域的状态来操控链表的遍历,
从而可以说循环的核心在于如何控制循环停止,那就需要琢磨循环的边界条件以及循环过程。

拿for循环来说,在冒泡排序中

冒泡排序的思想,
1:从第一个元素开始,相邻的两个元素依次向后比较,把两个元素中较大的一个放在后边,例如a[0]与a[1]比
,新a[1]再和a[2]比,以此类推,直到比到最后一个,这样,比完一次,数组的最后一个元素必定是最大的元素,
2:再在剩下的元素中在像1一样去运作,可以找到次大的元素,以此类推,当找到倒数第二个的时候,整个数组排序完成

第一次冒泡的过程,找到了一堆数种的最大的一个放在了数组的末尾
在这里插入图片描述
第二次冒泡的时候
在这里插入图片描述
以此类推,没冒泡一次,从剩下的元素中找一个最大的元素放在未确定数组的末尾,然后,直到比到a[1]确定了,那么a[0]自然也就是最小的了,
所以冒泡排序如其名字一样,是将相对较大的元素让其通过相邻元素的依次比较而冒出头。
给出代码

for(int i = 0 ; i < 数组长度 - 1;i++){			//0-length-1 是length次,而
												//想要循环length-1次
												//所以就是从0到length-2,外层for是控制循环次数
												//只能要想循环到length-2,上界就必须是length-1
												//因为i在此处是对循环的标记
	for(int j =0 ; j < 数组长度 - 1 - i ; j++)
						//这里的数组长度-1是因为到数组末尾的数组下标就是数组长度-1
						//还要-i是因为
						//内层for是控制数组下标来比较的
						//因为每冒泡一次,则会冒出来一个新的确定的最大的元素
						//所以,就需要减去冒泡出来的新的元素的个数,
						//第i此循环的时候就已经有i个元素冒泡好的,
						//所以可以不用比较,可以减去,然后就不用比较已冒泡好的了																	
														
		{
			if(a[j]<a[j+1])
			{
			int temp = a[j+1];
			a[j+1] =  a[j];
			a[j] = temp;
			}//if
		}//for j
}//for i 

总结:在冒泡排序中,外层的for循环是为了控制冒泡的次数,而内层的for是为了控制数组是如何执行每次的冒泡的,需要对应到具体的数组下标上,这里体现了对for循环的不同的运用

在用循环语句控制链表的时候,这个时候的循环语句的控制语句的作用也会体现出来
例如‘
在双向循环链表的控制中,
为了判断双向循环链表是否遍历完成,
可以在方法体内用两个工作指针
一个指针(dP)指向双向循环链表的头节点,另一个指针(dN)可以指向双向循环链表的头节点的下一个节点,然后dN向后一直走,直到dN的next域指向的是dP,则双向循环链表遍历完一遍,并且没有破坏链表的头节点的指针信息
双指针遍历的好处在于,在销毁双向循环链表的时候也可以用dP去指向头节点,然后dN指向将要销毁的节点,dN在销毁一个脱链的节点之后,可以继续指向dP的next从而继续销毁下去,直到dP的next指向的是dP,这时,双向循环链表除了头节点都会释放完,达到用循环控制链表操作的目的。

以我现在的理解,你让循环动起来相对容易,但你要是想让循环在你想要的位置停下来,需要细细的琢磨。

更为细致的理解为
1、循环可以控制循环次数(for),
2、循环还可以控制循环的精确的个体,如数组的下标(for),比如链表的遍历(while)
3、do-while由于无法判断第一次的循环是否满足循环条件,故而可以在第一次循环之前加一个判断,所以,这个比较麻烦,在实际的操作中,do-while我还没有怎么去运用,应该是我还没有认识到do-while的强大之处。

扫描二维码关注公众号,回复: 5113731 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_34070321/article/details/86686676
今日推荐