数据结构实验 第一章 链表(多项式加法)
【问题描述】编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加放入C的函数。C中多项式按升幂输出。
【输入形式】输入A的项数后一个个输入对应的系数和指数;再按同样的方法输入B。
【输出形式】形如,a1xn1+a2xn2+…+a3*xn3
【要求】用链表实现
【提示】A、B刚开始可能是无序的,C按升幂排列,所以为了方便后面的操作要将A、B也升幂排序要写一个排序的程序。求和时系数为0的项不存入C。
//输入两个多项式,先将两个多项式按升幂排序,相加后再按升幂输出
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef struct node* list;
struct node {//结点用来存储项
float coef;//系数
int expon;//指数
list next;//下一项
};
void show(list l);
list create()//创建多项式//有头结点系数域放长度
{
list q, r, head;
int i;
head = (list)malloc(sizeof(struct node));
r = head;
int n;
cout << "输入多项式位数:";
cin >> n;
head->expon = n;
for (i = 0; i < n; i++)
{
q = (list)malloc(sizeof(struct node));
cout << "系数:";
cin >> q->coef;
cout << "指数:";
cin >> q->expon;
cout << "---------------"<<endl;
r->next = q;//插入尾部方式
r = q;
}//能否找错比如输入两个指数相同的是错的
r->next = NULL;
show(head);
return head;
}
list sort(list head)//按升幂排序
{
list p = head->next, q;
int e;
float a;
if (p!= NULL)
{
while (p->next!= NULL)
{
q = p->next;
if (p->expon == q->expon)
{
cout << "多项式输入不能指数重复" << endl;
exit(1);//非正常退出
}
while (q != NULL)
{
if (p->expon > q->expon)
{
e = q->expon;
a = q->coef;
q->expon = p->expon;
q->coef = p->coef;
p->expon = e;
p->coef = a;
}
q = q->next;
}
p = p->next;
}
}
show(head);
return head;
}
list add(list a, list b)//排好序的多项式相加
{
list p, q, r, c, s;
int m=0, n=0;
p = a->next;
q = b->next;
c = (list)malloc(sizeof(struct node));//c表头指针
r = c;
c->expon = 0;
while (p&&q)
{
if (p->expon < q->expon)
{
s = (list)malloc(sizeof(struct node));
s->expon = p->expon;
s->coef = p->coef;
r->next = s;
r = s;
p = p->next;
c->expon++;
n++;
}
else if (p->expon > q->expon) {
s = (list)malloc(sizeof(struct node));
s->expon = q->expon;
s->coef = q->coef;
r->next = s;
r = s;
q = q->next;
c->expon++;
m++;
}
else {
float sum = p->coef + q->coef;
if (sum != 0) {
s = (list)malloc(sizeof(struct node));
s->coef = sum;
s->expon = p->expon;
r->next = s;
r = s;
p = p->next;
q = q->next;
c->expon++;
}
else {
p = p->next;
q = q->next;
}
n++;
m++;
}
}
if (p == NULL && q == NULL)
r->next = NULL;
if (p != NULL) {
r->next = p;
c->expon = c->expon + a->expon - n;//记录长度
}
if (q != NULL) {
r->next = q;
c->expon = c->expon + b->expon - m;
}
return c;
}
void show(list l)//输出函数
{
list p = l;
int n = l->expon-1;
if (p->expon)
{
p = p->next;
if (p->coef >= 0)
{
if (p->expon > 0)
cout << p->coef << "*x^" << p->expon;
else if (p->expon == 0)
cout << p->coef;
else
cout << p->coef << "*x^" << "(" << p->expon << ")";
}
else
{
if (p->expon > 0)
cout << "(" << p->coef << ")" << "*x^" << p->expon;
else if (p->expon == 0)
cout << "(" << p->coef << ")";
else
cout << "(" << p->coef << ")" << "*x^" << "(" << p->expon << ")";
}
while (n--)
{
p = p->next;
if (p->coef >= 0)
{
if (p->expon > 0)
cout << "+" << p->coef << "*x^" << p->expon;
else if (p->expon == 0)
cout << "+" << p->coef;
else
cout << "+" << p->coef << "*x^" << "(" << p->expon << ")";
}
else
{
if (p->expon > 0)
cout << "+" << "(" << p->coef << ")" << "*x^" << p->expon;
else if (p->expon == 0)
cout << "+" << "(" << p->coef << ")";
else
cout << "+" << "(" << p->coef << ")" << "*x^" << "(" << p->expon << ")";
}
}
cout << endl;
}
else
cout << 0;
}
int main()
{
list a, b, c;
a = create();
a = sort(a);
b = create();
b = sort(b);
cout << "输出:" << endl;
c = add(a, b);
show(c);
return 0;
}
这和老师上课要求的输入输出形式不一定相同,请自行修改。