1. 程式人生 > >C語言:用連結串列實現一元多項式的加法

C語言:用連結串列實現一元多項式的加法

/*
	一元多多項式的加法
	1.先建立連結串列,儲存多項式
	2.輸出多項式
	3.兩個多項式相加
	4.輸出多項式
*/

# include <stdio.h>
# include <malloc.h>

typedef struct dxs  //多項式節點
{
	float coe;  //係數
	int exp;   //指數
	struct dxs * pNext;  //指標域

}DXS, * PDXS;

PDXS creat_dxs();   //建立多項式
void traverse(PDXS pHead);   //遍歷多項式連結串列
PDXS add(PDXS Da, PDXS Db);  //多項式求和

int main(void)
{
	//用連結串列結構,建立兩個多項式
	PDXS Da = creat_dxs();
    traverse(Da);

	PDXS Db = creat_dxs();
    traverse(Db);

	//求兩個多項式的加法
	PDXS Dj = add(Da, Db);
	traverse(Dj);

	return 0;
}

PDXS creat_dxs()
{
	PDXS pHead = (PDXS)malloc(sizeof(DXS)); //建立頭結點
	pHead->pNext = NULL;  //尾指標

	PDXS pTail = pHead;
	PDXS pNew = NULL;

	int len;
	float c;
	int e;
	int i;

	printf("輸入多項式的項數:len = ");
	scanf("%d", &len);

	for(i = 0; i < len; i++)
	{
		printf("分別輸入第%d項的係數c、指數e:", i+1);
		scanf("%f%d", &c, &e);
		
		pNew = (PDXS)malloc(sizeof(DXS));

		//多項式項,係數、指數
		pNew->coe = c;
		pNew->exp = e;
		pNew->pNext = NULL;

		pTail->pNext = pNew;
		pTail = pNew;
	}

	return pHead;
}

//遍歷連結串列
void traverse(PDXS pHead)
{
	PDXS p = pHead->pNext;  //首節點

	while(p != NULL)
	{
		printf("(%.2f %d), ", p->coe, p->exp);
		p = p->pNext;
	}
	printf("\n");
}


//多項式相加
PDXS add(PDXS Da, PDXS Db)
{
	PDXS Dj = (PDXS)malloc(sizeof(DXS));  //和的頭結點
	Dj->pNext = NULL;
	PDXS pTail = Dj;  //和的尾節點

	PDXS Dah = Da->pNext;  //指向多項式的首節點
	PDXS Dbh = Db->pNext;

	//迴圈遍歷多項式A,B
	while(Dah && Dbh)
	{
		//比較當前兩節點的指數
		//當前 A項節點指數 < B項節點指數
		if(Dah->exp < Dbh->exp)
		{
			pTail->pNext = Dah;  //將此A項加入和連結串列中
			pTail = Dah;

			Dah = Dah->pNext;  //A多項式向後遍歷
		}

		//當前 A項節點指數 < B項節點指數
		else if(Dah->exp > Dbh->exp)
		{
			pTail->pNext = Dbh;  //將此B項加入和連結串列中
			pTail = Dbh;

			Dbh = Dbh->pNext;  // //B多項式向後遍歷
		}

		//如果兩節點的指數相等
		else
		{
			//當前指數的係數和不為0
			//A項中儲存係數和,把此A項加入和連結串列中
			if(0 != (Dah->coe + Dbh->coe))
			{
				Dah->coe = Dah->coe + Dbh->coe;
				pTail->pNext = Dah;
				pTail = Dah;		
			}
		
			//A,B都向後遍歷
			Dah = Dah->pNext;
			Dbh = Dbh->pNext;			
		}
	}

	//插入剩餘段
	if(Dah != NULL)
	{
		pTail->pNext = Dah;
	}
	if(Dbh != NULL)
	{
		pTail->pNext = Dbh;
	}

	return Dj;
}