用链表实现一元多项式的加、减、乘、求导运算

  在数据结构线性表的链表学习中有一个很有趣的题目:计算两个多项式的加、减、乘和多项式的导数。

  题目不难,将多项式的系数和指数存进链表然后进行相应操作即可。

  一、加法:

    1、判断指数是否相等,若相等则将系数相加,相加后不为零就开辟新空间,将新的系数存入结点,尾插进新链表中。

    2、如果表达式1的指数小于表达式2的指数,就将表达式1的该结点数据复制进新结点中,并将新结点尾插进新链表。

    3、如果表达式2的指数小于表达式1的指数,就将表达式2的该结点数据复制进新结点中,并将新结点尾插进新链表。

    4、返回新链表的头指针。

  二、减法:

    1、将被减链表的每一项的系数都乘以-1,执行两个表达式相加操作。

    2、将被减链表复原。

  三、乘法:

    将链表1的每一项乘以链表2的每一项,然后将它们相加。

  四、导数:

    将链表的指数和系数相乘,再将指数减一。

代码:

#include <stdio.h>
#include <stdlib.h>

//poly数据类型
typedef struct poly{
	int coef;
	int expn;
	struct poly *pNext;
}POLY;

//初始化表达式
POLY *InitPoly(void)
{
	POLY *pHead;
	if ((pHead = (POLY *)malloc(sizeof(POLY))) == NULL)
		exit(-1);
	pHead->pNext = NULL;

	return pHead;
}

//释放链表
void FreeList(POLY *pHead)
{
	POLY *pTemp1, *pTemp2;
	pTemp1 = pHead->pNext;
	while(pTemp1 != NULL){
		pTemp2 = pTemp1->pNext;
		free(pTemp1);
		pTemp1 = pTemp2;
	}

	pHead->pNext = NULL;
}

//销毁链表
void DesList(POLY *pHead)
{
	FreeList(pHead);
	free(pHead);
}

//输入表达式
void InputPoly(POLY *pHead)
{
	int coef,expn;
	POLY *pTail,*pNew;
	pTail = pHead;

	while(1){
		printf("请输入(系数,指数),需指数递增输入,系数为0时结束输入:");
		scanf("%d,%d", &coef, &expn);
		if (coef != 0){
			if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
				exit(-1);
			pNew->coef = coef;
			pNew->expn = expn;
			pTail->pNext = pNew;
			pTail = pNew;
		}
		else{
			break;
		}
	}

	pTail->pNext = NULL;
}

//输出表达式
void OutputPoly(POLY *pHead)
{
	POLY *pTemp;
	pTemp = pHead->pNext;

	if (pTemp == NULL){
		printf("\n");
		return;
	}
	printf("%dx^%d", pTemp->coef, pTemp->expn);
	pTemp = pTemp->pNext;

	while(pTemp != NULL){
		printf("%+dx^%d", pTemp->coef, pTemp->expn);
		pTemp = pTemp->pNext;
	}

	printf("\n");
}

//表达式相加
POLY *AddPoly(POLY *pHead1, POLY *pHead2)
{
	int temp;
	POLY *pHead3, *pNew, *pTail;	//结果链表相关变量
	POLY *pTemp1, *pTemp2;			//运算链表相关变量

	pTemp1 = pHead1->pNext;
	pTemp2 = pHead2->pNext;
	pHead3 = InitPoly();
	pTail = pHead3;
	
	//将两个多项式扫描运算后放入结果链表中
	while(pTemp1 != NULL && pTemp2 != NULL){
		//如果指数相等
		if (pTemp1->expn == pTemp2->expn){
			
			if ((temp = pTemp1->coef + pTemp2->coef) == 0){
				pTemp1 = pTemp1->pNext;
				pTemp2 = pTemp2->pNext;
				continue;
			}
			if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
				exit(-1);
			pNew->coef = temp;
			pNew->expn = pTemp1->expn;
			pTail->pNext = pNew;
			pNew->pNext = NULL;
			pTail = pNew;
			pTemp1 = pTemp1->pNext;
			pTemp2 = pTemp2->pNext;

		}//如果表达式1指数小于2
		else if(pTemp1->expn < pTemp2->expn){
			if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
				exit(-1);
			*pNew = *pTemp1;
			pNew->pNext = NULL;
			pTail->pNext = pNew;
			pTail = pNew;
			pTemp1 = pTemp1->pNext;
		}//如果表达式1指数大于2
		else{
			if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
				exit(-1);
			*pNew = *pTemp2;
			pNew->pNext = NULL;
			pTail->pNext = pNew;
			pTail = pNew;
			pTemp2 = pTemp2->pNext;
		}
	}
	//将剩余的未扫描项放入结果链表中
	while(pTemp1 != NULL){
		if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
			exit(-1);
		*pNew = *pTemp1;
		pNew->pNext = NULL;
		pTail->pNext = pNew;
		pTail = pNew;
		pTemp1 = pTemp1->pNext;
	}
	while(pTemp2 != NULL){
		if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
			exit(-1);
		*pNew = *pTemp2;
		pNew->pNext = NULL;
		pTail->pNext = pNew;
		pTail = pNew;
		pTemp2 = pTemp2->pNext;
	}

	return pHead3;
}

