多项式相加

35 阅读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;
}

void outputFile(NODE* head){
	FILE* f = NULL;
	
	f = fopen("C:\\Users\\王贺祥\\Desktop\\output.txt", "w");
	if(f == NULL){
		cout << "open file error" << endl;
		return;
	}
	
	NODE* p = head;
	while(p != NULL){
		if(p != head){
			fprintf(f, "+");
			cout << '+';
		}
		fprintf(f,"%dx^%d", p->data.a, p->data.b);
		cout << p->data.a << "x^" << p->data.b;
		
		p = p->next;
	}
	
	fclose(f);
}

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);
	Insert_sort(&head2);
	
	NODE* ans = addLinks(head1, head2);
	
	//输出 
	NODE* p = ans;
	while(p != NULL){
		if(p != ans)
			cout << '+';
		cout << p->data.a << "x^" << p->data.b;
		p = p->next;
	}
	
	cout << endl << "file:" << endl;
	
	//写入文件
	outputFile(ans); 
	
	//释放内存 
	p = ans;
	NODE* tem;
	while(p != NULL){
		tem = p;
		p = p->next;
		delete tem;
	}

	return 0;
}