1. 多项式乘法
#include <bits/stdc++.h>
using namespace std;
struct DATA{
int a;
int b;
};
struct NODE{
DATA data;
NODE* next;
};
NODE* file_read(const char ad[]){
FILE* f = NULL;
int a, b;
NODE *head = NULL;
f = fopen(ad, "r");
while(fscanf(f, "%d,%d", &a, &b) == 2){
NODE* newNode = new NODE;
newNode->data.a = a;
newNode->data.b = b;
newNode->next = head;
head = newNode;
}
fclose(f);
return head;
}
void Insert_sort(NODE** head){
if((*head) == NULL || (*head)->next == NULL) return;
NODE* sorted = NULL;
NODE* currentNode = *head;
*head = NULL;
while(currentNode != NULL){
NODE* next = currentNode->next;
if(sorted == NULL || sorted->data.b > currentNode->data.b){
currentNode->next = sorted;
sorted = currentNode;
}else{
NODE* p = sorted;
while(p->next != NULL && p->next->data.b < currentNode->data.b) p = p->next;
currentNode->next = p->next;
p->next = currentNode;
}
currentNode = next;
}
*head = sorted;
}
NODE* creatNode(int a, int b){
NODE* p = new NODE;
p->data.a = a;
p->data.b = b;
p->next = NULL;
return p;
}
NODE* addLinks(NODE* head1, NODE* head2){
NODE* ans = NULL, *tem;
NODE *i = head1, *j = head2;
while(i != NULL && j != NULL){
int ia = i->data.a, ib = i->data.b;
int ja = j->data.a, jb = j->data.b;
if(ib < jb){
tem = creatNode(ia, ib);
tem->next = ans;
ans = tem;
i = i->next;
}
if(ib == jb){
tem = creatNode(ia + ja, ib);
i = i->next;
j = j->next;
tem->next = ans;
ans = tem;
}
if(ib > jb){
tem = creatNode(ja, jb);
tem->next = ans;
ans = tem;
j = j->next;
}
}
while(i != NULL){
tem = creatNode(i->data.a, i->data.b);
tem->next = ans;
ans = tem;
i = i->next;
}
while(j != NULL){
tem = creatNode(j->data.a, j->data.b);
tem->next = ans;
ans = tem;
j = j->next;
}
return ans;
}
NODE* MultiLinks(NODE* head1, NODE* head2){
NODE* head = NULL;
while(head1 != NULL){
NODE* p = head2;
NODE* temHead = NULL;
while(p != NULL){
NODE* tem = new NODE;
tem->data.a = p->data.a * head1->data.a;
tem->data.b = p->data.b + head1->data.b;
p = p->next;
tem->next = temHead;
temHead = tem;
}
head1 = head1->next;
head = addLinks(head, temHead);
}
return head;
}
void outputFile(NODE* head, const char add[100]){
FILE* f = NULL;
f = fopen(add, "w");
if(f == NULL){
cout << "open file error" << endl;
return;
}
NODE* p = head;
while(p != NULL){
if(p != head){
fprintf(f, " + ");
}
fprintf(f,"%dx^%d", p->data.a, p->data.b);
p = p->next;
}
fclose(f);
}
void outPut(NODE* head){
NODE* p = head;
while(p != NULL){
if(p != head) cout << " + ";
cout << p->data.a << "x^" << p->data.b;
p = p->next;
}
cout << endl;
}
void freeR(NODE* head){
NODE* p = head;
while(p != NULL){
head = head->next;
delete p;
p = head;
}
}
void sim(NODE** head){
NODE* tem = *head;
NODE* ans = tem;
NODE* p = NULL;
while(tem->next != NULL){
if(tem->data.b == tem->next->data.b){
tem->data.a += tem->next->data.a;
p = tem->next;
tem->next = p->next;
delete p;
continue;
}
tem = tem->next;
}
*head = ans;
}
void reserve(NODE** head){
NODE* rear = *head;
*head = NULL;
NODE* tail = rear;
NODE* tem = NULL;
while(tail->next != NULL){
tem = tail->next;
tail->next = tail->next->next;
tem->next = rear;
rear = tem;
}
*head = rear;
}
int main(){
char address1[100] = "C:\\Users\\王贺祥\\Desktop\\input1.txt";
char address2[100] = "C:\\Users\\王贺祥\\Desktop\\input2.txt";
NODE* head1 = file_read(address1);
NODE* head2 = file_read(address2);
Insert_sort(&head1);
sim(&head1);
Insert_sort(&head2);
sim(&head2);
NODE* ans_Add = addLinks(head1, head2);
NODE* ans_Multi = MultiLinks(head1, head2);
Insert_sort(&ans_Multi);
sim(&ans_Multi);
cout << "file add:" << endl;
outPut(ans_Add);
cout << "file multi:" << endl;
reserve(&ans_Multi);
outPut(ans_Multi);
outputFile(ans_Add, "C:\\Users\\王贺祥\\Desktop\\output_add.txt");
outputFile(ans_Multi, "C:\\Users\\王贺祥\\Desktop\\output_multi.txt");
freeR(ans_Add);
freeR(ans_Multi);
return 0;
}