标题:谁帮忙写个两个多项式相加的程序(我写的代码已附上,要求也已附上)
只看楼主
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
结帖率:96.15%
已结贴  问题点数:50 回复次数:6 
谁帮忙写个两个多项式相加的程序(我写的代码已附上,要求也已附上)
要求:两个多项式分别按升幂的次序存储在两个链表中
      然后通过计算把两个多项式相加的结果放入原本存储第一个多项式的链表中
      然后把第一个多项式的链表输出(即为结果)
      没有常数项
下面是我自己写的代码但是有些情况不能得出结果,可以赋值回去试试:
//*两个多项式的输入必须依照幂次数的升序依次输入,并且没有常数项*//
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LENTH sizeof(struct  Polyfactor)
  //*构造多项式因子的结构体*//
typedef struct Polyfactor                     
{
//*声明多项式因子的系数*//
 int coeff;
 //*多项式因子的幂次数*//
 int power;   
 //*用于指向下一个多项式因子的指针*//
 struct Polyfactor *next;      
}Factor;              
//*建立链表存储多项式函数*//
Factor *createpolyn(Factor *head)     
{
    //*设置两个指针用于创建链表*//
    Factor *p1=0;                 
    Factor *p2=0;
    int m=0;
    int n=0;
    //*当输入是q时多项式输入结束*//
    do                  
    {
        printf("请输入多项式因子的系数:");         
         scanf("%d",&m);
         printf("请输入多项式因子的幂次数:");
         scanf("%d",&n);
        if(head==0)
         {
            p1=(Factor*)malloc(LENTH);
            if(p1==0)
            {
                exit(0);
            }
            head=p1;
            p2=p1;
        }
         else
         {
            p1=(Factor*)malloc(LENTH);   
            if(p1==0)
            {
            exit(0);
            }
            else
            {
             p2->next=p1;
             p2=p1;
            }
            
        }
        p2->coeff=m;
        p2->power=n;
        fflush(stdin);
    }while(m!=0&&n!=0);
    p2->next=0;
    return head;
}     //*多项式的输入*//
//*对链表进行插入,其中p3指向P1的前驱*//
Factor *addpolyn(Factor *head,Factor *p1,Factor *p2,Factor *p3)   
{
//p1所指向的链表结点为尾结点时,并且P2没有指向链表尾结点*//
 if(p1->power==0&&p1->coeff==0)
 {
     p1->power=p2->power;
     p1->coeff=p2->coeff;
     p1->next=p2->next;
     return head;
 }
 //p1所指向的链表结点的幂次数比p2的小时,将p2插入p1后*//
 if(p1->power<p2->power)
 {
     if(p3==p1)
     {
         head=p2;
         p2=p2->next;
         p2->next=p1;
         return head;
     }
     else
     {
         p2->next=p1->next;
         p1->next=p2;
         p2=p2->next;
     }
 }
//p1所指向的链表结点的幂次数比p2的大时,将p2插入p1前*//
 else
 {
        p2->next=p1;
        p3->next=p2;
        p2=p2->next;
 }
 return head;
 
 }
 //*对链表进行删除,其中P3指向要删除点的前驱*//
Factor *delpolyn(Factor *head,Factor *p1,Factor *p3)
{
//*把要删除点的后继赋值给删除点的前驱的后继*//
 p3->next=p1->next;
 return head;
}
int main()
{   
 Factor *p=0,*p1=0,*p2=0,*p3=0;
 Factor *head1=0,*head2=0;
 Factor *createpolyn(Factor *head1);
 Factor *addpolyn(Factor *head,Factor *p1,Factor *p2,Factor *p3);
 Factor *delpolyn(Factor *head,Factor *p1,Factor *p3);
//*创建两个链表分别把两个头指针赋值给head1和head2*//
 head1=p1=createpolyn(head1);
 head2=p2=createpolyn(head2);
 p3=p1;
    do
 {
//*两个多项式因子的幂次数相同*//
  if(p1->power==p2->power)
  {
     if(p1->coeff==-p2->coeff)                       
     {
           head1=delpolyn(head1,p1,p3);         
     }
     else
     {
      p1->coeff+=p2->coeff;
     }
  }
  //*两个多项式的幂次数不同*//
  else                                          
  {
   head1=addpolyn(head1,p1,p2,p3);
  }
  p3=p1;
  p1=p1->next;
 }while(p1&&p2);
//*当两个链表都还没指向链表结尾时*//
 while(p2)
 {
  head1=addpolyn(head1,p1,p2,p3);            
 }
 p=head1;
 printf("所得的多项式:\n");
 do
 {
  printf("%dX^%d",p->coeff,p->power);
  printf("+");
  p=p->next;
//*输出所得多项式的结果*//
 }while(p);   
 return 0;
}

