DSOJ Addition of Polynomial(多項式求和)

題目鏈接

#include<stdio.h>		//多項式的加法
#include<stdlib.h>		//多項式本身可能不是最簡的情況,即需要合併多項式冪指數相同的項

typedef struct node
{
	int coef;	//係數coefficient
	int expn;	//指數exponent
	struct node *next;
}Node;

Node *insert(Node *head, Node *p)	//插入函數
{
	Node *p1, *p2;
	if (head->next == NULL)
	{
		head->next = p;
		p->next = NULL;
		return head;
	}
	else
	{
		p1 = p2 = head->next;
		while (p->expn < p1->expn&&p1->next != NULL)
		{
			p2 = p1;
			p1 = p1->next;
		}
		if (p->expn >= p1->expn)
		{
			p->next = p1;
			if (p1 == head->next)
				head->next = p;
			else
				p2->next = p;
		}
		else
		{
			p1->next = p;
			p->next = NULL;
		}
	}
	return head;
}

Node *create()		//創建按照冪指數升序排列的帶頭鏈表
{
	Node *head, *p;
	int coef, expn;
	head = (Node *)malloc(sizeof(Node));
	head->next = NULL;
	scanf("%d %d", &coef, &expn);
	while (expn >= 0)
	{
		p = (Node *)malloc(sizeof(Node));
		p->coef = coef;
		p->expn = expn;
		head = insert(head, p);
		scanf("%d %d", &coef, &expn);
	}
	return head;
}

Node *ADD(Node *A, Node *B)		//多項式相加(冪指數降序)
{
	Node *pa1, *pa2, *pb, *p;
	pa1 = A->next;
	pa2 = A;			//pa2指向pa1的前驅
	pb = B->next;
	while (pa1&&pb)
	{
		if (pb->expn < pa1->expn)		//將A的當前節點後移即可
		{
			pa2 = pa1;
			pa1 = pa1->next;
		}
		else
			if (pb->expn > pa1->expn)	//插入在pa1之前
			{
				p = pb->next;
				pb->next = pa1;
				pa2->next = pb;
				pa2 = pb;
				pb = p;
			}
			else              //冪指數相等
			{						
				pa1->coef = pa1->coef + pb->coef;		//先相加,之後再刪除係數爲0的項
				pa2 = pa1;
				pa1 = pa1->next;
				pb = pb->next;
			}
	}
	if (pb)
		pa2->next = pb;
	return A;
}

void simplify(Node *head)		//將多項式化爲最簡,即合併同指數冪項
{
	Node *p1, *p2, *p;
	p2 = head->next;
	if (!p2) return;
	p1 = p2->next;
	while (p1)
	{
		if (p2->expn == p1->expn)
		{
			p2->coef = p2->coef + p1->coef;
			p = p1;
			p1 = p1->next;
			p2->next = p1;
			free(p);
		}
		else
		{
			p2 = p1;
			p1 = p1->next;
		}
	}
}

void delzero(Node *head)		//刪除coef爲零的節點
{
	Node *p1, *p2, *p;
	p2 = head;
	p1 = head->next;
	while (p1)
	{
		if (p1->coef == 0)
		{
			p = p1;
			if (p1 == head->next)
				head->next = p1->next;
			else
				p2->next = p1->next;
			p1 = p1->next;
			free(p);
		}
		else
		{
			p2 = p1;
			p1 = p1->next;
		}
	}
}

void show(Node *A)
{
	Node *p;
	p = A->next;
	while (p)
	{
		printf("[ %d %d ] ", p->coef, p->expn);
		p = p->next;
	}
	printf("\n");
}

int main()
{
	Node *A[100], *B[100];
	int i, n;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		A[i] = create(); 
		B[i] = create();
		A[i] = ADD(A[i], B[i]);
	}
	for (i = 0; i < n; i++)
	{
		simplify(A[i]);
		delzero(A[i]);
		show(A[i]);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章