NOJ_1005_多项式加法(采用尾插法建立单链表的运用)

来源:互联网 发布:南阳炳盛网络 编辑:程序博客网 时间:2024/05/30 20:09

多项式加法

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 3360            测试通过 : 485 

比赛描述

线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。

现给两个一元整系数多项式,请求解两者之和。



输入

两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序,每一组结束行为

0 -1

输出

三组数据,前两组为一元整系数多项式,最后一组为两个多项式的和。

一元整系数多项式输出形式如下:

1)多项式项4x输出为4X

2)多项式项4x2输出为4X^2

3)第一项系数为正数时,加号不要输出

4)除常系数项外,项系数为1不显式输出,-1输出为-

例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为 +4X^3-1X^2+1X-1

样例输入

3 14
-8 8
6 2
2 0
0 -1
2 10
4 8
-6 2
0 -1

样例输出

3X^14-8X^8+6X^2+2
2X^10+4X^8-6X^2
3X^14+2X^10-4X^8+2

提示

该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,请慎重解答。

题目来源

CHENZ

#include <iostream>using namespace std;//待会可以尝试用list容器去写struct lnode{    int zhishu,xishu;    lnode *next;};lnode* creat(lnode* L){    lnode* p = L;    lnode *s;    int m,n;    do    {        cin >> m >> n;        s = new lnode;        s->xishu = m;        s->zhishu = n;        p->next = s;        p=s;    }while((m!=0)&&(n!=-1));    return L;}int display(lnode* L){    lnode* p;    if(L->next->zhishu==-1)        cout<<"0";    else    for(p=L->next;p->zhishu>=0;p=p->next)    {        if(p->xishu>0&&p!=L->next)            cout << "+";        if(p->xishu==1&&p->zhishu>0);        else if(p->xishu==-1&&p->zhishu>0)            cout << "-";        else            cout << p->xishu;        if(p->zhishu>0)            cout << "X" ;        if(p->zhishu>1)            cout << "^" <<p->zhishu ;    }    cout << endl;}lnode* xiangjia(lnode *L,lnode *L1,lnode* L2){    lnode *p=L1->next;    lnode *q=L2->next;    lnode *r=L;    lnode *s;    while((p->zhishu>=0)||(q->zhishu>=0))    {        s = new lnode;        s->next = NULL;        //r->next = new lnode;        //r=r->next;        if(p->zhishu>q->zhishu)        {            s->xishu=p->xishu;            s->zhishu=p->zhishu;            p=p->next;            r->next = s;            r = r->next;        }        else if(p->zhishu<q->zhishu)        {            s->xishu=q->xishu;            s->zhishu=q->zhishu;            q=q->next;            r->next = s;            r = r->next;        }        else        {            s->xishu=p->xishu+q->xishu;            s->zhishu=p->zhishu;            p=p->next;            q=q->next;            if(s->xishu != 0)            {                r->next = s;                r = r->next;            }            else                delete(s);        }    }    r->next = new lnode;    r=r->next;    r->xishu=0;    r->zhishu=-1;    return L;}int main(){    int m,n;    lnode *L1;    lnode *L2;    lnode *L;    L1 = new lnode;    L1 = creat(L1);    display(L1);    L2 = new lnode;    L2 = creat(L2);    display(L2);    L = new lnode;    L = xiangjia(L,L1,L2);    display(L);}

最后附上 王道数据结构给的头插法,微插法建立链表的代码

lnode* creat1(lnode *L) //头插法{lnode *s;int x;L = (lnode *)malloc(sizeof(lnode));L->next = NULL;scanf("%d",&x);while(x!=9999){s = (lnode*)malloc(sizeof(lnode));s->date = x;s->next = L->next;L->next = s;scanf("%d",&x);}return L;}lnode* creat2(lnode *L) //尾插法{lnode *s;int x;lnode *p;L = (lnode *)malloc(sizeof(lnode));L->next = NULL;p=L;scanf("%d",&x);while(x!=9999){s= (lnode *)malloc(sizeof(lnode));s->date = x;s->next = NULL;p->next=s;p=s;scanf("%d",&x);}}

思想就是  先建立新节点,初始化节点,(判断节点),然后将节点添加到链表中!这样比直接在链表上加new lnode 然后xxx  好在一切来得及,指针还没变化!

0 0