L.isten 2022-06-08 18:38 采纳率: 66.7%
浏览 13
已结题

同条件的do循环与while循环结果不一致

img


为方便调试,简化问题为5个人

#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct peo)
struct peo
{
    int num;
    peo *next;
}peo;
int main()
{
    struct peo *creat();
    void result(struct peo *head);
    result(creat());
}
struct peo *creat()
{
    int n=5,i=0;
    struct peo *head;
    struct peo *p1,*p2;
    head=NULL;
    p1=p2=(struct peo *)malloc(LEN);
    while(i<n)
    {
        i++;
        p1->num=i;
        if(i==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(struct peo *)malloc(LEN); 
    }
    p2->next=head;
    return head;
}
void result(struct peo *head)
{
    struct peo *del(struct peo *head,int num);
    struct peo *p1=head;
    int baoshu=0,rest=5;
    while(rest!=1)
    {
        baoshu++;
        if(baoshu==3)
        {
            baoshu=0;
            head=del(head,p1->num);
            rest--;
        }
        p1=p1->next;
    }
    printf("the rest is %d",p1->num);
    
}
struct peo *del(struct peo *head,int num)
{
    struct peo *p1=head,*p2=head;
    if(p1->num==num)
    {
        head=p1->next;
        do//不能退出
        {
            p2=p2->next;
        }while(p2->next==p1);
        p2->next=head;    
    }
    else 
    {
        p1=(p1->next);
        do
        {
            if(p1->num==num)
            {
                break;
            }            
            else
            {
            p1=p1->next;
            p2=p2->next;
            }
        }while(p1!=NULL);
        p2->next=p1->next;
    }
    return head;
}


结果运行后发现程序没有任何输出,通过调试发现一直在do循环处循环,不能退出。
        do //该段代码不能退出
        {
            p2=p2->next;
        }while(p2->next==p1);


我创建了一个拥有5个节点的环形链表,通过遇到报数为3的节点就用del函数“删除”这个节点(将上一个节点链接到下一个节点,跳过该节点来实现删除功能),直到最后只剩下一个节点为止,输出该节点的编号num。
最后我将问题代码替换成while循环,且终止条件不变,发现循环能正常退出,且程序输出的结果是正确的
        while (p2->next != p1)
        {
            p2 = p2->next;
        }

img

疑问:为什么条件相同,用do循环和while循环,一个不能退出,一个能退出呢?
  • 写回答

1条回答 默认 最新

  • dceacho 2022-06-08 18:54
    关注

    且终止条件不变

    你这两个终止条件变了啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 6月8日

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向