| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 485 人关注过本帖
标题:有空来坐坐,请教个C++问题
只看楼主 加入收藏
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
结帖率:93.48%
收藏
已结贴  问题点数:20 回复次数:3 
有空来坐坐,请教个C++问题
我的想法:-->首先说下下边程序的功能:主要是进行多项式的同类项的合并。我的方法是先对多项式的指数从大到小的顺序排一次(这步我已经做了),然后比较相邻的结点中的指数,如果相等的话,就把后结点中的系数加到前点的系数,并且把后结点删除。然后前结点和后结点同时向后移,当历遍一次后,同类项的就合并了。

我想请教的问题:-->下边程序(编译没问题),运行过程中有错误,以致被终止了,我简单的调试下,发现是listdeal这个函数有问题,但我找了好久都找不出,所以请高手帮看一下,是错在哪里了?帮改一下,先谢过了。

#include<iostream.h>
#include<cstdio>
struct Node               //这个是结构体,conf是用来存每项的系数,exps是用来存每项的指数
{
    float conf;
    int exps;
    Node *next;
    Node()
    {
        conf=0.0;
        exps=0;
        next=NULL;
    }
};
void printA(Node *pp)          //这个函数的功能是打出多项式,pp表示链表的头指针
{
    cout<<"多项式为:";
    cout<<pp->conf<<"x"<<char(94)<<pp->exps;
    pp=pp->next;
    while(pp)
    {
        if(pp->conf!=0)
        {
        if(pp->conf>0)
        {
            cout<<" + "<<pp->conf;
            if(pp->exps!=0)
                cout<<"x"<<char(94)<<pp->exps;
        }
        if(pp->conf<0)
        {
            cout<<" - "<<-pp->conf;
            if(pp->exps!=0)
                cout<<"x"<<char(94)<<pp->exps;
        }
        }
        pp=pp->next;

    }
    cout<<endl;
}
Node *createNode()                  //这个函数的功能是创建一个链表,并反回该链表的指针
{
    Node *str,*p;
    float c;
    int e;
    p=new Node;
    str=p;
    cin>>c>>e;
    p->conf=c;
    p->exps=e;
    p->next=NULL;
    while(true)
    {
        Node *temp=new Node;          //多项式的输入格式,比如多项式:2x^3+5x^2
        cin>>c>>e;                    //  2 3 (回车)
        temp->conf=c;                 //  5 2 (回车)
        temp->exps=e;                 //  0 0 (回车)
        temp->next=NULL;
        p->next=temp;
        p=temp;   
        if(c==0.0&&e==0)                 //当系数和指数都为0时,该多项式结束,进入下一条多项式的输入(如如果有必要的话)
        {
        break;
        }

    }
    return str;
}
Node *listdeal(Node *A)                   //这个函数是对多项式进行整理
{
    Node *back,*follow,*temp=A;           //也就是进行同类项的合并,只合并相邻的项,并且合并后删除后一个结点
    back=A;
    follow=back->next;
    while(follow)
    {
        if(back->exps==follow->exps)      //当前结点的系数和后结点的系数相等时
        {
            Node *tp;                    
            tp=follow;                    //把后继结点保存,以便稍后要删除
            back->conf+=follow->conf;     //把后结点的系数加到前结点上  
            back->next=follow->next;      
            delete tp;                   //删除后继结点
        }
        back=back->next;                  //前结点和后结点都同时后移
        follow=follow->next;
    }
    return temp;
}

void clears(Node *xp)                //这个函数用来清空链表
{
    Node *tp;
    while(xp)
    {
        tp=xp;
        xp=xp->next;
        delete tp;
    }
}

void main()
{
    Node *t1,*t2;
    t1=createNode();
    t2=listdeal(t1);
    printA(t2);
    clears(t1);
    clears(t2);
}
搜索更多相关主题的帖子: 多项式 同类项 
2009-11-05 09:27
flyingcloude
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:6
帖 子:598
专家分:1512
注 册:2008-1-13
收藏
得分:7 
这个问题还没解决阿

你能学会你想学会的任何东西,这不是你能不能学会的问题,而是你想不想学的问题
2009-11-05 13:03
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:0 
上次问加法的已经解决了,这次的是合并同类项的,拜托了,帮看下

顺境逆境切莫止境,得意失意切莫在意。
2009-11-05 17:55
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:7 
错可以说不在那个合并同类项那里,也可以说是在那里,系统运行错误出在clears(t2);但这个错误的起因却是Node *listdeal(Node *A);
这个数把t1带进去运算,却返回t1给t2(LZ看看是不是这样),白算了,t1和t2是同一个链表,最后让你delete两次,肯定会出错啦····
建议LZ把Node *listdeal(Node *A) 函数再好好写写···
2009-11-05 20:46
快速回复:有空来坐坐,请教个C++问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030505 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved