首页 > 其他分享 >探讨两种循环表示方法的区别,while循环与for循环的小总结

探讨两种循环表示方法的区别,while循环与for循环的小总结

时间:2024-04-23 18:44:19浏览次数:29  
标签:arr 20 int 探讨 30 list while 循环

基于前天建立的顺序表(sequeue)的其中一个功能函数,引出两个循环的表示方法的区别和比较。

算法需求:在一个顺序队列中,合并相同的元素。

总体思路:利用两层循环的框架,利用外层循环选中顺序表中第一个数(L->data[i]),再用内循环中进行对比(L->data[j]),如果相同就进行删除操作。

首先采用for循环:

int list_purge(sqlink L)
{
    int i = 1;
    int j;
    if (L->last == 0)//如果顺序表内只有一个函数,则无重复元素直接返回。
        return 0;
        for (i = 1; i <= L->last; i++)//外层循环,选取顺序表中一个数值
    {
        for (j = i - 1; j >= 0; j--)//内层循环,将外层循环的数值依次与i-1以内的数值进行比较
        {
            if (L->data[i] == L->data[j])//若出现相同的情况,则进行删除操作
            {
                list_delete(L, i);
                break;
            }
        }
    }
    }

​ 为减少功能函数间的耦合,用了独立的删除功能函数,具体可见另一篇《基于C语言的顺序表的建立,及各类功能函数实现》,因不是重点,不讨论该函数。

​ 该算法较为简单,能实现基本功能。但有一个非常致命的问题:当出现连续三个需要操作的元素,无法连续删除其中两个。利用简单的几个数字测试,结果示例如下:

int main(int argc, const char *argv[])
{
    sqlink L;
    L = list_create();
    list_insert(L, 10, 0);
    list_insert(L, 20, 0);
    list_insert(L, 30, 0);
    list_insert(L, 20, 0);
    list_insert(L, 30, 0);
    list_show(L);
    list_purge(L);
    list_show(L);
    return 0;
}

运行结果:

​ 为方便分析,编写数组来说明,arr[0]=30;arr[1]=20;arr[2]=30;arr[3]=20;arr[4]=10;

​ 在第一轮循环中,arr[1]!=arr[0],没有相同元素。

​ 在第二轮循环中,arr[2]!=arr[1],arr[2] == arr[0],执行删除操作,删除之后变成了:arr[0]=30;arr[1]=20;arr[2]=20;arr[3]=10;即是在删除第一个相同元素后,整体元素往前移动。

​ 在第三轮循环中,arr[3]!=arr[2],arr[3]!=arr[1],arr[3] != arr[0],即第三轮无法将改变后的a[2]与a[1]进行比较,因此出现运行结果的错误。


因此,考虑采用while循环优化:

int list_purge(sqlink L)
{
    int i = 1;
    int j;
    if (L->last == 0)//如果顺序表内只有一个函数,则无重复元素直接返回。
        return 0;
    while (i <= L->last)//外层循环,选取顺序表中一个数值
    {
        j = i - 1;
        while (j >= 0)
        {
            if (L->data[i] == L->data[j])//内层循环,将外层循环的数值依次与i-1以内的数值进行比较
            {
                list_delete(L, i);//若出现相同的情况,则进行删除操作
                break;
            }
            else
                j--;
            if (j < 0)
                i++;
        }
    }

​ 分析如下,arr[0]=30;arr[1]=20;arr[2]=30;arr[3]=20;arr[4]=10:

​ 在第一轮循环中,arr[1]!=arr[0],没有相同元素。

​ 在第二轮循环中,arr[2]!=arr[1],arr[2] == arr[0],执行删除操作,删除之后变成了:arr[0]=30;arr[1]=20;arr[2]=20;arr[3]=10;整体元素往前移动。

​ 将遍历指数j和i都放进内循环,导致的直接结果是,当进行list_delete(L, i)操作后,通过“break”退出内循环,会重新进行比较,成功解决了重复元素无法删除的问题。

​ 因此运行结果如下:

...

​ 通过这个例子,可较直接理解while与for循环的区别,即在遍历过程中,for的末尾循环体(increment)会直接需要应用在下次循环,而while可在遍历过程结束之后才进行increment操作。总结一句话就是:while遍历更充分。

​ 记录在此供参考学习,如有不足之处,敬请批评指针,欢迎交流。

标签:arr,20,int,探讨,30,list,while,循环
From: https://www.cnblogs.com/cino/p/18153555

相关文章

  • 使用 Python 循环创建多个列表
    前言在Python中,我们可以使用循环来动态创建多个列表,这在处理数据、进行数据分析或进行算法实现时非常有用。本文将介绍几种常见的方法,以帮助大家学习如何使用循环创建多个列表。方法一:使用列表推导式列表推导式是Python中一种简洁的语法,可以快速生成列表。我们可以结合循......
  • 循环更新某些表中的字段类型和长度
    DECLARE@TableNameNVARCHAR(128)DECLARE@ColumnNameNVARCHAR(128)DECLARE@DataTypeNVARCHAR(128)DECLARE@LengthINT--设置你要更新的数据类型和长度SET@DataType='VARCHAR'SET@Length=100--获取所有表的名称DECLARETableCursorCURSORFORSELECTdistinctTABL......
  • initialize方法重定向无限循环问题解决方案
    由于在initialize方法中进行重定向而造成的重定向循环。当session('?user_id')检查失败时,你的代码会尝试重定向到登录页面。如果登录页面或者处理登录的控制器也继承自同一个基类(或者有类似的initialize检查),这将导致每次尝试访问登录页面时都会再次执行重定向,从而陷入无限循......
  • 当型循环和直到型循环有哪些区别
    在程序设计语言中,重复结构对应两类循环语句,先判断后执行循环体的结构称为当型循环结构,又称While型循环。先执行循环体后判断的称为直到型循环结构,又称Until型循环。所以直到型循环至少执行一次运算。当型循环属于最基础的循环结构之一。当型循环是指在循环体执行前进行判断的,当......
  • 在Python中的for循环
    在Python中的for循环for循环:用于遍历序列(如列表、元组、字典、集合或字符串)或其他可迭代对象。pythonforiinrange(10):#这将循环10次,i的值从0到9print(i)while循环:当给定条件为真时,重复执行代码块。pythoni=0whilei<10:#这将循环10次print(i)i......
  • 实验5 循环结构程序设计(while、do-while语句的应用)
    c语言程序设计——实验报告五实验项目名称:实验项目类型:验证性实验日期:一、实验目的二、实验硬、软件环境Windows计算机、Devc6.0三、实验内容及步骤实验内容:编写程序:(1)用while语句计算自然数列1,2,3……,n的和,n的值在程序执行时输入。(2)用do-while语句计算n的阶乘(3)......
  • Java中用forEach和lamad优化for循环
    1importjava.util.Arrays;2importjava.util.List;3importjava.util.function.IntBinaryOperator;456List<String>names=Arrays.asList("Alice","Bob","Charlie");78//方式一for输出9for(inti=0;i<......
  • error while loading shared libraries: libgsl.so.27: cannot open shared object
     001、问题(base)[root@pc1src]#treemixtreemix:errorwhileloadingsharedlibraries:libgsl.so.27:cannotopensharedobjectfile:Nosuchfileordirectory 002、查找该共享库(base)[root@pc1src]#find/-name"libgsl.so.27"##说明已经安......
  • shell脚本while循环、read读取控制台输入与函数
    while循环while循环结构while[条件判断]do程序done脚本示例:点击查看代码#!/bin/bashwhile[$a-le$1]do sum=$[$sum+$a]doneecho$sum简易写法:点击查看代码#!/bin/basha=1while[$a-le$1]do letsum+=a leta++doneecho$sumread读取......
  • 记录在JavaScript中对事件循环的理解
    JavaScript事件循环通俗解释好的,用更通俗的话来说,事件循环就像是在一个大剧院里,有一个演员(JavaScript引擎)和两个重要的角色:一个是前台的表演者(调用栈),另一个是后台的候场区(事件队列)。前台表演者:这个演员在前台表演,一次只能表演一个节目(单线程执行)。当一个节目(函数)开始时,演员就上......