欢迎来到 A_Dull_Rabbit 的博客

数据结构实训(一)--- 单链表应用------一元多项式

【问题描述】编写一个程序用单链表存储多项式,并实现两个一元多项式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() != '\n');
 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 }

 

posted on 2020-03-24 14:06  A_Dull_Rabbit  阅读(579)  评论(0编辑  收藏  举报

导航