链表多项式求和

来源:互联网 发布:天猫淘宝网连衣裙 编辑:程序博客网 时间:2024/05/19 18:43

虽然很简单,但是还是花了我2个多小时才完成,哎.........................

/*对于两个一元多项式所有指数相同的项,对应系数相加
  若其和不为零,则作为和多项式的一项插入到和多项式链表中去
  如指数不相同,则将指数数值较小的插入到和多项式链表中去
  注意:多项式链表中的节点不需生成,而应该从两个多项式链表中摘取*/
#include <iostream>
using namespace std;

//******************多项式结构体*****************
typedef struct PNode
{
 float coef;  //系数
 int expn;    //指数
 struct PNode* Next;
}PNode;

//******************初始化链表表头**************
void InitLink(PNode* &L)
{
 L = new PNode;
 L->expn = -1;
 L->Next = NULL;
}

//******************多项式链表的创建*************
/*算法思想: 首先初始化一个空链表用来表示多项式,然后逐个输入各项
             通过比较,找到第一个大于此项指数的项,把此项插入到第一个大于
    此项的前面,这样保证多项式链表的有序性
*/

void CreatLinkList(PNode* L)
{
 int numsItems = 1;            //纪录项数
 PNode* s;
 PNode* pre;
 PNode* p;
 s = new PNode;                //先生成一个节点
 cout<<"输入数据,以系数和指数为-1结束输入:"<<endl;
 cout<<"第"<<numsItems<<"项系数 and 指数:";
 while(cin>>s->coef>>s->expn,s->coef != -1 && s->expn != -1)
 {
  pre = L;                   //pre指向要查的前一个节点
  p = L->Next;              //p指向要插入的后一个节点
                 
  while(p && p->expn < s->expn)
  {
   pre = p;
   p = p->Next;
  }
  s->Next = p;
  pre->Next = s;

  numsItems++;
  s = new PNode;
  cout<<"第"<<numsItems<<"项系数 and 指数:";

 }
}

//******************打印多项式链表****************
void PrintLink(PNode* L)
{
 int numsItem = 1;
 PNode* p;
 p = L->Next;
 while(p)
 {
  cout<<"第"<<numsItem<<"项系数:"<<p->coef<<" 指数:"<<p->expn<<endl;
  numsItem++;

  p = p->Next;
 }
}


//******************两表求和**********************
void ADDLinkList(PNode* L1,PNode* L2)
{
 PNode* p1 = L1->Next;
 PNode* p2 = L2->Next;
 //cout<<p1->expn<<" "<<p2->expn<<endl;
 PNode* p3 = L1;
 PNode* r;
 int sum;
 while(p1 && p2)
 {
  if(p1->expn == p2->expn)
  {
   sum = p1->coef + p2->coef;
   cout<<sum<<endl;
   if(sum!=0)
   {
    p1->coef = sum;
    p3->Next = p1;
    p3 = p1;
    p1 = p1->Next;
    r = p2;
    p2 = p2->Next;
    delete r;
   }
   else
   {
    r = p1;
    p1 = p1->Next;
    delete r;

    r = p2;
    p2 = p2->Next;
    delete r;
   }
  }
  else
   if(p1->coef < p2->coef)
   {
    p3->Next = p1;
    p3 = p1;
    p1 = p1->Next;
   }
   else
   {
    p3->Next = p2;
    p3 = p2;
    p2 = p2->Next;
   }
 }
 p3->Next = p1 ?p1:p2;
 delete L2;
}
//******************主函数************************
int main()
{
 PNode* L1;
 PNode* L2;
 InitLink(L1);
 InitLink(L2);
 cout<<"********************表一*********************"<<endl;
 CreatLinkList(L1);
 cout<<"********************表二*********************"<<endl;
 CreatLinkList(L2);
 cout<<"********************相加后*********************"<<endl;
 ADDLinkList(L1,L2);
 PrintLink(L1);
 return 0;
}

原创粉丝点击