帮我看看怎么回事  或者你重新写个程序给我参考参考 拜谢啦

[ 本帖最后由 清风拂晓 于 2010-10-21 21:44 编辑 ]
搜索更多相关主题的帖子: 多项式 附上 相加 代码 
2010-10-21 21:23
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
我好像个你发过一个了啊
2010-10-21 21:33
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
得分:0 
你那个是重新放在一个链表里 不是用原来放两个多项式的其中一个链表来存放  你可不可再改下发上来?

清风拂暮(木)
2010-10-21 21:35
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
得分:0 
要用到前。后插入链表 和删除链表的函数

清风拂暮(木)
2010-10-21 21:42
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:50 
程序代码:
#include<stdio.h>
#include<malloc.h>
typedef struct linklist
{
    int coef;//系数
    int exp; //指数
    struct linklist *next;
}nodelink;
nodelink *create()//创建单链表
{
    nodelink *head,*s,*t;
    int c,e;
    head=(nodelink *)malloc(sizeof(nodelink));//哨兵头结点
    head->next=NULL;
    t=head;//始终指向单链表的尾部
    printf("请输入c和e的值,当系数e等于-1为结束条件:\n");
    scanf("%d%d",&c,&e);
    while(e!=-1)
    {
        s=(nodelink *)malloc(sizeof(nodelink));
        s->coef=c;
        s->exp=e;
        s->next=NULL;
        t->next=s;
        t=s;
        printf("请继续输入c和e的值,当系数e等于-1为结束条件:\n");
         scanf("%d%d",&c,&e);
    }
    return head;
}
void printhead(nodelink *head)//输出连表数据
{
    nodelink *phead;
    phead=head->next;//指向第一个元素结点
    int pcount=1;//结点计数器
    while(phead!=NULL)
    {
        printf("第%d个结点的系数和指数分别为:",pcount);
        printf("%2d%4d\n",phead->coef,phead->exp);
        phead=phead->next;
        pcount++;
    }
    printf("\n");
}
nodelink *ADD(nodelink *heada,nodelink *headb)//实现多项式相加将和多项式放在链表heada中,同时删除多项式headb
{

    nodelink *p,*q,*prea,*preb,*temp;
    int sum;
    p=heada->next;//分别使p和q指向第一个元素结点
    q=headb->next;
    prea=heada;
    free(headb);//释放headb链表的头结点
    while(p!=NULL&&q!=NULL)
    {
        if(p->exp<q->exp)
        {
            prea=p;
            p=p->next;
        }
        else if(p->exp==q->exp)
        {
              sum=p->coef+q->coef;
          if(sum!=0)
          {
             p->coef=sum;
             preb=q;
             prea=p;
             p=p->next;
             q=q->next;
             free(preb);
          }
         else//如果和为零
         {
            temp=p;
            p=p->next;
            prea->next=p;
            free(temp);
            preb=q;
            q=q->next;
            free(preb);
         }
        }
        else //若p->exp大于q->exp
        {
            preb=q;
            q=q->next;
            preb->next=p;
            prea->next=preb;
            prea=prea->next;
        }
    }
    if(q!=NULL)
    prea->next=q;
    return heada;
}
void main()
{
    nodelink *heada,*headb,*headc;
    heada=create();
    printhead(heada);
    headb=create();
    printhead(headb);
    headc=ADD(heada,headb);
    printf("相加后的的链表为:\n");
    printhead(headc);
}
    
楼主看看
2010-10-21 21:53
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
得分:0 
谢谢啦   你写代码的速度好快 我这都研究了好几晚了还没得到正确的

清风拂暮(木)
2010-10-21 22:17
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
得分:0 
回复 6楼 清风拂晓
呵呵~,这题的思路可以看做特定条件下结点的合并和操作。只要考虑劝全了就可以了啊
2010-10-22 06:51



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




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

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