当前位置: 首页 > 知识库问答 >
问题:

程序在printPoly()函数中遇到无限循环

濮丰
2023-03-14

这个程序应该从用户那里读取2个多项式,然后打印出求和;一旦两个多项式都被输入,就会陷入无限循环。

>

  • 为了存储一个多项式,使用了一个带有指向下一项(节点)的*plink前向声明的结构

    每个多项式都有一个头节点,它有助于以循环方式遍历列表。

    因为头节点不包含任何与多项式“相关”的数据,所以它们的指数字段被初始化为-1

    #include"stdio.h"
    #include"stdlib.h"
    
    #define SIZE 10
    
    #define TRUE 1
    #define FALSE 0
    struct poly
    {
    int exp;
    float coef;
    struct poly *plink;
    };
    
    typedef struct poly PNODE;
    
    PNODE* getNode()
    {
    PNODE *ptr= (PNODE*)malloc(sizeof(PNODE));
    if(ptr==NULL)
    {
        printf("\nNo Memory\n");
        return;
    }
    return ptr;
    }
        void readPoly(PNODE *phead, int n)
        {
            int i, ex;
            float co;
            PNODE *temp,*newnode;
            temp=phead;
            for(i=0;i<n;i++)
                {
                printf("\nEnter the EXPONENT and COEFFICIENT for term %d\n",i);
                scanf("%d%f",&ex,&co);
    
                newnode=getNode();
    
                newnode->exp=ex;
                newnode->coef=co;
    
                temp->plink=newnode;
                temp=newnode;
            }
         temp->plink=phead;
         return;
        }
    
        void printPoly(PNODE* phead)
        {
            PNODE *i=phead;
            for(i=phead->plink;i->plink!=phead;i=phead->plink)
                {
                    printf("%2f(x^%d)+",i->coef,i->exp);
                }
                printf("\n");
        }
    
    int compare(int a, int b)
        {
            if(a>b)
            {
               return 1;
            }
             if(b>a)
            {
             return -1;
            }
           if(a==b)
            {
                return 0;
            }
        }
    
    void attach(int exp, float coef, PNODE **add)
    {
        PNODE *temp;
        temp=getNode();
    
    temp->exp=exp;
    temp->coef=coef;
    
    (*add)->plink=temp;
    *add=temp;
        return;
    }
    
    PNODE* addPoly(PNODE *phead1, PNODE *phead2)
    {
    PNODE *startA, *res, *tempres;
    int done= FALSE;
    float sum= 0.0;
    
    startA=phead1;
    
    phead1=phead1->plink;
    phead2=phead2->plink;
    
    res=getNode();
    res->exp=-1;
    tempres=res;
    
    do
    {
        switch(compare(phead1->exp,phead2->exp))
        {
             case 1: attach(phead1->coef,phead1->exp,&tempres);
                    phead1=phead1->plink;
                    break;
             case -1: attach(phead2->coef,phead2->exp,&tempres);
                    phead2=phead2->plink;
                    break;
             case 0: if(startA==phead1)
                            {
                                done=TRUE;
                            }
                    else
                    {
                        sum=phead1->coef+phead2->coef;
                        if(sum)
                        {
                            attach(sum,phead1->coef,&tempres);
                        }
                       phead1=phead1->plink;
                       phead2=phead2->plink;
                    }
                    break;
    
        }
    }while(!done);
    tempres->plink=res;
    return res;
    }
    int main()
    {
    int n1, n2;
    PNODE *phead1, *phead2,*result;
    
    phead1=(PNODE*)malloc(sizeof(PNODE));
    phead2=(PNODE*)malloc(sizeof(PNODE));
    
    phead1->exp=-1;
    phead2->exp=-1;
    
    phead1->plink=phead1;
    phead2->plink=phead2;
    
    printf("\nEnter the number of terms in Polynomial 1\n");
    scanf("%d",&n1);
    readPoly(phead1,n1);
    printf("\nEnter the number of terms in Polynomial 2\n");
    scanf("%d",&n2);
    readPoly(phead2,n2);
    
    printf("The first Polynomial is \n");
    printPoly(phead1);
    printf("The second Polynomial is \n");
    printPoly(phead2);
    
    printf("Result is\n");
    result=addPoly(phead1,phead2);
    printPoly(result);
    
    return 0;
    }
    
  • 共有1个答案

    牟黎昕
    2023-03-14
    for(i=phead->plink;i->plink!=phead;i=phead->plink)
    

    i总是被赋予相同的值,因此循环永远不会结束。应该是i=i->plink移动到下一个节点。

     类似资料:
    • 我已经写了这个生产者/消费者问题解决方案。它似乎在工作,而不是无限循环。我的印象是,pthread\u exit(NULL) 会让它停止,但老实说,我已经迷路了。有人能告诉我如何阻止循环的正确方向吗?

    • 这是身份服务器3独立实现第3部分由斯科特布雷迪 当我运行hybridflow客户端应用程序并登录时,会显示“同意”页面。但在我确认我对范围的选择并单击“是,允许”按钮后,页面重定向到同意页面。 这是网络日志映像。在此处输入图像描述 这是最终的Http请求URL,其响应是同意页面。 https://localhost:44302/core/connect/authorize?client_id=hy

    • 以下代码的输出是:请输入您的单词: 你好, 凯沙夫, 鲍勃, doan kehsavbob 线程中的异常 “主要” java.lang.数字格式异常: 对于输入字符串: “kehsavbob” 在 java.base/java.lang.数字格式异常.为输入字符串 (数字格式例外.java:67) 在 java.base/java.lang.Integer.parseInt(整数.java:668

    • 我一直在研究GNU的g编译器编译的汇编,它看起来像一个无限循环(g -S file.c -o的部分输出): 除了最后一条jmp指令之外,所有这些指令都是movq或计算指令,但这只是让我们回到.L3。这是以下代码的主体: 它是如何退出循环的?看起来它只是减少了i(subq$1,-8(%rbp)),并在没有比较的情况下重新启动。

    • 我对编码完全陌生,正在使用Python作为一个学校项目开发一个基于文本的游戏。用户必须通过键入“北”、“东”、“南”或“西”进入房间。如果方向无效,则应弹出错误消息,提示用户输入新方向。如果用户键入退出,游戏应该结束。 这个项目有一百万个问题,因为我发现我在编码方面很糟糕,但我想弄清楚的是,如果出现提示,如何让我的程序退出游戏。这是我的代码(它不是完整的代码,只是我到目前为止所拥有的代码。我试图一

    • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循