《用 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++) {