标题:请高手帮忙看看,多谢了!
只看楼主
满肚子牙疼
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-5-4
 问题点数:0 回复次数:8 
请高手帮忙看看,多谢了!
是关于多项式的加减的一个算法。我调试了半天,实现加法没问题了,可是减法实现老是出问题。请高手们指点一下!不胜感激!
以下是程序:


#include "stdafx.h"
#include<iostream>
using namespace std;

struct term
   {
       float coef;//项的指数
       int expn;//项的指数
       term *next;
   };


term  *creatpolyn(int m)//输入并建立一元多项式
{
    
    if(m<=0)
    {
        return NULL;
    }
   
    term *head=NULL;
    term *p=new term;
    term *pre=NULL;
    int i;
    
    cout<<"依次输入m个非零项,[多项式的每一项用两个数字表示(前一个数字代表系数,后一个数字代表指数)]"<<endl;
    
    for(i=0;i<m;i++)  
    {
        if (head==NULL)
        {
            cin>>p->coef>>p->expn;   
            head=p;
            pre=head;
        }
        
        else
        {
            p=pre->next=new term;
            cin>>p->coef>>p->expn;
            pre=p;
        }
    }
 pre->next=NULL;
 
 return head;
}



term  *deal(term *h)//对多项式进行处理(排序,合并同指数项,消去系数为0项)
{
    if(h==NULL)
    {
        return NULL;
    }
    
    term *g=NULL;
    term *p=NULL;
    term *q=NULL;
    float f;
    int k;
    bool flag=true;
    
    for(g=h;  (g->next!=NULL)&&flag;  g=g->next)//排序
    {
        flag=false;
        
        for(p=h,q=p->next; q!=NULL; p=p->next,q=q->next)
        {
            if(p->expn<q->expn)
            {
                f=p->coef;k=p->expn;
                p->coef=q->coef;p->expn=q->expn;
                q->coef=f;q->expn=k;
                flag=true;
            }
        }
    }

    for(g=h,p=g->next; p!=NULL;)//合并同指数项
    {
        if(g->expn!=p->expn)
        {
            g=p;
            p=g->next;
        }

        else
        {
            g->coef=g->coef+p->coef;
            g->next=p->next;
            q=p;
            p=p->next;
            delete q;
        }
    }
    
    
    g=h;//消去系数为0项
    
    while (g!=NULL)
    {
        if (g->coef!=0)
        {
            q=g;
            g=q->next;
        }
        else
        {
            q=g;
            g=q->next;
            delete q;
        }
    }

    return h;
}


            

term  *addpolyn(term *p1,term *p2)//加法
{
    term *g1=p1;

    while (g1->next!=NULL)
    {
        g1=g1->next;
    }
    
    g1->next=p2->next;
    g1->next=p2;
    p1=deal(p1);
    
    return p1;
}




term  *subractpolyn(term *p1,term *p2)//减法
{
    term *p3=p2;
    
    while (p3!=NULL)
    {
        p3->coef=0-p3->coef;
        p3=p3->next;
    }
    
    term *p=addpolyn(p1,p2);
    
    return p;
}





void printfpolyn(term *h)//输出多项式
{

    term *p=h;

    if (h==NULL)
    {
        cout<<'0'<<endl;
    }
    else
    {
        while(p->next!=NULL)
        {
            if (p->next->coef>=0)
            {
                cout<<p->coef<<"X^"<<p->expn<<"+";
            }
            else
            {
                cout<<p->coef<<"X^"<<p->expn;
            }
            p=p->next;
        }
        cout<<p->coef<<"X^"<<p->expn<<endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int m;
    int n;
    char g;
    term *p1=NULL;
    term *p2=NULL;
    term *p=NULL;
    
    cout<<"输入要建立的多项式的项数m"<<endl;
    cin>>m;
    
    p1=creatpolyn(m);
    
    cout<<"得到多项式1"<<endl;
    
    printfpolyn(p1);
    
    cout<<"输入另一多项式的项数n"<<endl;
    cin>>n;
    p2=creatpolyn(n);
    cout<<"得到多项式2"<<endl;
    
    printfpolyn(p2);
    
    cout<<"请选择要进行的运算,如要相加则输入+,如要相减则输入-"<<endl;
    cin>>g;
    
    switch (g)
    {
    case '+':p=addpolyn(p1,p2);
        break;
    case '-':p=subractpolyn(p1,p2);
        break;
    }
    
    cout<<"结果如下"<<endl;
    printfpolyn(p);
    
    return 0;
}
搜索更多相关主题的帖子: term 多项式 int NULL 
2008-05-16 13:17
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
得分:0 
现在做链表的人还挺多啊

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2008-05-16 19:04
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
如果是学数据结构的话还可以,如果不是就直接用#include<list>,方便多了..

樱花大战,  有爱.
2008-05-16 19:38
满肚子牙疼
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-5-4
得分:0 
回复 3# 的帖子
小弟正是在学的数据结构。所以关于这个程序,还请各位大侠指点一二。这里先谢过了。
2008-05-16 20:49
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
得分:0 
真抱歉,我正在写代码....如果是运行时错误的话,就检查下是否有内存泄露,或是结点的连接是否错误...用笔把结点的连接过程画下...

樱花大战,  有爱.
2008-05-16 20:52
满肚子牙疼
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-5-4
得分:0 
不用客气。其实不是我偷懒,我都费了一上午了,实在是没辙了才把程序发出来的。
2008-05-16 21:04
满肚子牙疼
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-5-4
得分:0 
回复 2# 的帖子
其实做不做链表,轮不到我选择的好不好……课程要求的啊
2008-05-16 21:06
满肚子牙疼
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-5-4
得分:0 
我自己调试得出的结论是问题出在消去系数为0那一块,可是实在又查不出什么问题。因为这块和前面合并同指数项那块的算法基本上一样,可是那块却没有问题。
2008-05-16 21:13
满肚子牙疼
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-5-4
得分:0 
是这样的,经他人指点和自己的努力,我的程序运行起来总算马马虎虎没出啥问题了。现在把修改了的那一块发出来,算是有所交待。有兴趣的可以看看,谁如果有更好的想法,欢迎指点。

    p=h;//消去系数为0项
    g=p->next ;
    
    while (g!=NULL)
    {
        if (g->coef != 0)
        {
            p=p->next ;
            g=g->next ;
        }
        else
        {
            q=g ;
            p->next = g->next ;
            g=q->next ;
            delete q ;
        }
    }
    if (h->coef==0&&h->next != NULL)
    {
        q=h;
        h=h->next ;
        delete q ;
        return h ;
    }
    else if (h->coef ==0&&h->next ==NULL)
    {
        return NULL ;
    }
    else
    {
        return h ;
    }
}
2008-05-18 01:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-214594-1-1.html




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

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