c语言n元多项式乘法,如何用C语言实现n元多项式乘法

/*

* 文件名: 1_3。c(选做题)

* 实验环境: Turbo C 2。0

* 完成时间: 2003年2月22日

*--------------------------------------------------------------------

* 改进说明: 可以实现多个多项式的加法、减法、乘法,并且比书中算法更加

* 合理。

例如: 连加a b c d,连减a-b-c-d,连乘a*b*c*d。

*/

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define POSITIVE 1

#define NEGATIVE -1

typedef int status;

typedef struct NodeType

{

float fCoeff;

int iExpon;

struct NodeType *next;

} NodeType, *LinkType;

typedef LinkType polynomial;

typedef polynomial *PolyPointer;

status MakePolyBuff(PolyPointer *, const int);

status MakeNode(polynomial *, const float, const int);

void AppNodeToList(polynomial *, polynomial); /* 在链表尾追加结点 */

status CreatePolyn(PolyPointer, int);

status ProcStrError(const char[]); /* 检查输入的数据 */

void SortPolyn(PolyPointer, int); /* 根据iExpon域对链表进行升序排序 */

void DestroyBuff(PolyPointer, const int);

void DestroyPolyn(polynomial);

int PolynLength(const polynomial); /* 求链表的长度 */

void AddProcess(PolyPointer, const int, PolyPointer, const int);

void SubstractProcess(PolyPointer, const int, PolyPointer);

void MultiplyProcess(PolyPointer, const int, PolyPointer);

void PrintPolyn(const polynomial);

void MergePolynCoeff(PolyPointer, int); /* 在有序链表中,合并同类项 */

int main(void)

{

int iCounter,

iPolyNum; /* 多项式链表缓冲区中链表的个数 */

PolyPointer PolyBuff = NULL; /* 用户输入的多项式链表缓冲区 */

polynomial PolyAddRes = NULL, /* 存放连加结果链表 */

PolySubRes = NULL, /* 存放连减结果链表 */

PolyMulRes = NULL; /* 存放连乘结果链表 */

char strNum[10];

do

{

printf("请输入需要构造多项式的个数,至少2个: ");

gets(strNum);

iPolyNum = atoi(strNum);

} while (iPolyNum fCoeff = coeff;

(*pp)->iExpon = expon;

(*pp)->next = NULL;

return TRUE;

}

void AppNodeToList(polynomial *pHead, polynomial pNewNode)

{

static polynomial pCurrNode;

if (!(*pHead))

(*pHead) = pCurrNode = pNewNode;

else

{

pCurrNode->next = pNewNode;

pCurrNode = pCurrNode->next;

}

}

void SortPolyn(PolyPointer PolyBuff, int iPolyNum)

{

int iCounter;

polynomial pTemp, pTempCurrNode, /* 临时链表 */

pPrevMinExp, pCurrMinExp,/* 指向最小iExpon结点的指针 */

pCurrNode, pPrevNode;

for (iCounter = 0; iCounter next;

while (pCurrNode != NULL)

{

if (pCurrMinExp->iExpon > pCurrNode->iExpon)

{

pPrevMinExp = pPrevNode;

pCurrMinExp = pCurrNode;

}

pPrevNode = pCurrNode;

pCurrNode = pCurrNode->next;

}

/* 将系数最小的结点从原链表中取出 */

if (pCurrMinExp == *(PolyBuff iCounter))

*(PolyBuff iCounter) = pPrevMinExp->next;

else

pPrevMinExp->next = pCurrMinExp->next;

/* 将系数最小的结点插入升序链表 */

pCurrMinExp->next = NULL;

if (!pTemp)

pTemp = pTempCurrNode = pCurrMinExp;

else

{

pTempCurrNode->next = pCurrMinExp;

pTempCurrNode = pTempCurrNode->next;

}

}

*(PolyBuff iCounter) = pTemp;

}

}

void MergePolynCoeff(PolyPointer PolyBuff, int iPolyNum)

{

int iCounter;

float MergeCoeffRes = 0;

polynomial TempList, ResList = NULL, pCurrNode, pPreNode,

pNewNode = NULL;

for (iCounter = 0; iCounter fCoeff;

pCurrNode = (*(PolyBuff iCounter))->next;

while (pCurrNode != NULL)

{

while ((pCurrNode != NULL) &&

(pCurrNode->iExpon == pPreNode->iExpon))

{

MergeCoeffRes = pCurrNode->fCoeff;

pPreNode = pCurrNode;

pCurrNode = pCurrNode->next;

}

/* 在ResList中加入新结点 */

if (MergeCoeffRes != 0)

{

MakeNode(&pNewNode, MergeCoeffRes, pPreNode->iExpon);

AppNodeToList(&ResList, pNewNode);

MergeCoeffRes = 0;

}

pPreNode = pCurrNode;

}

DestroyPolyn(TempList);

*(PolyBuff iCounter) = ResList;

ResList = NULL;

}

}

void AddProcess(PolyPointer polyBuff, const int iPolyNum,

PolyPointer pResult, const int iSign)

