两个多项式相加单链表实现方式

/*
* exercise3_6.cpp
*
* Created on: 2013-4-22
* Author: abc
*/
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <sys/time.h>
#include <malloc.h>

typedef struct polyNode{
int consTerm;
int power;
struct polyNode *next;
}poly;

poly *pInit(const char *szPoly);
void vStart_Poly();
void vPoly(poly &py, const char *szSingal);
char *sTrim(const char *szOrg, char *szDest);

void PrintList(const poly *p);
void PrintPoly(const poly *p);

poly *pPolyFind(poly *pPoly, const int nPower);
poly *pInsert_Poly(poly *pPoly1, poly *pPoly2);


static int Poly_malloc_num = 0;

//打印链表
void PrintList(const poly *p)
{
if(NULL == p)
return;
int i = 1;
while(1)
{
if(NULL == p->next)
{
printf("No_%04d: consTerm = %d, power = %d.\n",i, p->consTerm, p->power);
break;
}
printf("No_%04d: consTerm = %d, power = %d.\n",i, p->consTerm, p->power);
p = p->next;
i++;
}
printf("\n");
}

//打印多项式
void PrintPoly(const poly *p)
{
if(NULL == p)
return;
int i = 0;
while(1)
{
if(NULL == p->next)
{
printf(" + %d", p->consTerm);
break;
}
if(p->consTerm == 1 && p->power == 1)
printf(" + x");
else if(p->consTerm == 1 && p->power != 1)
if(!i)
printf("x^%d", p->power);
else
printf(" + x^%d", p->power);
else
{
if(!i) //第一项
printf("%dx^%d", p->consTerm, p->power);
else
printf(" + %dx^%d", p->consTerm, p->power);
}

p = p->next;
i++;
}
printf("\n");
return;
}

//将消息入链表
poly *pInit(const char *szPoly)
{
// char *pPoly = (char *)malloc(sizeof(szPoly)+1);
// char *pTmp = pPoly;
char pPoly[1024] = {0};
strcpy(pPoly,szPoly);

poly *head = NULL;
poly *tail = NULL;

//printf("*pPoly = %p.\n", pPoly);

while(1)
{//分解多项式
// printf("pPoly = %s.\n", pPoly);
poly *pMulti = (poly *)malloc(sizeof(polyNode));
Poly_malloc_num++;
char *p = strchr(pPoly, '+');
if(NULL == p)
{
char szSingal[20+1] = {0};
strcpy(szSingal, pPoly);
vPoly(*pMulti, szSingal);
if(NULL == head)
{
head = tail = pMulti;
}
else
{
tail->next = pMulti;
tail = pMulti;
}
break;
}
char szSingal[20+1] = {0};
int n = p - pPoly;
printf("n = %d\n", n);
strncpy(szSingal, pPoly, n );
strcpy(pPoly, (char *)(p + 1));
//pPoly = p + 1;

// printf("szSingal = %s.\n", szSingal);
vPoly(*pMulti, szSingal);

if(NULL == head)
{
head = tail = pMulti;
}
else
{
tail->next = pMulti;
tail = pMulti;
}
}

return head;
}

//去空格
char *sTrim(const char *szOrg, char *szDest)
{
int i = 0;
while(1)
{
if('\0' == *szOrg)
break;
if(*szOrg != ' ')
szDest[i++] = *szOrg;
szOrg++;
}
szDest[i] = '\0

';
return szDest;
}

void vPoly(poly &py, const char *szSingal)
{
char szConsTerm[8+1] = {0};
char szPower[8+1]
= {0};

if(strlen(szSingal) == 0)
return;

//char *szTmp = (char *)malloc(strlen(szSingal) + 1);
char szTmp[20+1] = {0};
//printf("sizeof(szSingal) = %d.\n", strlen(szSingal));

sTrim(szSingal, szTmp);
printf("szTmp = %s.", szTmp);

if(0 == strcmp(szTmp, "x"))
{
py.consTerm = 1;
py.power = 1;
py.next = NULL;
// free(szTmp);
// szTmp = NULL;
// printf("111ConsTerm = %d, Power = %d.\n", py.consTerm, py.power);
return;
}

char *p = strchr(szTmp, 'x');
if(NULL == p)
{
py.consTerm = atoi(szTmp);
py.power = 0;
py.next = NULL;
// free(szTmp);
// szTmp = NULL;
// printf("ConsTerm = %d, Power = %d.\n", py.consTerm, py.power);
return;
}

int n = p - szTmp;
// printf("p - szSingal = %d.\n", n);
if(0 == n)
py.consTerm = 1;
else
{
strncpy(szConsTerm, szTmp, n);
py.consTerm = atoi(szConsTerm);
}

if( (n + 2) > strlen(szTmp) )
py.power = 1;
else
{
strcpy(szPower, (char *)(szTmp + n + 2));
py.power = atoi(szPower);
}
// printf("ConsTerm = %d, Power = %d.\n", py.consTerm, py.power);
py.next = NULL;


// free(szTmp);
// szTmp = NULL;
return;
}

