本站动态:
C实现的一元多项式运算[2]--链表运算
作者:shosh 日期:2008-09-28
上一次《C实现的一元多项式运算》完成了一元多项式的基本操作,接上一次的工作,本次完成了乘法的运算和将多项式运算的过程输出到HTML文件的功能。另外定义了PRINTF_ARGL和FPRINTF_ARGL宏,用来同时向屏幕和文件输出。
因为多项式的表示是通过单向链表来完成的,多项式的运算也是通过链表的操作来完成的(结点动态申请),所以内存的分配和释放尤为重要。为检测分配和释放状况,代码统一使用宏Create_ENTITY和FREEIF来分配和释放,在宏中输出分配释放情况。
DEBUG_MEMORY宏值如果定义为0,则关闭输出链表结点输出的情况,定义为非0值(如1)则输出当前是在分配结点还是在释放结点,并输出分配或释放结点后剩余的结点数。所以当程序运行结束后,结点数为0则表示为链表分配的内存已经全部释放。
代码中的函数基础的放在前面,提供后面的函数使用,而没用使用函数原型声明,这样可以少贴几行到网页(实际编程时最好不要如此,以来很难控制函数的调用关系,二来如果将函数申明放在一起,用户可以很容易看到该源文件提供哪些函数,主要完成什么功能等)。
main函数被用来创建log文件,用户请在UserMain函数中编写代码。
头文件和源文件本应分开,为方便贴出,暂将其放在一块。
还少一个将字符串如“5y^3 + 3y^2 - 4y -1”parse成一个链表的函数,以后补上。等该功能完成后,可再增加命令行功能,如:“polynomial 5y^3+3y^2-4y-1 * 3y^4-4y-2”。
下载:
源文件
生成的log文件
生成的HTML文件(运算过程)
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- //You can set DEBUG_MEMORY to either 0 if do not wanna test whether there is
- //momery leak or 1(just other than 0) to check.
- #define DEBUG_MEMORY 1
- #define WRITE_SCREEN_TO_FILE 1
- //Write strings(written by PRINTF_ARGL) to the file besides the screen.
- //this is only used when WRITE_SCREEN_TO_FILE != 0
- #define SCREEN_LOG_FILE "D:\\PolyLog.txt"
- #if defined NULL
- #undef NULL
- #endif
- #define NULL 0
- #define CHECK_NONNULL_POINT(p) assert(NULL != p)
- #define CHECK_SAME_VALUE(a,b) assert((a) == (b))
- #define _ARGL(r) r##,
- #define _ARGLEND(r) r
- //when use PRINTF_ARGL() or FPRINTF_ARGL(), please do not forget to add {}
- //even if there is only one statement in it, especially when it is after "if".
- #if WRITE_SCREEN_TO_FILE
- FILE* gpLogFile = NULL;
- #define PRINTF_ARGL(s) printf(s); \
- if (NULL != gpLogFile) \
- fprintf(gpLogFile, s)
- #define FPRINTF_ARGL(fp, s) printf(s); \
- if (NULL != gpLogFile) \
- fprintf(gpLogFile, s); \
- fprintf(fp, s)
- #else
- #define PRINTF_ARGL(s) printf(s)
- #define FPRINTF_ARGL(fp, s) printf(s); \
- fprintf(fp, s)
- #endif
- //We can only create one Create_ENTITY in one area,
- //declaration of variables must be ahead of it.
- #if DEBUG_MEMORY
- int gMemNodeNum = 0;
- #define Create_ENTITY(type, name) \
- type* name = (type*) malloc(sizeof(type)); \
- assert(NULL != name); \
- gMemNodeNum++; \
- /* PRINTF("\n[Create_ENTITY: %d, 0x%p] ", ++gMemNodeNum, name)*/ \
- PRINTF_ARGL(_ARGL("\n[Create_ENTITY: %d, 0x%p] ") \
- _ARGL(gMemNodeNum)_ARGLEND(name))
- #define FREEIF(p) \
- if (NULL != p) \
- { \
- gMemNodeNum--; \
- /* PRINTF("\n[FREE: %d, 0x%p] ", --gMemNodeNum, p); */ \
- PRINTF_ARGL(_ARGL("\n[FREE: %d, 0x%p] ") \
- _ARGL(gMemNodeNum)_ARGLEND(p)); \
- free(p); \
- } \
- p = NULL
- #else
- #define Create_ENTITY(type, name) \
- type* name = (type*) malloc(sizeof(type)); \
- assert(NULL != name)
- #define FREEIF(p) \
- if (NULL != p) \
- { \
- free(p); \
- } \
- p = NULL
- #endif
- typedef unsigned int uint;
- typedef char BOOL;
- #define FALSE 0
- #define TRUE 1
- typedef int QType; //use int to simplize
- typedef int IType;
- //多项式中的项
- typedef struct _ItemNode ItemNode;
- struct _ItemNode
- {
- ItemNode* pNext; //指向下一项
- QType quotiety; //系数
- IType index; //指数
- };
- typedef struct _Polynomial
- {
- ItemNode* pHeader; //多项式中的第一项
- ItemNode* pLast; //多项式中的最后一项
- char pronumeral; //未知数名,如x,y,z
- uint ItemNum; //项数
- } Polynomial;
- //Create one empty polymonial
- Polynomial* CreateEmptyPolynomial(char name)
- {
- Create_ENTITY(Polynomial, pPoly);
- pPoly->pHeader = pPoly->pLast = NULL;
- pPoly->pronumeral = name;
- pPoly->ItemNum = 0;
- return pPoly;
- }
- //Create one polynomial with one item
- Polynomial* CreatePolynomial(char name, ItemNode* head)
- {
- Polynomial* pPoly = CreateEmptyPolynomial(name);
- pPoly->pHeader = pPoly->pLast = head;
- pPoly->ItemNum = 1;
- return pPoly;
- }
- //Create one Item Node
- ItemNode* CreateItemNode(QType quotiety, IType index)//系数,指数
- {
- Create_ENTITY(ItemNode, pItem);
- pItem->quotiety = quotiety;
- pItem->index = index;
- pItem->pNext = NULL;
- return pItem;
- }
- //Duplicate an ItemNode
- ItemNode* DuplicateItemNode(ItemNode* pItem)
- {
- Create_ENTITY(ItemNode, pNewItem);
- pNewItem->index = pItem->index;
- pNewItem->quotiety = pItem->quotiety;
- pNewItem->pNext = pItem->pNext;
- return pNewItem;
- }
- void FreeItemNode(ItemNode* pItem)
- {
- FREEIF(pItem);
- }
- void FreePolynomial(Polynomial* pPoly)
- {
- ItemNode *temNode;
- CHECK_NONNULL_POINT(pPoly);
- temNode = pPoly->pHeader;
- while (NULL != temNode)
- {
- //we cannot simply use temNode = temNode->pNext after call FreeItemNode
- //because the struct has been freed and we would not get proper value
- //of temNode->pNext, although temNode isn't NULL
- pPoly->pHeader = temNode->pNext;
- FreeItemNode(temNode);
- temNode = pPoly->pHeader;
- }
- FREEIF(pPoly);
- }
- //Add one Item to polynomial,and return the ItemNode Num.
- int AddItemToPolynomial(Polynomial* pPoly, ItemNode* pItem)
- {
- CHECK_NONNULL_POINT(pPoly);
- CHECK_NONNULL_POINT(pItem);
- if (NULL != pPoly->pLast) //this means pPoly->pHeader != NULL
- {
- if (NULL == pPoly->pHeader->pNext) //when there is only one item
- pPoly->pHeader->pNext = pPoly->pLast;
- pPoly->pLast->pNext = pItem;
- }
- else //the first item node
- {
- pPoly->pHeader = pItem;
- }
- pPoly->pLast = pItem;
- pPoly->pLast->pNext = NULL;
- return ++pPoly->ItemNum;
- }
- //add one item to a formatted polynomial, and return the itemnode num.
- //please ensure that pPoly is formatted, namely its index is in Desc order.
- //pItem must be new built(is not a member of another polynomial)
- int AddItemToFormattedPolynomial(Polynomial* pPoly, ItemNode* pItem)
- {
- CHECK_NONNULL_POINT(pPoly);
- CHECK_NONNULL_POINT(pItem);
- if (NULL == pPoly->pHeader)
- {
- pPoly->pHeader = pPoly->pLast = pItem;
- }
- else
- {
- ItemNode* pTemItem = pPoly->pHeader;
- ItemNode* pLastValidItem = pTemItem; //this cannot be NULL
- while (NULL != pTemItem && pTemItem->index > pItem->index)
- {
- pLastValidItem = pTemItem;
- pTemItem = pTemItem->pNext;
- }
- if (NULL == pTemItem) //insert it to the end
- {
- pLastValidItem->pNext = pItem;
- pPoly->pLast = pItem;
- }
- else if (pTemItem->index == pItem->index) //no insert it
- {
- pTemItem->quotiety += pItem->quotiety;
- //remember to free pItem, for we have not added it to the pPoly
- FreeItemNode(pItem);
- }
- else //insert it normally
- {
- pLastValidItem->pNext = pItem;
- pItem->pNext = pTemItem;
- }
- }
- pPoly->pLast->pNext = NULL;
- return ++pPoly->ItemNum;
- }
- //Create a Formatted Polynomial from a non-formatted polynomial by index DESC
- Polynomial* CreateFormattedPolynomial(Polynomial* pPoly)
- {
- Polynomial* pFmtPoly;
- ItemNode* pTemNode;
- CHECK_NONNULL_POINT(pPoly);
- pFmtPoly = CreateEmptyPolynomial(pPoly->pronumeral);
- pTemNode = pPoly->pHeader;
- while (NULL != pTemNode)
- {
- AddItemToFormattedPolynomial(pFmtPoly,
- DuplicateItemNode(pTemNode));
- pTemNode = pTemNode->pNext;
- }
- return pFmtPoly;
- }
- //Create a Formatted Polynomial and delete the old one
- Polynomial* CreateFormattedAndDelOldPolynomial(Polynomial* pPoly)
- {
- Polynomial* pFmtPoly;
- ItemNode* pTemNode;
- ItemNode* pCurNode;
- CHECK_NONNULL_POINT(pPoly);
- pFmtPoly = CreateEmptyPolynomial(pPoly->pronumeral);
- pTemNode = pPoly->pHeader;
- while (NULL != pTemNode)
- {
- //it is the defference between this function and
- //CreateFormattedPolynomial concerning the freedom of pTemNode.
- pCurNode = pTemNode->pNext;
- AddItemToFormattedPolynomial(pFmtPoly, pTemNode);
- pTemNode = pCurNode;
- }
- FREEIF(pPoly);
- return pFmtPoly;
- }
- //Create a new ItemNode with quotiety and index first,
- //and then insert the node to pPoly at the tail(non-formatted).
- int AddItemToPolynomialEx(Polynomial* pPoly, QType quotiety, IType index)
- {
- return AddItemToPolynomial(pPoly, CreateItemNode(quotiety, index));
- }
- /***************************** + - * operations ******************************/
- //pLeftPoly and pRightPoly can be either formatted or non-formatted in these
- //three functions, but the new created polynomial(return value) is formatted.
- //+: pLeftPoly + pRightPoly
- Polynomial* PolynomialAdd(Polynomial* pLeftPoly, Polynomial* pRightPoly)
- {
- Polynomial* pOutPoly;
- CHECK_NONNULL_POINT(pLeftPoly);
- CHECK_NONNULL_POINT(pRightPoly);
- CHECK_SAME_VALUE(pLeftPoly->pronumeral, pRightPoly->pronumeral);
- //pOutPoly = CreateEmptyPolynomial(pLeftPoly->pronumeral);
- //just link two polynomials to simplize the actions.
- pLeftPoly->pLast->pNext = pRightPoly->pHeader;
- //calculating pLeftPoly->ItemNum is not needed,
- //just for further consideration
- pLeftPoly->ItemNum += pRightPoly->ItemNum;
- pOutPoly = CreateFormattedPolynomial(pLeftPoly);
- //set back
- pLeftPoly->ItemNum -= pRightPoly->ItemNum;
- pLeftPoly->pLast->pNext = NULL;
- return pOutPoly;
- }
- //-: pLeftPoly - pRightPoly
- Polynomial* PolynomialSubtract(Polynomial* pLeftPoly, Polynomial* pRightPoly)
- {
- Polynomial* pOutPoly;
- ItemNode* pTemNode;
- ItemNode* pNewNode;
- CHECK_NONNULL_POINT(pLeftPoly);
- CHECK_NONNULL_POINT(pRightPoly);
- CHECK_SAME_VALUE(pLeftPoly->pronumeral, pRightPoly->pronumeral);
- pOutPoly = CreateFormattedPolynomial(pLeftPoly);
- pTemNode = pRightPoly->pHeader;
- while (NULL != pTemNode)
- {
- pNewNode = DuplicateItemNode(pTemNode);
- pNewNode->quotiety = -pNewNode->quotiety;
- AddItemToFormattedPolynomial(pOutPoly, pNewNode);
- pTemNode = pTemNode->pNext;
- }
- return pOutPoly;
- }
- //*: pLeftPoly * pRightPoly
- Polynomial* PolynomialMultiply(Polynomial* pLeftPoly, Polynomial* pRightPoly)
- {
- Polynomial* pOutPoly;
- ItemNode *pCurLeft;
- ItemNode *pCurRight;
- ItemNode *pOutItem;
- CHECK_NONNULL_POINT(pLeftPoly);
- CHECK_NONNULL_POINT(pRightPoly);
- CHECK_SAME_VALUE(pLeftPoly->pronumeral, pRightPoly->pronumeral);
- pCurLeft = pLeftPoly->pHeader;
- pOutPoly = CreateEmptyPolynomial(pLeftPoly->pronumeral);
- while (pCurLeft)
- {
- pCurRight = pRightPoly->pHeader;
- while (pCurRight)
- {
- pOutItem = CreateItemNode(
- pCurLeft->quotiety * pCurRight->quotiety,
- pCurLeft->index + pCurRight->index);
- AddItemToFormattedPolynomial(pOutPoly, pOutItem);
- pCurRight = pCurRight->pNext;
- }
- pCurLeft = pCurLeft->pNext;
- }
- return pOutPoly;
- }
- /********************Write Processes to HTML File in Detail*******************/
- BOOL HTMLItemNode(FILE* pHTMLFile, ItemNode* pItem, char cPronum, BOOL bHead)
- {
- CHECK_NONNULL_POINT(pItem);
- CHECK_NONNULL_POINT(pHTMLFile);
- if (0 == pItem->quotiety)
- return FALSE;
- if (bHead)
- {
- if (1 == pItem->quotiety)
- {
- }
- else if (-1 == pItem->quotiety)
- {
- FPRINTF_ARGL(pHTMLFile, "-");
- }
- else
- {
- FPRINTF_ARGL(pHTMLFile, _ARGL("%d")_ARGLEND(pItem->quotiety));
- }
- }
- else
- {
- if (1 == pItem->quotiety)
- {
- FPRINTF_ARGL(pHTMLFile, " + ");
- }
- else if (-1 == pItem->quotiety)
- {
- FPRINTF_ARGL(pHTMLFile, " - ");
- }
- else
- {
- QType quot = pItem->quotiety;
- char op = '+';
- if (quot < 0)
- {
- quot = - quot;
- op = '-';
- }
- FPRINTF_ARGL(pHTMLFile, _ARGL(" %c %d")_ARGL(op)_ARGLEND(quot));
- }
- }
- if (0 != pItem->index)
- {
- FPRINTF_ARGL(pHTMLFile, _ARGL("%c")_ARGLEND(cPronum));
- if (1 != pItem->index)
- {
- FPRINTF_ARGL(pHTMLFile,
- _ARGL("<sup>%d</sup>")_ARGLEND(pItem->index));
- }
- }
- return TRUE;
- }
- BOOL HTMLPolynomial(FILE* pHTMLFile, Polynomial* pPoly)
- {
- ItemNode* pItem;
- BOOL bEmpty = TRUE;
- CHECK_NONNULL_POINT(pPoly);
- pItem = pPoly->pHeader;
- //print first item node
- while (NULL != pItem)
- {
- if (HTMLItemNode(pHTMLFile, pItem, pPoly->pronumeral, TRUE))
- {
- bEmpty = FALSE;
- pItem = pItem->pNext;
- break;
- }
- pItem = pItem->pNext;
- }
- //print other item node
- while (NULL != pItem)
- {
- HTMLItemNode(pHTMLFile, pItem, pPoly->pronumeral, FALSE);
- pItem = pItem->pNext;
- }
- //pPoly is empty
- if (bEmpty)
- {
- FPRINTF_ARGL(pHTMLFile, "0");
- return FALSE;
- }
- return TRUE;
- }
- Polynomial* HTMLPolynomialAdd(FILE* pHTMLFile,
- Polynomial* pLeftPoly, Polynomial* pRightPoly)
- {
- Polynomial* pTemPoly;
- ItemNode* pTemNode;
- CHECK_NONNULL_POINT(pHTMLFile);
- CHECK_NONNULL_POINT(pLeftPoly);
- CHECK_NONNULL_POINT(pRightPoly);
- CHECK_SAME_VALUE(pLeftPoly->pronumeral, pRightPoly->pronumeral);
- // (a + b) + (c + d)
- FPRINTF_ARGL(pHTMLFile, "\n<hr><b> (");
- HTMLPolynomial(pHTMLFile, pLeftPoly);
- FPRINTF_ARGL(pHTMLFile, ") + (");
- HTMLPolynomial(pHTMLFile, pRightPoly);
- FPRINTF_ARGL(pHTMLFile, ")</b>");
- //=ac + ad + bc +bd(formatted)
- pTemPoly = CreateEmptyPolynomial(pLeftPoly->pronumeral);
- pTemNode = pLeftPoly->pHeader;
- while (NULL != pTemNode)
- {
- AddItemToFormattedPolynomial(pTemPoly, DuplicateItemNode(pTemNode));
- pTemNode = pTemNode->pNext;
- }
- pTemNode = pRightPoly->pHeader;
- while (NULL != pTemNode)
- {
- AddItemToFormattedPolynomial(pTemPoly, DuplicateItemNode(pTemNode));
- pTemNode = pTemNode->pNext;
- }
- FPRINTF_ARGL(pHTMLFile, "<br>\n<b>=</b> ");
- HTMLPolynomial(pHTMLFile, pTemPoly);
- return pTemPoly;
- }
- Polynomial* HTMLPolynomialSubtract(FILE* pHTMLFile,
- Polynomial* pLeftPoly, Polynomial* pRightPoly)
- {
- Polynomial* pTemPoly;
- ItemNode* pTemNode;
- CHECK_NONNULL_POINT(pHTMLFile);
- CHECK_NONNULL_POINT(pLeftPoly);
- CHECK_NONNULL_POINT(pRightPoly);
- CHECK_SAME_VALUE(pLeftPoly->pronumeral, pRightPoly->pronumeral);
- // (a + b) - (c + d)
- FPRINTF_ARGL(pHTMLFile, "\n<hr><b> (");
- HTMLPolynomial(pHTMLFile, pLeftPoly);
- FPRINTF_ARGL(pHTMLFile, ") - (");
- HTMLPolynomial(pHTMLFile, pRightPoly);
- FPRINTF_ARGL(pHTMLFile, ")</b>");
- //=ac + ad - bc - bd
- FPRINTF_ARGL(pHTMLFile, "<br>\n<b>=</b> ");
- pTemPoly = CreateEmptyPolynomial(pLeftPoly->pronumeral);
- pTemNode = pLeftPoly->pHeader;
- while (NULL != pTemNode)
- {
- AddItemToPolynomial(pTemPoly, DuplicateItemNode(pTemNode));
- pTemNode = pTemNode->pNext;
- }
- pTemNode = pRightPoly->pHeader;
- while (NULL != pTemNode)
- {
- ItemNode* pDupItem = DuplicateItemNode(pTemNode);
- pDupItem->quotiety = -pDupItem->quotiety;
- AddItemToPolynomial(pTemPoly, pDupItem);
- pTemNode = pTemNode->pNext;
- }
- HTMLPolynomial(pHTMLFile, pTemPoly);
- //format, pTemPoly(out) != pTemPoly(in)
- pTemPoly = CreateFormattedAndDelOldPolynomial(pTemPoly);
- FPRINTF_ARGL(pHTMLFile, "<br>\n<b>=</b> ");
- HTMLPolynomial(pHTMLFile, pTemPoly);
- return pTemPoly;
- }
- Polynomial* HTMLPolynomialMultiply(FILE* pHTMLFile,
- Polynomial* pLeftPoly, Polynomial* pRightPoly)
- {
- Polynomial* pOutPoly;
- ItemNode *pCurLeft;
- ItemNode *pCurRight;
- ItemNode *pOutItem;
- CHECK_NONNULL_POINT(pHTMLFile);
- CHECK_NONNULL_POINT(pLeftPoly);
- CHECK_NONNULL_POINT(pRightPoly);
- CHECK_SAME_VALUE(pLeftPoly->pronumeral, pRightPoly->pronumeral);
- // (a + b) * (c + d)
- FPRINTF_ARGL(pHTMLFile, "\n<hr><b> (");
- HTMLPolynomial(pHTMLFile, pLeftPoly);
- FPRINTF_ARGL(pHTMLFile, ") * (");
- HTMLPolynomial(pHTMLFile, pRightPoly);
- FPRINTF_ARGL(pHTMLFile, ")</b>");
- //= ac + ad + bc + bd
- pCurLeft = pLeftPoly->pHeader;
- pOutPoly = CreateEmptyPolynomial(pLeftPoly->pronumeral);
- while (pCurLeft)
- {
- pCurRight = pRightPoly->pHeader;
- while (pCurRight)
- {
- pOutItem = CreateItemNode(
- pCurLeft->quotiety * pCurRight->quotiety,
- pCurLeft->index + pCurRight->index);
- AddItemToPolynomial(pOutPoly, pOutItem);
- pCurRight = pCurRight->pNext;
- }
- pCurLeft = pCurLeft->pNext;
- }
- FPRINTF_ARGL(pHTMLFile, "<br>\n<b>=</b> ");
- HTMLPolynomial(pHTMLFile, pOutPoly);
- //format
- pOutPoly = CreateFormattedAndDelOldPolynomial(pOutPoly);
- FPRINTF_ARGL(pHTMLFile, "<br>\n<b>=</b> ");
- HTMLPolynomial(pHTMLFile, pOutPoly);
- return pOutPoly;
- }
- /*****************************************************************************/
- //print pItem, this function should be changed if the type of
- //pronumeral or index changs
- BOOL PrintItemNode(ItemNode* pItem, char cPronum, BOOL bHead)
- {
- CHECK_NONNULL_POINT(pItem);
- if (0 == pItem->quotiety)
- return FALSE;
- if (bHead)
- {
- if (1 == pItem->quotiety)
- {
- }
- else if (-1 == pItem->quotiety)
- {
- PRINTF_ARGL("-");
- }
- else
- {
- PRINTF_ARGL(_ARGL("%d")_ARGLEND(pItem->quotiety));
- }
- }
- else
- {
- if (1 == pItem->quotiety)
- {
- PRINTF_ARGL(" + ");
- }
- else if (-1 == pItem->quotiety)
- {
- PRINTF_ARGL(" - ");
- }
- else
- {
- QType quot = pItem->quotiety;
- char op = '+';
- if (quot < 0)
- {
- quot = - quot;
- op = '-';
- }
- PRINTF_ARGL(_ARGL(" %c %d")_ARGL(op)_ARGLEND(quot));
- }
- }
- if (0 != pItem->index)
- {
- PRINTF_ARGL(_ARGL("%c")_ARGLEND(cPronum));
- if (1 != pItem->index)
- {
- PRINTF_ARGL(_ARGL("^%d")_ARGLEND(pItem->index));
- }
- }
- return TRUE;
- }
- // print the Polynomial
- BOOL PrintPolynomial(Polynomial* pPoly)
- {
- ItemNode* pItem;
- BOOL bEmpty = TRUE;
- CHECK_NONNULL_POINT(pPoly);
- pItem = pPoly->pHeader;
- //print first item node
- while (NULL != pItem)
- {
- if (PrintItemNode(pItem, pPoly->pronumeral, TRUE))
- {
- bEmpty = FALSE;
- pItem = pItem->pNext;
- break;
- }
- pItem = pItem->pNext;
- }
- //print other item node
- while (NULL != pItem)
- {
- PrintItemNode(pItem, pPoly->pronumeral, FALSE);
- pItem = pItem->pNext;
- }
- //pPoly is empty
- if (bEmpty)
- {
- PRINTF_ARGL("Empty Polynomial!!!");
- return FALSE;
- }
- return TRUE;
- }
- //user function to code
- int UserMain(int argc, char *argv[])
- {
- Polynomial* pPoly = CreateEmptyPolynomial('x');
- Polynomial* pPoly1;
- Polynomial* pPoly2;
- FILE* pHTMLFile = fopen("D:\\test.html", "a+");
- CHECK_NONNULL_POINT(pHTMLFile);
- AddItemToPolynomialEx(pPoly, -1, 5);
- AddItemToPolynomialEx(pPoly, -3, 0);
- AddItemToPolynomialEx(pPoly, +5, 2);
- AddItemToPolynomialEx(pPoly, -33, -1);
- AddItemToPolynomialEx(pPoly, -31, 2);
- PRINTF_ARGL("\npPoly: \n");
- PrintPolynomial(pPoly);
- PRINTF_ARGL("\n");
- pPoly1 = CreateFormattedPolynomial(pPoly);
- PRINTF_ARGL("\nFormatted pPoly1: \n");
- PrintPolynomial(pPoly1);
- PRINTF_ARGL("\n");
- AddItemToPolynomialEx(pPoly1, 4, 0);
- AddItemToPolynomialEx(pPoly1, 0, 2);
- AddItemToPolynomialEx(pPoly1, 0, 0);
- AddItemToPolynomialEx(pPoly1, 1, 1);
- PRINTF_ARGL("\nnew pPoly1: \n");
- PrintPolynomial(pPoly1);
- PRINTF_ARGL("\n");
- //+
- pPoly2 = PolynomialAdd(pPoly, pPoly1);
- PRINTF_ARGL("\nAdd pPoly2: \n");
- PrintPolynomial(pPoly2);
- PRINTF_ARGL("\n");
- FreePolynomial(pPoly2);
- //-
- pPoly2 = PolynomialSubtract(pPoly, pPoly1);
- PRINTF_ARGL("\nSub pPoly2: \n");
- PrintPolynomial(pPoly2);
- PRINTF_ARGL("\n");
- FreePolynomial(pPoly2);
- //*
- pPoly2 = PolynomialMultiply(pPoly, pPoly1);
- PRINTF_ARGL("\nMulti pPoly2: \n");
- PrintPolynomial(pPoly2);
- PRINTF_ARGL("\n");
- FreePolynomial(pPoly2);
- //HTML +
- pPoly2 = HTMLPolynomialAdd(pHTMLFile, pPoly, pPoly1);
- FreePolynomial(pPoly2);
- //HTML -
- pPoly2 = HTMLPolynomialSubtract(pHTMLFile, pPoly, pPoly1);
- FreePolynomial(pPoly2);
- //HTML *
- pPoly2 = HTMLPolynomialMultiply(pHTMLFile, pPoly, pPoly1);
- FreePolynomial(pPoly2);
- FreePolynomial(pPoly);
- FreePolynomial(pPoly1);
- return 0;
- }
- int main(int argc, char *argv[])
- {
- int runRslt;
- #if WRITE_SCREEN_TO_FILE
- gpLogFile = fopen(SCREEN_LOG_FILE, "w+");
- #endif
- runRslt = UserMain(argc, argv);
- #if WRITE_SCREEN_TO_FILE
- fclose(gpLogFile);
- #endif
- return runRslt;
- }
文章来自: Shosh原创
Tags: 一元多项式 链表 单向链表 运算
相关日志:
晚上将该代码在Turbo C上测试,除行注释外,发现Turbo C还不支持我这种嵌套的用于实现变参数的宏定义方法,估计是替换的先后顺序问题。
UserMain函数的参数是main函数传递过来的参数,也就是命令行参数,本来是想让用户输入参数,然后自动对输入的两个多项式进行运算并输出的。因为目前还没有实现,所以会有说参数没有使用的警告。
上一篇
下一篇

回复







可使用下面的代码验证:
#include <stdio.h>
#define DBGPRINTF_LEVEL 0
#define DBGPRINTF_EX_FORMAT "%d\t%d\t%s\t\t"
#define PRINTF(x) printf(x), printf(x)
#define DBGPRINTF(x) printf(DBGPRINTF_EX_FORMAT,DBGPRINTF_LEVEL, __LINE__, __FILE__), PRINTF(x)
int main(void)
{
DBGPRINTF(("%d,%s", 3, "shosh:"));
printf("\n");
return 0;
}