//#include<stdio.h>
//#include<stdlib.h>
#include"stdafx.h"
#include<malloc.h>
#include<Windows.h>
//#define ERROR 0;
//#define OVERFLOW 0;
typedef struct Polyn {
int expn, coef;
Polyn* next;
}*P;
P CreatePolyn(Polyn *P); // 创建节点
Polyn* SelectSort(Polyn *Pa); // 选择排序
Polyn* MergePolyn(Polyn *Pa); //合并同类项
void PrintPolyn(Polyn *P); // 打印多项式
int cmp(int a, int b); // 比较函数
P AddPolyn(P Pa, P Pb); // 多项式相加
P MultiPolyn(P Pa, P Pb); // 多项式相乘
/*------------------------Dome---------------------------------*/
int main()
{
P Pa, Pb, Pc, Pd;
Pa = (Polyn *)malloc(sizeof(Polyn));
Pb = (Polyn *)malloc(sizeof(Polyn));
Pa = CreatePolyn(Pa);
Pb = CreatePolyn(Pb);
Pd = MultiPolyn(Pa, Pb);
Pc = AddPolyn(Pa, Pb);
system("pause");
return 0;
}
/*-----------------------打印多项式------------------------------*/
void PrintPolyn(Polyn* P)
{
Polyn* q = P->next;
//若多项式为空
printf("\n");
while (q->next != NULL)
{
if (q->coef>0) printf("%d*x^%d+", q->coef, q->expn);
else if (q->coef < 0) {
printf("(%d)*x^%d+", q->coef, q->expn);
}
else printf("");
q = q->next;
}
if (q->coef>0) printf("%d*x^%d", q->coef, q->expn);
else printf("(%d)*x^%d", q->coef, q->expn);
}
/*-----------------------合并同类项------------------------------*/
Polyn* MergePolyn(Polyn *Pa) {
P p, pBefore, del;
pBefore = Pa->next;
p = pBefore->next;
while (p) {
if (p->expn == pBefore->expn) {
del = p;
pBefore->coef = pBefore->coef + p->coef;
p = p->next;
pBefore->next = p;
free(del);
}
else
pBefore = p;
p = p->next;
}
//PrintPolyn(Pa);
return Pa;
}
/*-----------------------创建节点--------------------------------*/
P CreatePolyn(Polyn *P)
{
Polyn *previous, *current, *head;
head = (Polyn *)malloc(sizeof(Polyn));
if (!head) exit(0);
head->coef = 0;
head->expn = -1;
head->next = NULL;
previous = head;
int coef, expn;
printf("\n请输入系数和指数(输入为(0,0)时结束):\n");
scanf_s("%d%d", &coef, &expn);
for (; (coef != 0) || (expn != 0);)
{
if (coef != 0) {
current = (Polyn *)malloc(sizeof(Polyn));
current->coef = coef;
current->expn = expn;
current->next = NULL;
previous->next = current;
previous = current;
current = previous->next;
scanf_s("%d%d", &coef, &expn);
}
else scanf_s("%d%d", &coef, &expn);
}
P = SelectSort(head);
P = MergePolyn(head);
PrintPolyn(P);
return P;
}
/*------------------------选择排序-------------------------------*/
Polyn* SelectSort(Polyn *head)
{
Polyn *pfirst = NULL; //有序链表表头指针
Polyn *ptail = NULL; //有序链表表尾指针
Polyn *pmin = NULL; //存储最小节点
Polyn *pminBefore = NULL; //存储最小节点的前驱节点
Polyn *p = NULL; //当前比较节点
//pfirst = NULL;
while (head != NULL) /*在链表中找键值最小的节点。*/
{
/* 注意:这里for语句就是体现选择排序思想的地方 */
for (p = head, pmin = head; p->next != NULL; p = p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/
{
if (p->next->expn < pmin->expn) /*找到一个比当前min小的节点。*/
{
pminBefore = p; /*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/
pmin = p->next; /*保存键值更小的节点。*/
}
}
/*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。
第一件事*/
if (pfirst == NULL) /* 如果有序链表目前还是一个空链表 */
{
pfirst = pmin; /* 第一次找到键值最小的节点。 */
ptail = pmin; /* 注意:尾指针让它指向最后的一个节点。 */
}
else /* 有序链表中已经有节点 */
{
ptail->next = pmin; /* 把刚找到的最小节点放到最后,即让尾指针的next指向它。*/
ptail = pmin; /* 尾指针也要指向它。 */
}
/*第二件事*/
if (pmin == head) /* 如果找到的最小节点就是第一个节点 */
{
head = head->next; /* 显然让head指向原head->next,即第二个节点,就OK */
}
else /*如果不是第一个节点*/
{
pminBefore->next = pmin->next; /*前次最小节点的next指向当前pmin的next,这样就让pmin离开了原