1. 程式人生 > >一元多項式相加的演算法和C++實現

一元多項式相加的演算法和C++實現

利用順序表的鏈式儲存實現一元多項式的加法

一、資料結構

<span style="font-size:18px;">struct PolyNode
{
	float coef;  //多項式的係數
	int expn;    //多項式的指數
	PolyNode *next;   //指向下一個結點的指標
};</span>
<span style="font-size:18px;">void InitList(PolyNode *&L)     //初始化多項式單鏈表</span>
<span style="font-size:18px;">void InsertNode(PolyNode *&L, float c, int e, int i)  //在多項式連結串列的第i個位置插入結點</span>
<span style="font-size:18px;">void print(PolyNode *L)   //列印多項式</span>
<span style="font-size:18px;">void SortList(PolyNode *&L)     //按指數非遞減給多項式排序</span>
<span style="font-size:18px;">void CreateList(PolyNode *&L, float C[], int E[], int n)    //建立多項式單鏈表</span>
<span style="font-size:18px;">PolyNode *AddPoly(PolyNode *L1, PolyNode *L2)       //一元多項式相加</span>


二、核心演算法描述

1.建立一個空的連結串列,用作儲存兩個多項和的連結串列

2.呼叫SortList函式,給兩個多項式按指數非遞減的順序給多項式排序

3.比較兩個多項式連結串列的第一項的指數,如果連結串列a>b,則將較小指數的b的係數和指數複製到新建空結點s,再講s連結到連結串列c的末尾;否則,換成a。如果a=b,則又分為兩種情況:如果a的結點和b的結點的係數之和不為0,就將a和b的係數之和複製給s,將a或b任意一個的指數複製給s,再將s連結到c的末尾;如果為0,就跳過a和b的這兩個結點,繼續後面的比較。重複上述過程,知道任意一個連結串列為空為止。

4.如果a為空,就將b的後面部分複製給s,然後依次連結到c的末尾;如果b為空,就將a的後面部分複製給s,然後依次連結到c的末尾。

三、完整程式程式碼

#include "stdafx.h"

#include <iostream>
using namespace std;

/*實現一元多項式的加法*/

struct PolyNode
{
	float coef;  //多項式的係數
	int expn;    //多項式的指數
	PolyNode *next;   //指向下一個結點的指標
};

void InitList(PolyNode *&L)     //初始化多項式單鏈表
{
	L = new PolyNode;       //生成一個頭結點
	L->next = NULL;
}

void InsertNode(PolyNode *&L, float c, int e, int i)  //在多項式連結串列的第i個位置插入結點
{
	PolyNode *p, *q;
	q = new PolyNode;
	q->coef = c;
	q->expn = e;
	q->next = NULL;
	p = L;
	int j = 1;
	while (j < i)     //找到第i-1個結點,在它的後面插入結點
	{
		p = p->next;
		++j;
	}
	q->next = p->next;
	p->next = q;
}

void print(PolyNode *L)   //列印多項式
{
	PolyNode *p;
	p = L->next;
	while (p != NULL)
	{
		cout << "(" << p->coef <<","<<p->expn<< ") ";
		p = p->next;
	}
	cout << endl;
}

void SortList(PolyNode *&L)     //按指數非遞減給多項式排序
{ 
	PolyNode *p, *q, *pre;
	p = L->next;
	L->next = NULL;
	while (p != NULL)
	{
		if (L->next == NULL)       //處理第一個結點
		{
			L->next = p;
			p = p->next;
			L->next->next = NULL;
		}
		else         //處理剩餘其他結點
		{
			pre = L;
			q = pre->next;
			while (q && q->expn < p->expn)
			{
				pre = q;
				q = q->next;
			}
			q = p->next;
			p->next = pre->next;
			pre->next = p;
			p = q;
		}
	}
}

