logo资料库

用C实现一元多项式运算源程序.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
//输入m项的系数和指数,建立表示一元多项式的有序链表
MakePolyBuff(&PolyBuff, iPolyNum); //分配内存
//输入m项的系数和指数,建立表示一元多项式的有序链表
DestroyPolyn(TempList); //销毁一元多项式
《用 C 语言解决一元多项式运算问题》 第 1 页 共 13 页 附录 1:结构化设计源程序清单 //程序名称:v.cpp //程序功能:应用数据结构,采用 C 语言设计程序,实行一元多项式的加减乘法运算 //程序作者:邓黎 //最后修改日期:2010/3/12 #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); //输入 m 项的系数和指数,建立表示一元多项式的有序链表 status ProcStrError(const char[]); /* 检查输入的数据 */
《用 C 语言解决一元多项式运算问题》 第 2 页 共 13 页 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 < 2); MakePolyBuff(&PolyBuff, iPolyNum); //分配内存 CreatePolyn(PolyBuff, iPolyNum); //建立多项式的有序链表 SortPolyn(PolyBuff, iPolyNum); MergePolynCoeff(PolyBuff, iPolyNum); printf("\n 打印用户输入并整合后的多项式:\n"); for (iCounter = 0; iCounter < iPolyNum; iCounter++) { //依次输入非零项
《用 C 语言解决一元多项式运算问题》 第 3 页 共 13 页 printf("第%d 个项式:\n", iCounter + 1); PrintPolyn(*(PolyBuff + iCounter)); //打印输出该多项式 } AddProcess(PolyBuff, iPolyNum, &PolyAddRes, POSITIVE); printf("\n----------------连加结果-----------------\n"); PrintPolyn(PolyAddRes); //打印输出连加结果 SubstractProcess(PolyBuff, iPolyNum, &PolySubRes); printf("\n----------------连减结果-----------------\n"); PrintPolyn(PolySubRes); //打印输出连减结果 MultiplyProcess(PolyBuff, iPolyNum, &PolyMulRes); printf("\n----------------连乘结果-----------------\n"); PrintPolyn(PolyMulRes); //打印输出连乘结果 printf("\n 运行完毕!\n"); /* 回收资源 */ DestroyBuff(PolyBuff, iPolyNum); //销毁一元多项式 DestroyPolyn(PolyAddRes); //销毁连加结果 DestroyPolyn(PolySubRes); //销毁连减结果 DestroyPolyn(PolyMulRes); //销毁连乘结果 getch(); return 0; } status MakePolyBuff(PolyPointer *polyBuffHead, const int iPolyNum) { int iCounter; //定义多项式个数 *polyBuffHead = (PolyPointer)
《用 C 语言解决一元多项式运算问题》 第 4 页 共 13 页 malloc(sizeof(polynomial) * iPolyNum); //分配内存 if (!(*polyBuffHead)) { //内存溢出 printf("错误,内存溢出!\n"); return FALSE; } for (iCounter = 0; iCounter < iPolyNum; iCounter++) *(*polyBuffHead + iCounter) = NULL; return TRUE; } status CreatePolyn(PolyPointer PolyBuff, int iPolyNum) { //输入 m 项的系数和指数,建立表示一元多项式的有序链表 int iCounter, iExpon; //分别定义多项式个数,及指数 float fCoeff; //系数 char strNum[100], strTemp[64], *cpCurr, *cpCurrNum; polynomial pNewNode = NULL, pInsPos = NULL; //初始化 printf("\n 请输入构造多项式的系数和指数...\n"); printf("输入一个多项式的方式为: 系数, 指数; ... ; 系数, 指数;\n 例如: 3, 4; 5, 6; 7, 8;\n"); for (iCounter = 0; iCounter < iPolyNum; iCounter++) { //依次输入 m 个非零项 printf("\n 请输入第%d 个多项式:\n", iCounter + 1); gets(strNum); if(!ProcStrError(strNum)) return FALSE; //当前链表不存在该指数项 cpCurr = cpCurrNum = strNum; while (*cpCurr != '\0') { if (*cpCurr == ',') { strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum); strTemp[cpCurr - cpCurrNum] = '\0'; fCoeff = (float)atof(strTemp);
《用 C 语言解决一元多项式运算问题》 第 5 页 共 13 页 cpCurrNum = cpCurr + 1; } else if (*cpCurr == ';') { strncpy(strTemp, cpCurrNum, cpCurr - cpCurrNum); strTemp[cpCurr - cpCurrNum] = '\0'; iExpon = atoi(strTemp); MakeNode(&pNewNode, fCoeff, iExpon); AppNodeToList(PolyBuff + iCounter, pNewNode); cpCurrNum = cpCurr + 1; } cpCurr++; } } return TRUE; } status MakeNode(LinkType *pp, const float coeff, const int expon) { //创建结点 if (!(*pp = (LinkType)malloc(sizeof(NodeType) * 1))) { printf("Error, the memory is overflow!\n"); return FALSE; } (*pp)->fCoeff = coeff; (*pp)->iExpon = expon; (*pp)->next = NULL; return TRUE; } void AppNodeToList(polynomial *pHead, polynomial pNewNode) { //多项式加法,利用两个多项式结点构成“和多项式”
《用 C 语言解决一元多项式运算问题》 第 6 页 共 13 页 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 < iPolyNum; iCounter++) { pTemp = NULL; while (*(PolyBuff + iCounter) != NULL) { pPrevNode = pPrevMinExp = pCurrMinExp = *(PolyBuff + iCounter); pCurrNode = (*(PolyBuff + iCounter))->next; while (pCurrNode != NULL) { if (pCurrMinExp->iExpon > pCurrNode->iExpon) { pPrevMinExp = pPrevNode; pCurrMinExp = pCurrNode; } pPrevNode = pCurrNode; pCurrNode = pCurrNode->next; } /* 将系数最小的结点从原链表中取出 */
《用 C 语言解决一元多项式运算问题》 第 7 页 共 13 页 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 < iPolyNum; iCounter++) { pPreNode = TempList= *(PolyBuff + iCounter); MergeCoeffRes = pPreNode->fCoeff; pCurrNode = (*(PolyBuff + iCounter))->next; while (pCurrNode != NULL) { while ((pCurrNode != NULL) && (pCurrNode->iExpon == pPreNode->iExpon)) { MergeCoeffRes += pCurrNode->fCoeff;
《用 C 语言解决一元多项式运算问题》 第 8 页 共 13 页 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 < iPolyNum; iCounter++) {
分享到:
收藏