| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3405 人关注过本帖
标题:多项式相加该怎样实现
只看楼主 加入收藏
wxzyn123
Rank: 1
来 自:江苏
等 级:新手上路
帖 子:50
专家分:0
注 册:2007-9-15
收藏
 问题点数:0 回复次数:6 
多项式相加该怎样实现
想用C++编写,用链表来实现两个多项式相加,该如何实现啊
搜索更多相关主题的帖子: 多项式 相加 
2007-09-17 22:45
wangwang168
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-5-8
收藏
得分:0 
可以有多种方法,具体就是建立一个类,在这个类的私有数据中设置一个数组来存储系数和指数,也可以用链表来实现这个多项式

我有一个梦想
2007-09-17 23:08
wxzyn123
Rank: 1
来 自:江苏
等 级:新手上路
帖 子:50
专家分:0
注 册:2007-9-15
收藏
得分:0 

就是想用链表来实现两个多项式相加的

2007-09-18 13:26
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
链表,结点中包含一个指数一个系数。

对应指数项相加。

Fight  to win  or  die...
2007-09-19 09:33
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
得分:0 

#include<stdio.h>
#include<malloc.h>
#include<conio.h>
typedef struct node{
int xi;
int zi;
struct node *next;
}Node;

Node *Creat()
{ //尾插法建立多项式链表
Node *head,*p,*pre;
int fg,tag;
head=(Node *)malloc(sizeof(Node));
head->next=NULL;
pre=head;
printf("请按照指数从小到大输入多项式并以0 0结束:\n");
scanf("%d%d",&fg,&tag);
while(fg)
{
p=(Node *)malloc(sizeof(Node));
p->xi=fg;
p->zi=tag;
p->next=pre->next;
pre->next=p;
pre=p;
scanf("%d%d",&fg,&tag);
}
if(fg==0&&tag==0)
printf("\n输入结束:\n");
return head;
}

void Read(Node *head) //读取链表中的数据
{
Node *p=head->next;
while(p)
{
printf("%dX~%d->",p->xi,p->zi);
p=p->next;
}
printf("NULL\n");
}

Node *Add(Node *head1,Node *head2)
{ //多项式相加的实现
Node *p,*head,*p1,*p2;int sum;
head=(Node *)malloc(sizeof(Node));
p=head;
p1=head1->next;
p2=head2->next;
while(p1&&p2) //当两多项式都存在时
{
if(p1->zi==p2->zi) //指数是否相等 相等怎么处理
{
sum=p1->xi+p2->xi;
if(sum)
{
p1->xi=sum;
p->next=p1;
p=p1;
}
p1=p1->next;
p2=p2->next;
}
else //不相等分两种情况
{
if(p1->zi<p2->zi)
{ //分别怎么处理
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}

}
}
if(p1) p->next=p1; //将1中剩余结点接到和链表中 因为最终只剩下一段链表多项式,只需要将
else p->next=p2; //将2中剩余结点接到和链表中 这段链的链头接到目标链表就可以了
return head;
}

void main()
{ //主函数
Node *head,*p1,*p2;
p1=Creat();
Read(p1);
p2=Creat();
Read(p2);
head=Add(p1,p2);
printf("相加后为:\n");
Read(head);
getch();
}

自己写的!


执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-10-27 09:18
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
头文件
#include<iostream>
using namespace std;
typedef struct linklist //自定义一个struct作为多项式的节点
{
int xi;
int zhi;
struct linklist *next;
}node;

class Poly
{
public:
Poly(); //初始化
void sort();
void produce(); //建立多项式
void add(Poly p2); //多项式的相加
void print(); //输出多项式
int getlong();
void destroy();
void multiply(Poly p2);
private:
node *head;
};

Poly::Poly()
{
head=new node; //把head的后继指向空
head->next=NULL;
}

void Poly::add(Poly p2)
{
node *p,*q,*pre;
p=head->next;
pre=head;
q=p2.head->next;
while(p&&q)
{
if(p->zhi==q->zhi) //当遇到指数相等的情况就进行系数的相加
{
p->xi+=q->xi;
p=p->next;
pre=pre->next;
q=q->next;
}
else if(p->zhi<q->zhi) //当指数不相等的时候,较小的指数的多项式的指针指向后一位
{
pre->next=q;
q->next=p;
pre=pre->next;
}
else
{
pre=pre->next;
p=p->next;
}
}
if(q) pre->next=q;
}

