乘法

33 阅读2分钟

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;
}