您的位置:首页 > 其它

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

2016-05-19 15:13 423 查看

多项式加法

时间限制(普通/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 好在一切来得及,指针还没变化!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: