数据结构作业 ------ 用链表实现简单多项式加法
数据结构作业01 ------ 用链表实现简单多项式加法
代码实现:
1 #include <iostream> 2 #include <cstring> 3 #include <cassert> 4 5 using namespace std; 6 7 class Node { 8 public: 9 int coff, exp; 10 11 Node * next; 12 13 Node(){ 14 next = NULL; 15 } 16 17 Node(int n1, int n2, Node* p = NULL):coff(n1),exp(n2), next(p){} 18 }; 19 20 //输出结果 21 void PrintExp(Node *head){ 22 //cout << "\n进入输出函数----------------\n"; 23 Node *p = head->next; 24 25 if(head->next == 0 ){ 26 cout << "0"; 27 } 28 while(p){ 29 30 if(p->coff == 1 && !p->exp){ 31 cout << p->coff ; 32 } 33 34 if(p->coff != 1){ 35 cout << p->coff; 36 } 37 38 //cout << p->coff; 39 if(p->exp == 0){ 40 ; 41 } else if(p->exp == 1){ 42 cout << "X"; 43 } else if(p->exp < 0){ 44 cout << "X^(" << p->exp << ")"; 45 } else { 46 cout << "X^" << p->exp; 47 } 48 if(p->next){ 49 cout << " + "; 50 } 51 p = p->next; 52 } 53 54 55 //cout << endl << endl; 56 } 57 58 //创建多项式 59 Node* CreatExp(char * str) 60 { 61 Node *head, *p, *NewNode, *temp; 62 63 head = new Node(); 64 65 66 int count = 1, n; 67 do{ 68 cout << "\n请输入您要添加的项数:"; 69 cin >> n; 70 }while(n < 1); 71 72 do{ 73 p = head->next; 74 temp = head; 75 76 cout << "请输入第 " << count << " 项系数和指数:"; 77 count++; 78 79 /* 80 * 创建一项数据 81 */ 82 NewNode = new Node(); 83 cin >> NewNode->coff >> NewNode->exp; 84 if(!NewNode->coff){//如果新创建的数据项的系数是0,则不加入多项式中 85 delete NewNode; 86 continue; 87 } 88 89 /* 90 * 插入的时候升序排列 91 */ 92 while((p != NULL) && (p->exp < NewNode->exp)){//找到插入的位置 93 temp = p; 94 p = p->next; 95 } 96 97 if((p != NULL) && (p->exp == NewNode->exp)){ 98 p->coff += NewNode->coff; 99 delete NewNode; 100 } else { 101 temp->next = NewNode; 102 NewNode->next = p; 103 } 104 105 }while(--n); 106 107 cout << "您输入的表达式 Expression(" << str << ") = "; 108 109 110 //输出表达式语句 111 PrintExp(head); 112 cout << endl; 113 114 return head; 115 } 116 117 118 //多项式加法实现 119 Node* Add(Node* pExp1, Node* pExp2) 120 { 121 //cout << "\n进入加法函数----------......\n"; 122 Node *head, *p, *temp; 123 124 head = p = new Node(); 125 pExp1 = pExp1->next; 126 pExp2 = pExp2->next; 127 128 while(pExp1 != NULL && pExp2 != NULL ){ 129 //cout << "\n------------------进入大循环XXXXXX\n"; 130 if((pExp1->exp) < (pExp2->exp)){ 131 p->next = new Node(pExp1->coff, pExp1->exp); 132 pExp1 = pExp1->next; 133 } else if((pExp1->exp) > (pExp2->exp)) { 134 p->next = new Node(pExp2->coff, pExp2->exp); 135 pExp2 = pExp2->next; 136 } else { 137 if(pExp2->coff + pExp1->coff){//如果系数和为0,则不加入 138 p->next = new Node(pExp2->coff + pExp1->coff, pExp2->exp); 139 } 140 pExp1 = pExp1->next; 141 pExp2 = pExp2->next; 142 } 143 144 p = p->next; 145 } 146 147 148 149 //将尚未结束的表达式并入结果表达式 150 if(pExp1 == NULL){ //如果表达式1已经结束 151 temp = pExp2; 152 } else { //如果表达式1已经结束 153 temp = pExp1; 154 } 155 156 while(temp != NULL){ 157 if(temp->exp == p->exp){ 158 p->coff += temp->coff; 159 temp = temp->next; 160 161 } else { 162 p->next = new Node(temp->coff, temp->exp); 163 temp = temp->next; 164 p = p->next; 165 } 166 167 }168 169 //assert(p->next == NULL); 170 171 172 return head; 173 } 174 175 int main() 176 { 177 while(true){ 178 Node *A = CreatExp("A"); 179 Node *B = CreatExp("B"); 180 181 Node *C = Add(A,B); 182 183 cout << "\nExpresion< " ; 184 PrintExp(A); 185 cout << " > + Expresion< " ; 186 PrintExp(B); 187 cout << " > = < "; 188 PrintExp(C); 189 190 cout << " >\n\n\n-------------------------------------------"; 191 } 192 193 return 0; 194 }
测试结果:
请输入您要添加的项数:1 请输入第 1 项系数和指数:1 5 您输入的表达式 Expression(A) = X^5 请输入您要添加的项数:1 请输入第 1 项系数和指数:3 8 您输入的表达式 Expression(B) = 3X^8 Expresion< X^5 > + Expresion< 3X^8 > = < X^5 + 3X^8 > ------------------------------------------- 请输入您要添加的项数:1 请输入第 1 项系数和指数:4 0 您输入的表达式 Expression(A) = 4 请输入您要添加的项数:1 请输入第 1 项系数和指数:0 4 您输入的表达式 Expression(B) = 0 Expresion< 4 > + Expresion< 0 > = < 4 > ------------------------------------------- 请输入您要添加的项数:1 请输入第 1 项系数和指数:2 0 您输入的表达式 Expression(A) = 2 请输入您要添加的项数:1 请输入第 1 项系数和指数:0 3 您输入的表达式 Expression(B) = 0 Expresion< 2 > + Expresion< 0 > = < 2 > ------------------------------------------- 请输入您要添加的项数:1 请输入第 1 项系数和指数:3 6 您输入的表达式 Expression(A) = 3X^6 请输入您要添加的项数:1 请输入第 1 项系数和指数:-3 6 您输入的表达式 Expression(B) = -3X^6 Expresion< 3X^6 > + Expresion< -3X^6 > = < 0 > ------------------------------------------- 请输入您要添加的项数:2 请输入第 1 项系数和指数:1 2 请输入第 2 项系数和指数:2 4 您输入的表达式 Expression(A) = X^2 + 2X^4 请输入您要添加的项数:2 请输入第 1 项系数和指数:3 8 请输入第 2 项系数和指数:3 4 您输入的表达式 Expression(B) = 3X^4 + 3X^8 Expresion< X^2 + 2X^4 > + Expresion< 3X^4 + 3X^8 > = < X^2 + 5X^4 + 3X^8 > ------------------------------------------- 请输入您要添加的项数:1 请输入第 1 项系数和指数:2 3 您输入的表达式 Expression(A) = 2X^3 请输入您要添加的项数:4 请输入第 1 项系数和指数:1 9 请输入第 2 项系数和指数:4 0 请输入第 3 项系数和指数:3 2 请输入第 4 项系数和指数:7 -4 您输入的表达式 Expression(B) = 7X^(-4) + 4 + 3X^2 + X^9 Expresion< 2X^3 > + Expresion< 7X^(-4) + 4 + 3X^2 + X^9 > = < 7X^(-4) + 4 + 3X^2 + 2X^3 + X^9 > ------------------------------------------- 请输入您要添加的项数:5 请输入第 1 项系数和指数:1 8 请输入第 2 项系数和指数:3 21 请输入第 3 项系数和指数:-6 8 请输入第 4 项系数和指数:0 2 请输入第 5 项系数和指数:7 4 您输入的表达式 Expression(A) = 7X^4 + -5X^8 + 3X^21 请输入您要添加的项数:7 请输入第 1 项系数和指数:9 9 请输入第 2 项系数和指数:8 8 请输入第 3 项系数和指数:7 7 请输入第 4 项系数和指数:6 6 请输入第 5 项系数和指数:5 5 请输入第 6 项系数和指数:4 4 请输入第 7 项系数和指数:3 3 您输入的表达式 Expression(B) = 3X^3 + 4X^4 + 5X^5 + 6X^6 + 7X^7 + 8X^8 + 9X^9 Expresion< 7X^4 + -5X^8 + 3X^21 > + Expresion< 3X^3 + 4X^4 + 5X^5 + 6X^6 + 7X^7 + 8X^8 + 9X^9 > = < 3X^3 + 11X^4 + 5X^5 + 6X^6 + 7X^7 + 3X^8 + 9X^9 + 3X^21 >