void Poly::produce() // 客户进行多项式的输入
{
int temp1,temp2;
node *p,*q;
q=head;
cout<<"请分别输入系数和指数(两个都为零时输入完毕)"<<endl;
cin >>temp1>>temp2;
while(temp1!=0||temp2!=0)
{
p=new node; //新建一个节点
p->xi=temp1;
p->zhi=temp2;
p->next=q->next; //将新的节点插入到链表里面
q->next=p;
q=p;
cout<<"请分别输入系数和指数(两个都为零时输入完毕)"<<endl;
cin >>temp1>>temp2;
}
}




/********************************************************************
输入要分情况讨论
1 当系数等于零的时候,不输入
2 当系数等于1的时候直接输出+
3 当系数小于零的时候直接输出系数
4 当指数等于零的时候不用输出y
********************************************************************/
void Poly::print()
{
node *p;
bool first=true;
p=head->next;
while(p)
{
if(first)
{
if(p->xi==1)
cout<<"y^"<<p->zhi;
else if(p->xi==-1)
cout<<'-'<<"y^"<<p->zhi;
else if(p->xi>0)
cout<<p->xi<<"y^"<<p->zhi;
else if(p->xi<0)
cout<<p->xi<<"y^"<<p->zhi;
else if(p->xi==0)
{}
first=false;
}
else if(p->zhi==0)
{
if(p->xi>0) cout<<'+'<<p->xi;
else cout<<p->xi;
}
else
{

if(p->xi==1)
cout<<'+'<<"y^"<<p->zhi;
else if(p->xi==-1)
cout<<'-'<<"y^"<<p->zhi;
else if(p->xi>0)
cout<<'+'<<p->xi<<"y^"<<p->zhi;
else if(p->xi<0)
cout<<p->xi<<"y^"<<p->zhi;
else if(p->xi==0)
{}
}
p=p->next;
}
}


void Poly::sort()
{
node *p,*q,*pre,*preP,*preQ;
pre=head;
while(pre->next)
{
p=pre->next;
q=p;
preP=pre;
while(p)
{
if(q->zhi<=p->zhi)
{
q=p;
preQ=preP;
}
p=p->next;
preP=preP->next;
}
preQ->next=preQ->next->next;

q->next=pre->next;
pre->next=q;
pre=q;
}
}

int Poly::getlong()
{
node *p;
int len=0;
p=head->next;
while(p)
{
len++;
p=p->next;
}
return len;
}

void Poly::multiply(Poly p2)
{
node *p,*pre,*q,*l,*head3,*preQ;
p=head->next;
head3=new node;
pre=head3;
while(p)
{
q=p2.head->next;
while(q)
{
l=new node;
l->zhi=p->zhi+q->zhi;
l->xi=p->xi*q->xi;
pre->next=l;
pre=l;
q=q->next;
}
p=p->next;
}
pre->next=NULL;
p=head3->next;
while(p->next)
{
q=p->next;
preQ=p;
while(q)
{
if(p->zhi==q->zhi)
{
p->xi+=q->xi;
preQ->next=preQ->next->next;
delete(q);
q=preQ->next;
}
else
{
q=q->next;
preQ=preQ->next;
}
}
p=p->next;
}
destroy();
head=head3;
}

void Poly::destroy()
{
node *p;
p=head->next;
while(p)
{
head->next=head->next->next;
delete(p);
p=head->next;
}
p=head;
delete(p);
}



测试文件

// 测试文件

#include<iostream>
#include"poly.h"
using namespace std;
//void printOut(node *head);
main()
{
Poly p1,p2; //新建两个多项式
p1.produce(); //建立多项式p1
cout<<endl;
p1.print(); //输出多项式p1
cout<<endl;
p1.sort(); //对刚刚的多项式进行降幂排序
cout<<endl;
cout<<"降幂排序整理后得:"<<endl; //重新输出多项式
p1.print();
cout<<endl;

p2.produce(); //建立多项式p2
cout<<endl;
p2.print(); //输出多项式p2
cout<<endl;
p2.sort();
cout<<endl;
cout<<"降幂排序整理后得:"<<endl;
p2.print();
cout<<endl;


//进行多项式的乘法运算
p1.multiply(p2);
cout<<endl;
cout<<"两个多项式相乘后得"<<endl;
p1.print();
cout<<endl;

return 0;
}

2007-10-27 16:30
老虎没打到
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-6-20
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define OVERFLOW -2
#define ERROR 0
#define OK 1
typedef struct Node
{
    int coeff;//系数
    int expo;//指数
    Node *next;
}listNode,*list;