{

int iCounter;

float fCoeffRes;

polynomial pNewNode, pCurrNode_1, pCurrNode_2,

pDelList = NULL, /* 下次要删除的中间结果链表 */

pResList = NULL; /* 中间结果链表 */

pCurrNode_1 = *(polyBuff);

for (iCounter = 1; iCounter iExpon == pCurrNode_2->iExpon)

{

fCoeffRes = 0;

fCoeffRes = pCurrNode_1->fCoeff

iSign * pCurrNode_2->fCoeff;

if (fCoeffRes != 0)

{

MakeNode(&pNewNode, fCoeffRes,

pCurrNode_1->iExpon);

AppNodeToList(&pResList, pNewNode);

}

pCurrNode_1 = pCurrNode_1->next;

pCurrNode_2 = pCurrNode_2->next;

}

else if (pCurrNode_1->iExpon

iExpon)

{

MakeNode(&pNewNode, pCurrNode_1->fCoeff,

pCurrNode_1->iExpon);

AppNodeToList(&pResList, pNewNode);

pCurrNode_1 = pCurrNode_1->next;

}

else /* 当pCurrNode_1->iExpon > pCurrNode_2->iExpon时候 */

{

MakeNode(&pNewNode, iSign * pCurrNode_2->fCoeff,

pCurrNode_2->iExpon);

AppNodeToList(&pResList, pNewNode);

pCurrNode_2 = pCurrNode_2->next;

}

}

/* 加入余下的多项式 */

while (pCurrNode_1 != NULL)

{

MakeNode(&pNewNode, pCurrNode_1->fCoeff,

pCurrNode_1->iExpon);

AppNodeToList(&pResList, pNewNode);

pCurrNode_1 = pCurrNode_1->next;

}

while (pCurrNode_2 != NULL)

{

MakeNode(&pNewNode, iSign * pCurrNode_2->fCoeff,

pCurrNode_2->iExpon);

AppNodeToList(&pResList, pNewNode);

pCurrNode_2 = pCurrNode_2->next;

}

if (pDelList != NULL) DestroyPolyn(pDelList);

pCurrNode_1 = pResList;

pDelList = pResList;

pResList = NULL;

}

*pResult = pCurrNode_1;

}

void SubstractProcess(PolyPointer polyBuff, const int iPolyNum,

PolyPointer pResult)

{

AddProcess(polyBuff, iPolyNum, pResult , NEGATIVE);

}

void MultiplyProcess(PolyPointer polyBuff, const int iPolyNum,

PolyPointer pResult)

{

int iCounter = 1, jCounter = 0, iLength; /* 缓冲区的长度 */

PolyPointer pTemPBuff = NULL; /* 存放中间结果的缓冲区 */

polynomial pCurrNode_1, pCurrNode_2, pNewNode = NULL;

/* 初始化 */

pCurrNode_1 = polyBuff[0];

iLength = PolynLength(polyBuff[0]);

MakePolyBuff(&pTempBuff, iLength);

while (TRUE)

{

while (pCurrNode_1 != NULL)

{

pCurrNode_2 = polyBuff[iCounter];

while (pCurrNode_2 != NULL)

{

MakeNode(&pNewNode,

pCurrNode_1->fCoeff * pCurrNode_2->fCoeff,

pCurrNode_1->iExpon pCurrNode_2->iExpon);

AppNodeToList(&pTempBuff[jCounter], pNewNode);

pCurrNode_2 = pCurrNode_2->next;

}

jCounter ;

pCurrNode_1 = pCurrNode_1->next;

}

/* 回收旧的中间结果 */

if (pResult != NULL) DestroyPolyn(*pResult);

/* 获得新的中间结果 */

AddProcess(pTempBuff, iLength, pResult , POSITIVE);

DestroyBuff(pTempBuff, iLength); /* 回收存中间结果的缓冲区 */

jCounter = 0;

if ( iCounter >= iPolyNum)

break;

else

{

iLength = PolynLength(*pResult);

MakePolyBuff(&pTempBuff, iLength);

pCurrNode_1 = *pResult;

}

}

}

void PrintPolyn(const polynomial polyList)

{

polynomial pCurrNode = polyList;

printf("多项式的长度为: %d

", PolynLength(polyList));

while (pCurrNode != NULL)

{

printf("%。

2fX^%d", pCurrNode->fCoeff, pCurrNode->iExpon);

if (pCurrNode->next != NULL)

if (pCurrNode->next->fCoeff > 0 )

printf(" ");

pCurrNode = pCurrNode->next;

}

printf("

");

}

int PolynLength(const polynomial polyList)

{

int iLength = 0;

polynomial pCurrNode = polyList;

while (pCurrNode != NULL)

{

pCurrNode = pCurrNode->next;

iLength ;

}

return iLength;

}

void DestroyBuff(PolyPointer polyBuff, const int iPolyNum)

{

int iCounter;

for (iCounter = 0; iCounter next;

free(pCurrNode);

}

}

status ProcStrError(const char str[])

{

const char *cpCurr = str;

if (!strlen(str))

{

printf("你没有输入数据!

");

return FALSE;

}

while (*cpCurr != ' ')

{

if (!(*cpCurr == ' ' || *cpCurr == ',' || *cpCurr == ';'

|| *cpCurr == '-')

&& ('0' > *cpCurr || *cpCurr > '9')

|| (*(cpCurr 1) == ' ' && *cpCurr != ';'))

{

printf("输入数据出错,请注意正确的输入方式!

");

return FALSE;

}

cpCurr ;

}

return TRUE;

}。

全部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值