这是本人的第一次创作,由于时间原因,无论是代码还是注释都有些许简陋,还请大家谅解,这点以后会慢慢改善的。另外,这只是为了被数据结构实验折磨的同学们能够应付一下,代码有些不够简洁的地方还请各路大神批评指正!
废话不多说,代码附上:
#include<iostream>
using namespace std;
//定义一元多项式链表结点结构
typedef struct PNode {
float coef; //系数
int expn; //指数
struct PNode* next; //指针域
}*HLink;
void Build(HLink& H);//创建一元多项式链表
void Exp(HLink H);//实现输出一元多项式链表
void Add(HLink& H, HLink A, HLink B);//实现一元多项式的加和
void Mul(HLink& H, HLink A, HLink B);//实现一元多项式的乘积
int Judge();//容错函数
void Del(HLink& H);//删除多项式
void Mod(HLink& H);//修改多项式
int main() {
int n, num = 0, i = 0;
HLink a[100];
for (int j = 0; j < 100; j++) {
a[j] = new PNode;
}
//进行功能选项
cout << "==================================" << endl;
cout << "||请输入功能编号,运行相应功能\t||" << endl;
cout << "||1.创建一元多项式\t\t||" << endl;
cout << "||2.输出一元多项式\t\t||" << endl;
cout << "||3.显示所有一元多项式\t\t||" << endl;
cout << "||4.求两个多项式的和\t\t||" << endl;
cout << "||5.求两个多项式的积\t\t||" << endl;
cout << "||6.删除多项式\t\t\t||" << endl;
cout << "||7.修改多项式\t\t\t||" << endl;
cout << "||其他.退出\t\t\t||" << endl;
cout << "==================================" << endl;
while (1) {
n = Judge();
if (n < 1 || n>7) break;
switch (n) {
case 1:
Build(a[i]);
cout << "一元多项式创建成功!序号为" << i << endl;
i++;
break;
case 2:
cout << "请输入一元多项式序号:";
num = Judge();
while (num >= i) {
cout << "无此多项式,请重新输入" << endl;
num = Judge();
}
cout << "多项式" << num << ":";
Exp(a[num]);
break;
case 3:
cout << "当前多项式数量:" << i << endl;
for (int k = 0; k < i; k++) {
cout << "多项式" << k << ":";
Exp(a[k]);
}
break;
case 4:
int s1, s2;
if (i < 1) {
cout << "多项式数量不够,请重新输入" << endl;
break;
}
cout << "请输入第一个多项式的序号:" ;
s1 = Judge();
while (s1 >= i) {
cout << "无此多项式,请重新输入" << endl;
s1 = Judge();
}
cout << "请输入第二个多项式的序号:";
s2 = Judge();
while (s2 >= i) {
cout << "无此多项式,请重新输入" << endl;
s2 = Judge();
}
Add(a[i], a[s1], a[s2]);
cout << "求和成功!求和后多项式序号为:" << i << endl;
i++;
break;
case 5:
int s3, s4;
if (i < 1) {
cout << "多项式数量不够,请重新输入" << endl;
break;
}
cout << "请输入第一个多项式的序号:";
s3 = Judge();
while (s3 >= i) {
cout << "无此多项式,请重新输入" << endl;
s3 = Judge();
}
cout << "请输入第二个多项式的序号:";
s4 = Judge();
while (s4 >= i) {
cout << "无此多项式,请重新输入" << endl;
s4 = Judge();
}
Mul(a[i], a[s3], a[s4]);
cout << "求积成功!求积后多项式序号为:" << i << endl;
i++;
break;
case 6:
cout << "请输入想要删除的多项式序号:";
num = Judge();
while (num >= i) {
cout << "无此多项式,请重新输入" << endl;
num = Judge();
}
Del(a[num]);
cout << "删除成功!" << endl;
break;
case 7:
cout << "请输入想要修改的多项式序号:";
num = Judge();
if (num >= i) {
cout << "无此多项式,请重新输入" << endl;
num = Judge();
}
Mod(a[num]);
break;
}
cout << "==================================" << endl;
cout << "||请输入功能编号,运行相应功能\t||" << endl;
cout << "||1.创建一元多项式\t\t||" << endl;
cout << "||2.输出一元多项式\t\t||" << endl;
cout << "||3.显示所有一元多项式\t\t||" << endl;
cout << "||4.求两个多项式的和\t\t||" << endl;
cout << "||5.求两个多项式的积\t\t||" << endl;
cout << "||6.删除多项式\t\t\t||" << endl;
cout << "||7.修改多项式\t\t\t||" << endl;
cout << "||其他.退出\t\t\t||" << endl;
cout << "==================================" << endl;
}
return 0;
}
//容错处理函数
int Judge() {
int j;
while (1) {
if (!scanf_s("%d", &j)) {
cout << "非法字符!请重新输入:";
while (getchar() != '\n');
}
else if (getchar() != '\n') {
cout << "非法字符!请重新输入:";
while (getchar() != '\n');
}
else if (j < 0) cout << "非法字符!请重新输入:";
else break;
}
return j;
}
//创建一元多项式链表
void Build(HLink& H) {//建立表示多项式的有序链表H
HLink s, pre, q;
H = new PNode;
H->next = NULL;
int n;
cout << "请输入多项式项数:";
n = Judge();//多项式项数
for (int i = 1; i <= n; i++) {
s = new PNode;
cout << "请输入第" << i << "项系数:";
s->coef = Judge();
cout << "请输入第" << i << "项指数:";
s->expn = Judge();
//从头节点开始找,pre作为前驱
pre = H;
q = H->next;
//结点后移,直到输入的指数大于当前结点,或者结点移至末尾
while (q && q->expn < s->expn) {
//if (q->coef == q->next->coef) {
//}
pre = q;
q = q->next;
}
//将输入的结点插入
s->next = q;
pre->next = s;
}
}
//实现输出一元多项式链表
void Exp(HLink H) {
int flag = 0;//记录首位
HLink p = H->next;
if (p == NULL) {
cout << "0";
}
while (p) {//遍历链表
//指数为0时
if (p->expn == 0) {
if (flag == 0) {//首位不输出‘+’
cout << p->coef;
flag++;
}
else {//非首位输出‘+’或‘-’
if (p->coef < 0) {
cout << p->coef;
}
else {
cout << '+' << p->coef;
}
}
}
//指数大于0
else if (p->expn > 0) {
if (flag == 0) {//首位不输出‘+’
cout << p->coef << "x^" << p->expn;
flag++;
}
else {//非首位输出‘+’或‘-’
if (p->coef < 0) {
cout << p->coef << "x^" << p->expn;
}
else {
cout << '+' << p->coef << "x^" << p->expn;
}
}
}
//指数小于0
else if (p->expn < 0) {
if (flag == 0) {//首位不输出‘+’
cout << p->coef << "x^(" << p->expn << ')';
flag++;
}
else {//非首位输出‘+’或‘-’
if (p->coef < 0) {
cout << p->coef << "x^(" << p->expn << ')';
}
else {
cout << '+' << p->coef << "x^(" << p->expn << ')';
}
}
}
p = p->next;
}
cout << endl;
}
void CopyLink(HLink& pc, HLink pa) {
HLink p, q, r;
pc = new PNode;
pc->next = NULL;
r = pc;
p = pa;
while (p->next != NULL) {
q = new PNode;
q->coef = p->next->coef;
q->expn = p->next->expn;
r->next = q;
q->next = NULL;
r = q;
p = p->next;
}
}
//实现一元多项式的加和
void Add(HLink& H, HLink A, HLink B) {
HLink p1, p2, p3, p, C, D;
CopyLink(C, A);
CopyLink(D, B);
p1 = A->next;
p2 = B->next;
H = new PNode;
p3 = H;
while (p1 && p2) {
if (p1->expn < p2->expn) {
p = p1;
p1 = p1->next;
}
else if (p2->expn < p1->expn) {
p = p2;
p2 = p2->next;
}
else {
p1->coef += p2->coef;
if (p1->coef == 0) {
p = p1;
p1 = p1->next;
p = p2;
p2 = p2->next;
continue;
}
p = p2;
p2 = p2->next;
p = p1;
p1 = p1->next;
}
p3->next = p;
p3 = p;
}
if (p1) p3->next = p1;
else if (p2) p3->next = p2;
else p3->next = NULL;
A->next = C->next;
B->next = D->next;
}
//实现一元多项式的乘积
void Mul(HLink& H, HLink A, HLink B) {
HLink ht, q, p, pt;
H = new PNode;
H->next = NULL;
ht = new PNode;
ht->next = NULL;
q = B->next;
while (q) {
pt = ht;
p = A->next;
while (p) {
pt->next = new PNode;
pt = pt->next;
pt->coef = p->coef * q->coef;
pt->expn = p->expn + q->expn;
p = p->next;
}
pt->next = NULL;
q = q->next;
Add(p, H, ht);
H = p;
}
}
//删除多项式
void Del(HLink& H) {
HLink p, temp;
p = H->next;
while (p) {
temp = p;
p = p->next;
delete temp;
}
H->next = NULL;
}
//修改多项式
void Mod(HLink& H) {
HLink temp = H->next;
int cnt, judge, n = 1, sum = 0;
while (temp) {//计算多项式项数
sum++;
temp = temp->next;
}
if (sum == 0) {
cout << "该多项式已不存在。" << endl;
return;
}
while ( n == 1 ) {//对多项式进行修改
temp = H->next;
cout << "请输入想要修改第几项:";
cnt = Judge();
while (cnt > sum) {
cout << "无此项,该多项式项数为" << sum << "请重新输入:";
cnt = Judge();
}
for (int k = 2; k <= cnt; k++) {
temp = temp->next;
}
cout << "请选择指令:1.修改指数,2.修改系数" << endl;
judge = Judge();
while (judge != 1 && judge != 2) {
cout << "无此指令,请重新输入:1.修改指数,2.修改系数" << endl;
judge = Judge();
}
if (judge == 1) {
cout << "将指数改为:";
temp->coef = Judge();
}
if (judge == 2) {
cout << "将系数改为:";
temp->expn = Judge();
}
cout << "第" << cnt << "项修改完成!" << endl;
cout << "请选择指令:1.继续修改,2.退出修改" << endl;
n = Judge();
while (n != 1 && n != 2) {
cout << "无此指令,请重新输入:1.继续修改,2.退出修改" << endl;
n = Judge();
}
}
cout << "修改成功!" << endl;
}