list createList()
{
    list head;
    head = (list)malloc(sizeof(listNode));
    head = NULL;
    printf("want to create a new node?y/n\n");
    char ch;
    fflush(stdin);//送入缓存
    scanf("%c",&ch);
    while(ch=='Y' || ch== 'y')
    {
        list p;
        p = (list)malloc(sizeof(listNode));
        printf("input coeff\n");
        int coeff;
        scanf("%d",&coeff);
        p->coeff = coeff;
        printf("input expo\n");
        int expo;
        scanf("%d",&expo);
        p->expo = expo;
        p->next = NULL;
        //链表为空的时候,即添加首个元素
        if(head == NULL)
        {
         head=p;    //添加代码
        }
        else
        {
            list prev,curr;//prev是前驱结点curr当前节点
            curr = head;
            prev = NULL;
            //找到添加位置
            while(curr!=NULL && curr->expo>p->expo)
            {
                prev=curr;
                curr=curr->next;//添加代码

            }
            if(curr!=NULL && curr->expo == p->expo)
            {
                curr->coeff = curr->coeff + p->coeff;
                printf("want to create a new node?y/n\n");
                fflush(stdin);
                scanf("%c",&ch);
                if(ch=='Y' || ch== 'y')
                    continue;
                else
                    return head;

            }
            //插入结点,结点非首
            if(prev != NULL)
            {
                prev->next=p;
                p->next=curr;//添加代码
            }
            //插入结点,结点为首
            else
            {
                p->next=curr;
                head=p;//添加代码
            }

        }
        printf("want to create a new node?y/n\n");
        fflush(stdin);
        scanf("%c",&ch);
    }
    return head;
}

list add(list head1,list head2)
{
    list head,newNode,ptr1,ptr2,ptr3;
    ptr1 = head1;
    ptr2 = head2;
    head = NULL;   
    while(ptr1 != NULL && ptr2 != NULL)
    {
        newNode = (list)malloc(sizeof(listNode));
        if(ptr1->expo > ptr2->expo)
        {
            newNode->coeff = ptr1->coeff;
            newNode->expo = ptr1->expo;
            newNode->next = NULL;
            ptr1 = ptr1->next;
        }
        else if(ptr1->expo < ptr2->expo)
        {
            newNode->coeff = ptr2->coeff;
            newNode->expo = ptr2->expo;
            newNode->next = NULL;
            ptr2 = ptr2->next;//添加代码
        }
        else
        {
            newNode->coeff = ptr1->coeff + ptr2->coeff;
            newNode->expo = ptr1->expo;
            newNode->next = NULL;
            ptr1 = ptr1->next;
            ptr2 = ptr2->next;
        }
        if(head==NULL)
        {
            head = newNode;
        }
        else
        {
            ptr3 = head;
            while(ptr3->next!=NULL)
                ptr3=ptr3->next;//添加代码
            ptr3->next=newNode;
        }
    }
    while(ptr1 != NULL)
    {
        newNode = (list)malloc(sizeof(listNode));
        newNode->coeff = ptr1->coeff;
        newNode->expo = ptr1->expo;
        newNode->next = NULL;
        ptr3 = head;
        if(ptr3 == NULL)
            head = ptr3 = newNode;
        else
        {
            while(ptr3->next != NULL)
                ptr3 = ptr3->next;
            ptr3->next = newNode;//添加代码
        }
        ptr1 = ptr1->next;
    }
    while(ptr2 != NULL)
    {
        newNode = (list)malloc(sizeof(listNode));
        newNode->coeff = ptr2->coeff;
        newNode->expo = ptr2->expo;
        ptr3 = head;
        if(ptr3 == NULL)
            head = ptr3 = newNode;
        else
        {
            while(ptr3->next != NULL)
                ptr3 = ptr3->next;
            ptr3->next = newNode;
        }
        ptr2 = ptr2->next;
    }
    return head;
}

void display(list head)
{
    list ptr = head;
    while(ptr != NULL)
    {
        if(ptr != head )
            printf("+");
        printf("%d",ptr->coeff);
        printf("x^");
        printf("%d",ptr->expo);
        ptr = ptr->next;
        
    }
}

int main(int argc, char* argv[])
{
    list head,head1,head2;
    printf("input the first list\n");
    head1 = createList();
    printf("input the second list\n");
    head2 = createList();
    head = add(head1,head2);
    display(head);
    return 0;
}
2012-06-20 09:46
快速回复:多项式相加该怎样实现
数据加载中...
 
   



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

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