// PolyList.cpp : Defines the entry point for the console application.
//
#include "stdio.h"
struct Item
{
Item(int num,int power)
{
this->num=num;
this->power=power;
pNext=NULL;
}
Item(Item* pItem)
{
this->num=pItem->num;
this->power=pItem->power;
pNext=NULL;
}
int num;
int power;
Item* pNext;
};
void printAllItems(Item* pItems)
{
while(pItems!=NULL)
{
printf("(%d,%d),",pItems->num,pItems->power);
pItems=pItems->pNext;
}
printf("\n");
}
Item* MultItems(Item* pA,Item* pB);
Item* AddItems(Item* pA,Item* pB)
{
Item* pC=NULL;
if(pA->power<pB->power)
{
pC=pA;
pA=pA->pNext;
}
else if(pA->power==pB->power)
{
pC=pA;
pC->num+=pB->num;
pA=pA->pNext;
pB=pB->pNext;
}
else if(pA->power>pB->power)
{
pC=pB;
pB=pB->pNext;
}
Item* pC0=pC;//to return;
while(pA!=NULL && pB!=NULL)
{
if(pA->power<pB->power)
{
pC->pNext=pA;
pA=pA->pNext;
}
else if(pA->power==pB->power)
{
pC->pNext=pA;
pA->num+=pB->num;
pA=pA->pNext;
pB=pB->pNext;
}
else if(pA->power>pB->power)
{
pC->pNext=pB;
pB=pB->pNext;
}
pC=pC->pNext;
}//while(pA && pB)
if(pA)
{
pC->pNext=pA;
}
else
{
pC->pNext=pB;
}//if(pA)
return pC0;
}
Item* RemoveItem(Item* pPrevItem)
{
Item* pToRemove=pPrevItem->pNext;
pPrevItem->pNext=pToRemove->pNext;
return pToRemove;
}
Item* RemoveZeroItems(Item* pItem)
{
Item* pItem0=NULL;//to return;
while(pItem->num==0 && pItem)
{
pItem=pItem->pNext;
}// while(pItem->num==0 && pItem)
if(pItem)
{
pItem0=pItem;
}
else
{
return NULL;
}//if(pItem)
while(pItem->pNext)
{
if(pItem->pNext->num==0)
RemoveItem(pItem);
else
pItem=pItem->pNext;
}//while(pItem->pNext)
return pItem0;
}
int main(int argc, char* argv[])
{
Item LA0(7,0),LA1(3,1),LA8(9,8),LA17(5,17);
Item *pA=&LA0;
LA0.pNext=&LA1;LA1.pNext=&LA8;LA8.pNext=&LA17;
printAllItems(pA);
Item LB1(8,1),LB7(22,7),LB8(-9,8);
Item *pB=&LB1;
LB1.pNext=&LB7;LB7.pNext=&LB8;
printAllItems(pB);
/*
printf("AddItems(pA,pB)===============\n");
printAllItems(pA);
printAllItems(pB);
Item* pAdd=AddItems(pA,pB);
printAllItems(pAdd);
printf("pAddRemoveZero==================\n");
Item* pAddRemoveZero=RemoveZeroItems(pAdd);
printAllItems(pAddRemoveZero);
*/
printf("MultItems(pA,pB)===============\n");
printAllItems(pA);
printAllItems(pB);
Item* pMult=MultItems(pA,pB);
printAllItems(pMult);
printf("pMultRemoveZero==================\n");
Item* pMultRemoveZero=RemoveZeroItems(pMult);
printAllItems(pMultRemoveZero);
printf("Hello World!\n");
return 0;
}
Item* InsertOneItem(Item* pPrev,Item* pOne)
{
pOne->pNext=pPrev->pNext;
pPrev->pNext=pOne;
return pOne;
}
Item* CopyItems(Item* pSrc)
{//有待完善内存处理的问题(要是用Java、C#就不用操心了)
Item* pNewItems=new Item(pSrc);
Item* pResult=pNewItems;
pSrc=pSrc->pNext;
while(pSrc)
{
pNewItems=InsertOneItem(pNewItems,new Item(pSrc));
pSrc=pSrc->pNext;
}
return pResult;
}
Item* MultOneItem(Item* pA,Item* pOne)
{
Item* pResult=NULL;
Item* pAcopy=NULL;
pAcopy=CopyItems(pA);
pResult=pAcopy;//to return
while(pAcopy)
{
pAcopy->num*=pOne->num;
pAcopy->power+=pOne->power;
pAcopy=pAcopy->pNext;
}
return pResult;
}
Item* MultItems(Item* pA,Item* pB)//Item* AddItems(Item* pA,Item* pB)
{
//Item* pResult=NULL;//to return
Item* pA0=pA;
Item* tmpMult=NULL;
Item* Sum=MultOneItem(pA,pB);//to return
//pResult=Sum;
pB=pB->pNext;
while(pB)
{
tmpMult=MultOneItem(pA,pB);
Sum=AddItems(Sum,tmpMult);
pB=pB->pNext;
}
return Sum;
}
/*
(7,0),(3,1),(9,8),(5,17),
(8,1),(22,7),(-9,8),
MultItems(pA,pB)===============
(7,0),(3,1),(9,8),(5,17),
(8,1),(22,7),(-9,8),
(56,1),(24,2),(154,7),(3,8),(45,9),(198,15),(-81,16),(40,18),(110,24),(-45,25),
pMultRemoveZero==================
(56,1),(24,2),(154,7),(3,8),(45,9),(198,15),(-81,16),(40,18),(110,24),(-45,25),
Hello World!
Press any key to continue
*/
链表:多项式相乘
最新推荐文章于 2024-07-13 13:55:40 发布