//两个多项式减法
POLY *SubPoly(POLY *pHead1, POLY *pHead2)
{
	POLY *pHead3, *pTemp;
	pTemp = pHead2->pNext;
	
	//被减表达式每一项系数乘以-1
	while(pTemp != NULL){
		pTemp->coef = -1 * pTemp->coef;
		pTemp = pTemp->pNext;
	}

	pHead3 = AddPoly(pHead1, pHead2);
	
	//将被减表达式值复原
	pTemp = pHead2->pNext;
	while(pTemp != NULL){
		pTemp->coef = -1 * pTemp->coef;
		pTemp = pTemp->pNext;
	}
	return pHead3;
}

//两个多项式相乘
POLY *MultPoly(POLY *pHead1, POLY *pHead2)
{
	POLY *pResult, *pTemp1, *pTemp2, *pMult1, *pMult2, *pNew, *pTail;

	pMult1 = InitPoly();
	pMult2 = InitPoly();
	pTemp1 = pHead1->pNext;

	while(pTemp1 != NULL){
		FreeList(pMult1);
		pTail = pMult1;
		pTemp2 = pHead2->pNext;
		while(pTemp2 != NULL){
			
			if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
				exit(-1);
			pNew->coef = pTemp1->coef * pTemp2->coef;
			pNew->expn = pTemp1->expn + pTemp2->expn;
			pNew->pNext = NULL;
			pTail->pNext = pNew;
			pTail = pNew;
			pTemp2 = pTemp2->pNext;
		}
		pResult = AddPoly(pMult1, pMult2);
		FreeList(pMult2);
		pMult2->pNext = pResult->pNext;
		pTemp1 = pTemp1->pNext;
	}

	DesList(pMult1);
	free(pMult2);

	return pResult;
}




//多项式求导
POLY *DerPoly(POLY *pHead)
{
	POLY *pTemp = pHead->pNext;
	POLY *pNew, *pHead1, *pTail;
	pHead1 = InitPoly();
	pTail = pHead1;
	while(pTemp != NULL){
		if (pTemp->expn == 0){
			pTemp = pTemp->pNext;
			continue;
		}
		if ((pNew = (POLY *)malloc(sizeof(POLY))) == NULL)
			exit(-1);
		pNew->coef = pTemp->coef * pTemp->expn;
		pNew->expn = pTemp->expn - 1;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
		pTemp = pTemp->pNext;
	}

	return pHead1;
}

int main(void)
{
	POLY *pHead1, *pHead2, *result;
	pHead1 = InitPoly();
	InputPoly(pHead1);
	pHead2 = InitPoly();
	InputPoly(pHead2);
	printf("表达式1:");
	OutputPoly(pHead1);
	printf("表达式2:");
	OutputPoly(pHead2);
	result = AddPoly(pHead1, pHead2);
	printf("表达式1 + 表达式2 = ");
	OutputPoly(result);
	DesList(result);
	result = SubPoly(pHead1, pHead2);
	printf("表达式1 - 表达式2 = ");
	OutputPoly(result);
	DesList(result);
	result = SubPoly(pHead2, pHead1);
	printf("表达式2 - 表达式1 = ");
	OutputPoly(result);
	DesList(result);
	result = DerPoly(pHead1);
	printf("表达式1求导 = ");
	OutputPoly(result);
	DesList(result);
	result = MultPoly(pHead1, pHead2);
	printf("表达式1 * 表达式2 = ");
	OutputPoly(result);
	DesList(result);
	DesList(pHead1);
	DesList(pHead2);

	return 0;
}

posted @ 2015-09-09 15:27  Jung_zhang  阅读(1222)  评论(1编辑  收藏  举报