void CreateList(PolyNode *&L, float C[], int E[], int n)    //建立多項式單鏈表
{
	int i;
	InitList(L);
	for (i = 0; i < n; i++)
	{
		InsertNode(L, C[i], E[i], i+1);
	}
}

PolyNode *AddPoly(PolyNode *L1, PolyNode *L2)       //一元多項式相加
{
	PolyNode *pa, *pb, *s, *pc,*p; 
	PolyNode *tc;    //建立尾節點
	pc = new PolyNode;
	pc->next = NULL;    /*pc為新建單鏈表的頭結點*/
	tc = pc;   /*tc始終指向新建單鏈表的最後結點*/
	pa = L1->next;
	pb = L2->next;   //獲得多項式單鏈表的第一個結點
	while (pa!=NULL && pb!=NULL)    //pa,pb都不為空,就進行比較,否則,跳出while
	{
		if (pa->expn < pb->expn)         //將*pa結點複製到*s並鏈到pc尾
		{
			s = new PolyNode;
			s->coef = pa->coef;
			s->expn = pa->expn;
			s->next = NULL;
			tc->next = s;
			tc = s;
			pa = pa->next;
		}
		else if (pa->expn > pb->expn)      //將*pb結點複製到*s並鏈到pc尾
		{
			s = new PolyNode;
			s->coef = pb->coef;
			s->expn = pb->expn;
			s->next = NULL;
			tc->next = s;
			tc = s;
			pb = pb->next;
		}
		else         //pa->expn=pa->expn時的情況
		{
			if (pa->coef+pb->coef!=0)     //如果相加係數之和不為0,則將新結點插在tc後面
			{
				s= new PolyNode;
				s->coef = pa->coef + pb->coef;
				s->expn = pa->expn;
				s->next = NULL;
				tc->next = s; 
				tc = s;
			}
			pa = pa->next;   //跳過當前的結點,繼續後面的結點的比較
			pb = pb->next;
		}
	}
	//將尚未掃描完的餘下結點複製並連結到pc單鏈表之後
	if (pa != NULL)        //pb為空   
		p = pa;
	else                  //pa為空
		p = pb;
	while (p != NULL)   
	{
		s = new PolyNode;
		s->coef = p->coef;
		s->expn = p->expn;
		s->next = NULL;
		tc->next = s;
		tc = s;
		p = p->next;
	}
	return pc;
}

int main()
{
	PolyNode *La, *Lb, *Lc;
	float C1[] = { 3, 7, 9, 5 }, C2[] = { 8, 22, -9 };
	int E1[] = { 1, 0, 8, 17 }, E2[] = { 1, 7, 8 };
	InitList(La);
	InitList(Lb);
	InitList(Lc);
	CreateList(La, C1, E1, 4);
	CreateList(Lb, C2, E2, 3);
	cout << "原多項式為:" << endl;
	print(La);
	print(Lb);
	SortList(La);
	SortList(Lb);
	cout << "按指數非遞減排序後的多項式:" << endl;
	print(La);
	print(Lb);
	cout << "多項式相加的結果為:" << endl;
	Lc = AddPoly(La,Lb);
	print(Lc);
	return 0;
}

四、實驗截圖


五、總結

暑假比較閒,所以自己就想這把大二學的資料結構的一些演算法全部實現一遍,分享到網上,供大家交流學習。經過差不多半天的時間吧,自己先是好好研究了單鏈表的各種操作特性,然後分析了怎樣用單鏈表儲存多項式,怎樣實現多項式的加法的各種細節,先在草稿紙上寫了大概的虛擬碼,然後再敲程式碼實現,邊敲程式碼,邊思考每行每部分的功能聯絡,這樣既能節約時間,也能儘量減少過程的程式碼產生。總之,這半天的時間沒白費,自己收穫很多,只有親自動手實踐,才能真正懂得一個知識點的內涵。所以,我也希望看到這篇文章的同學們也多多動手,親自去實現自己的演算法,這樣自己才會慢慢收穫一些東西,慢慢成長。