标题:学习日记二:多项式乘法
只看楼主
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
结帖率:58.18%
 问题点数:0 回复次数:0 
学习日记二:多项式乘法
加法对的,乘法运行不了
将p1的第k项分别与p2的各项相乘然后与结果多项式各项比较
逻辑错了么?
我看了别人的方法,但我希望可以用自己的方法,错在哪呢?
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct node PolyNode ;
typedef struct node* PtrPoly ;

struct node
{
    int coef ;
    int expon ;
    struct node* next ;    
} ;

//建立一个不带表头结点的链式多项式


int Compare( int e1,int e2 )
{
    if(e1>e2) return 2 ;
    else if(e1<e2) return 1 ;
         else return 0 ;
}



PtrPoly Create( int N)
{
    int i ;
    PtrPoly PtrCurrent,PtrPrevious ;
    PtrPoly head ;

    head=NULL;

    for(i=0 ; i<N ; i++)
    {
        PtrCurrent=(PtrPoly)malloc( sizeof(PolyNode) ) ;

        PtrCurrent->next = NULL ;
        scanf("%d" , &PtrCurrent->coef) ;
        scanf("%d" , &PtrCurrent->expon) ;

        if( head==NULL )
            head=PtrCurrent ;
        else
            PtrPrevious->next = PtrCurrent ;

           PtrPrevious = PtrCurrent ;
    }
    return head;    
}


void Attach ( int coef,int expon,PtrPoly *PtrRear )
{
    /*记录尾项位置才能将未处理完的
    另一个多项式的项依次复制到结果多项式,
    并且每次改变的都是表达式尾项的值,我们需要改变的是结点指针的地址*/
    PtrPoly p;
    
    p = (struct node*)malloc( sizeof (struct node) );
    p->coef = coef ;
    p->expon = expon ;

    // 将p指向的新结点插入到当前结果表达式尾项的后面
    (*PtrRear)->next = p ;
    // 修改PtrRear的值
    *PtrRear = p ;        
}


PtrPoly Add( PtrPoly p1,PtrPoly p2 )
{
    PtrPoly front,rear,temp;

    //为了方便链表插入,先用一个临时空结点作为结果多项式链表表头
    rear = ( PtrPoly )malloc( sizeof(PolyNode) ) ;
    front = rear ;

    while( p1&&p2 )
    {
        switch ( Compare(p1->expon,p2->expon) )
        {
            case 2 ://e1>e2
                Attach( p1->coef , p1->expon , &rear ) ;
                p1 = p1->next ;
                break ;
            case 1 ://e1<e2
                Attach( p2->coef , p2->expon , &rear ) ;
                p2 = p2->next ;
                break ;
            case 0 :
                if( (p1->coef + p2->coef) != 0 ) 
                Attach((p1->coef+p2->coef) , p1->expon , &rear ) ;
                p1 = p1->next ;
                p2 = p2->next ;
                break ;
        }
    }

    for( ; p1 ; p1=p1->next) Attach( p1->coef , p1->expon , &rear ) ;
    for( ; p2 ; p2=p2->next) Attach( p2->coef , p2->expon , &rear ) ;

    rear->next = NULL ;
    temp = front ;
    front = front->next ; //链表头结点为空,指向下一个结点即指向结果多项式第一个非0项
    free( temp ) ;

    return front ;

}


//待插入项的值插入结果多项式
PtrPoly Insert( PtrPoly Position , PtrPoly BeforePosition , PtrPoly InsertPoly , PtrPoly p3 )
{
    //新建一个结点将待插入多项式插入结果多项式

    PtrPoly      head = p3 ;
    
    InsertPoly->next = Position ;
    BeforePosition->next = InsertPoly ;
    return head ;
}


PtrPoly Mult(PtrPoly p1,PtrPoly p2)
{
    
    int sum ;
    PtrPoly Position, BeforePosition, InsertPoly ;//当前项,当前结果项的前一项,待插入项
    PtrPoly p3 ; //结果多项式头结点

    //结果多项式初始化
    //为方便插入链表表头设置为空,(当p1,p2都只有一项时)
    //并且插在第一项前面时很方便(虽然这种情况不存在)
    Position = ( PtrPoly )malloc( sizeof(PolyNode) ) ;    
    p3 = Position ;        //记录结果多项式头结点
    Position->next = ( PtrPoly )malloc( sizeof(PolyNode) ) ;//p1的第一项与p2的第一项计算结果保存在结果多项式第一项中
    Position->next->coef = p1->coef * p2->coef ;
    Position->next->expon = p1->expon + p1->expon ;
    Position->next->next = NULL ;

    Position = Position->next ;
    p2 = p2->next ; //p1的第一项与p2的第一项已经计算了

    //将p1的第k项分别与p2的各项相乘然后与结果多项式各项比较
    for( ; p1!=NULL ; p1=p1->next )    
        for( ; p2!=NULL ; p2=p2->next )
        {
            //计算待插入项
            InsertPoly = ( PtrPoly )malloc( sizeof( PolyNode ) ) ;
            InsertPoly->next = NULL ;
            InsertPoly->coef = p1->next->coef * p2->next->coef ;
            InsertPoly->expon = p1->next->expon + p2->next->expon ;

            //当新项指数比结果多项式小的话一直向前比较,直到遇到比它小的结果项或者相等的结果项(注意待插入项指数为最小时)
               do
                {
                    BeforePosition = Position ;//记录当前结果项前一个位置,方便插入,。。。。
                    Position = Position->next ;
                }
               while( ( InsertPoly->expon ) < (Position->next->expon) && Position != NULL) ;            
                
                //如果该项指数比当前结果项指数大,插入到当前结果项之前    
                //如果该项指数与当前结果项指数相同,判断系数和是否为0
                //不为0,求和后,直接将系数和赋给当前结果项
                //为0,删除当前项
               if(Position!=NULL)
               {
                    if(InsertPoly->expon > Position->expon)
                    {    
                        InsertPoly->next = Position ;
                        BeforePosition->next = InsertPoly ;
                    }
                    //    p3 = Insert( Position , BeforePosition , InsertPoly , p3 ) ;
                   
                    else
                    {  
                        sum = Position->coef + Position->coef ;
                        if( sum!=0 )
                        {
                            Position->coef = sum ;
                        }
                        else
                        {
                            BeforePosition->next = Position->next ;    
                        }
                    }
               }
               else
               { BeforePosition->next = InsertPoly ; }

            Position = p3->next ;        //重置Position,使其指向头结点
        }
            p3=p3->next ;//将不带参数的头结点删除
            return p3 ;
}


void PrintfPoly(PtrPoly poly)
{
    while( poly )
    {
        printf("%d " , poly->coef) ;
        printf("%d " , poly->expon) ;
        poly = poly->next ;
    }
    printf("\n") ;

}



int main()
{
   PtrPoly p1 , p2 , AddPoly ,MultPoly;
   int N1,N2;

   scanf("%d",&N1) ;
   scanf("%d",&N2) ;

   p1=Create(N1) ;
   p2=Create(N2) ;

   PrintfPoly(p1) ;
   PrintfPoly(p2) ;


   AddPoly = Add(p1 , p2) ;
   PrintfPoly( AddPoly ) ;

   MultPoly = Mult(p1 , p2) ;
   PrintfPoly(MultPoly) ;
}


[此贴子已经被作者于2015-11-2 20:04编辑过]

搜索更多相关主题的帖子: 日记 color 多项式 
2015-11-02 20:02



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




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

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