//返回合适位置的前一个元素地址
poly *pPolyFind(poly *pPoly, const int nPower)
{
poly *p = pPoly;
if(NULL == p)
return NULL;
while(1)
{
if(NULL == p->next)//查询不到
break;
if(p->next->power == nPower ) //查询到
break;
else if(nPower > p->next->power )//查询到比power小的次方,返回此位置
break;
p = p->next;
}
return p; //返回合适位置的前一个,方便插入
}

poly *pInsert_Poly(poly *pPoly1, poly *pPoly2)
{
printf("enter into pInsert_Poly\n");
if(NULL == pPoly1 || NULL == pPoly2)
return NULL;

poly *head = NULL;
poly *tail = NULL;

head = tail = pPoly1;
poly *tmpHead = head;

while(1)
{
if(pPoly2 == NULL)
break;
poly *p = pPolyFind(tail, pPoly2->power);//查找次方相同的
if(NULL == p)
{//未查找到
printf("11111111111pPolyFind p is null.\n");
poly *tmp = (poly *)malloc(sizeof(polyNode));
tmp->power = pPoly2->power;
tmp->consTerm = pPoly2->consTerm;
tmp->next = tmpHead;
tmpHead = tmp;
Poly_malloc_num++;
}
else
{
printf("pPolyFind,pPoly2->power=%d, p->next->power=%d, "
"tmpHead->power = %d.\n",
pPoly2->power, p->next->power,
tmpHead->power);

if(pPoly2->power == p->power) //当前位置与pPoly2->power相等
{
p->consTerm = p->consTerm + pPoly2->consTerm;
}
else if(pPoly2->power == p->next->power)//当前位置的下一个与pPoly2->power相等
{
p->next->consTerm = p->next->consTerm + pPoly2->consTerm;
}
else
{//将pPoly2->power插入到p之


poly *tmp = (poly *)malloc(sizeof(polyNode));
Poly_malloc_num++;
tmp->power = pPoly2->power;
tmp->consTerm = pPoly2->consTerm;

tmp->next = p->next;
//p->next = tmp->next;
p->next = tmp;

}

}
pPoly2 = pPoly2->next;
}
printf("exit pInsert_Poly\n");
return head;
}

void vDeletePoly(poly *P)
{
//poly *L = P;
if(NULL == P)
return ;
while(1)
{
if(NULL == P->next)
{
free(P);
P = NULL;
Poly_malloc_num--;
break;
}
poly *L = P;
P = P->next;
L->next = NULL;
free(L);
L = NULL;
Poly_malloc_num--;
}
P = NULL;
}

void vStart_Poly()
{
char *szPoly = "122x^16 + 8x^5 + x^4 + x + 9";
//char *szPoly = "x^5";
char *szPoly2 = "1333x^17 + 3x^15 + x^2 + x + 3";

poly *pPoly = pInit(szPoly);
poly *pPoly2 = pInit(szPoly2);
PrintList(pPoly);
PrintPoly(pPoly);

PrintList(pPoly2);
PrintPoly(pPoly2);

//poly *pPlus;
bool bPlus = (pPoly->power >= pPoly2->power);
if(bPlus)//规避插入单链表头时出错问题
pPoly = pInsert_Poly(pPoly, pPoly2);
else
pPoly2 = pInsert_Poly(pPoly2, pPoly);
printf("szPoly = %s.\n", szPoly);
printf("szPoly2 = %s.\n", szPoly2);
printf("szPoly + szPoly2 = ");
if(bPlus)
PrintPoly(pPoly);
else
PrintPoly(pPoly2);
printf("Poly_malloc_num = %d.\n", Poly_malloc_num);

vDeletePoly(pPoly);
vDeletePoly(pPoly2);

printf("Poly_malloc_num = %d.\n", Poly_malloc_num);


return;
}




相关文档
最新文档