【问题描述】编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是升序的,A与B之和按降序排列。例如:
多项式A: 1.2X^0 2.5X^1 3.2X^3 -2.5X^5
多项式B: -1.2X^0 2.5X^1 3.2X^3 2.5X^5 5.4X^10
多项式A与B之和:5.4X^10 6.4X^3 5X^1
【输入形式】任意两个多项式A和B
【输出形式】多项式中某一项的系数与指数,系数保留一位小数。
【样例输入】1.2 0 2.5 1 3.2 3 -2.5 5
-1.2 0 2.5 1 3.2 3 2.5 5 5.4 10
2
【样例输出】6.4 3
【样例说明】 第一个多项式的系数与指数对,以空格隔开
第二个多项式的系数与指数对,以空格隔开
输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数
【评分标准】必须用链表实现。
1 #include <iostream> 2 #include <vector> 3 #include <iomanip> 4 using namespace std; 5 6 7 // 节点定义 8 typedef struct node 9 { 10 float data; // 数据项 11 int exp; // 指数项 12 node* next; // 指向下个节点的指针 13 } node; 14 15 // 函数声明 16 node* LinkList(node* first,vector<float> dataTemp,vector<int> expTemp,int len); // 链表构建 17 node* LinkCreate(); // 多项式构建 18 void SaveLeft(vector<float> &dataTemp, vector<int> &expTemp, int &LengthTemp, node* polyTemp1, node* polyTemp2); // 参数一二存储多项式A和B的和 19 20 // 主程序 21 int main() 22 { 23 node* poly_1 = LinkCreate(); // 多项式A 24 node* poly_2 = LinkCreate(); // 多项式B 25 26 vector<float> dataMain; // 存储数据向量 27 vector<int> expMain; // 存储指数向量 28 int length, num; // length 存储 dataMain、expMain、两向量的长度; num为需要找的第几项 29 30 SaveLeft(dataMain, expMain, length, poly_1, poly_2); // 存储多项式的和 31 cin >> num; 32 cout << fixed << setprecision(1) << dataMain[length-num]; 33 cout << " " << expMain[length-num]; 34 35 } 36 37 38 /** 39 * 尾插法单链表 40 * @param 41 * first 头指针、 dataTemp 数据项数组、 expTemp 指数项数组、 len 链表长度 42 */ 43 node* LinkList(node* first,vector<float> dataTemp,vector<int> expTemp,int len) 44 { 45 // 头结点 46 first = new node; 47 first->next = NULL; 48 // 中间节点 49 node* p; 50 node* rear = first; 51 // 数据插入 52 for(int i=0; i<len; i++) 53 { 54 p = new node; 55 p->data = dataTemp[i]; 56 p->exp = expTemp[i]; 57 rear->next = p; 58 rear = p; 59 } 60 rear->next = NULL; 61 // 返回头结点 62 return first; 63 } 64 65 66 // 链表创建 67 node* LinkCreate() 68 { 69 int le = 0; // 链表长度 70 vector<float> dT; // 存储数据向量 71 vector<int> eT; // 存储指数向量 72 73 do 74 { 75 float a; 76 int b; 77 cin >> a >> b; 78 dT.push_back(a); 79 eT.push_back(b); 80 le++; 81 } 82 while(cin.get() != ' '); 83 84 node* poly = NULL; 85 poly = LinkList(poly, dT, eT, le); 86 87 return poly; 88 } 89 90 91 /** 92 * @param 93 * dataTemp 存储多项式A+B的系数 expTemp存储多项式A+B的指数 LengthTemp存储A+B的长度 94 * polyTemp1 多项式A polyTemp2 多项式B 95 */ 96 void SaveLeft(vector<float> &dataTemp, vector<int> &expTemp, int &LengthTemp, node* polyTemp1, node* polyTemp2) 97 { 98 node* i = polyTemp1->next; 99 node* j = polyTemp2->next; 100 LengthTemp = 0; 101 while(i != NULL || j!=NULL) 102 { 103 if(i == NULL) 104 { 105 while(j != NULL) 106 { 107 dataTemp.push_back(j->data); 108 expTemp.push_back(j->exp); 109 // cout << dataMain[k] << " " << expMain[k] << endl; 110 LengthTemp++; 111 j = j->next; 112 } 113 } 114 else if(j == NULL) 115 { 116 while(i != NULL) 117 { 118 dataTemp.push_back(i->data); 119 expTemp.push_back(i->exp); 120 // cout << dataMain[k] << " " << expMain[k] << endl; 121 LengthTemp++; 122 i = i->next; 123 } 124 } 125 else if(i->exp == j->exp) 126 { 127 if(i->data != -(j->data) ) 128 { 129 dataTemp.push_back(i->data+j->data); 130 expTemp.push_back(i->exp); 131 LengthTemp++; 132 } 133 i = i->next; 134 j = j->next; 135 } 136 else if(i->exp > j->exp) 137 { 138 dataTemp.push_back(j->data); 139 expTemp.push_back(j->exp); 140 LengthTemp++; 141 j = j->next; 142 } 143 else if(i->exp < j->exp) 144 { 145 dataTemp.push_back(i->data); 146 expTemp.push_back(i->exp); 147 LengthTemp++; 148 i = i->next; 149 } 150 } 151 }