【c++版數據結構】之用帶頭節點的單鏈表實現一元多項式(C語言版)

所實現的一元多項式的結構如下圖所示:



若只對多項式進行“求值”等不改變多項式係數和指數的運算,採用類似順序表的順序存儲結構即可,否則應採用鏈式存儲結構,本文因爲要進行一元多項式的加法,加法,乘法,故採用的是鏈式存儲結構

注意:本程序輸入表達式時,需要按照(x的次冪)升序輸入

Polynomail.h

#include<stdio.h>
#include<assert.h>
struct Node
{
	int coef; //係數
	int expn; //指數
};
//節點結構
typedef struct PolynNode
{
	Node data;
	struct PolynNode *link;
}PolynNode;

typedef PolynNode* Polynmail;

void InitPolyn (Polynmail &head);
void CreatPolyn(Polynmail &head, int n);
void push_back (Polynmail &head, PolynNode *s);
void ShowPolyn (Polynmail head);

void AddPolyn(Polynmail &head, Polynmail pa, Polynmail pb);
void SubPolyn(Polynmail &head, Polynmail pa, Polynmail pb);
void MulPolyn(Polynmail &head, Polynmail pa, Polynmail pb);

int lenth(Polynmail head);
void destory(Polynmail &head);

Polynomail.cpp

#include"Polynomail.h"

void InitPolyn(Polynmail &head)
{
	PolynNode *s = new PolynNode;
	assert(s != NULL);
	s->data.coef = 0;
	s->data.expn = -1;
	s->link = NULL;
	head = s;
}

void push_back(Polynmail &head, PolynNode *s)
{
	PolynNode *p = head;
	while (p->link != NULL)
	{
		p = p->link;
	}
	p->link = s;
	
}
//創建一元多項式
void CreatPolyn(Polynmail &head, int n)
{
	int c;
	int e;
	for (int i = 0; i < n; ++i)
	{
		printf("請輸入第%d項的係數和指數 >", i + 1);
		scanf_s("%d%d", &c, &e);
		PolynNode *s = new PolynNode;
		s->data.coef = c;
		s->data.expn = e;
		s->link = NULL;
		push_back(head, s);
	}
}
//打印一元多項式
void ShowPolyn(Polynmail head)
{
	PolynNode *s = head->link;
	while (s != NULL)
	{
		if (s->data.expn == 0)//5x^0 ---->5
		{
			printf("%d", s->data.coef);
		}
		else if (s->data.expn == 1)//5x^1---->5x
		{
			printf("%dx", s->data.coef);
		}
		else//正常結果直接打印
		{
			printf("%dx^%d", s->data.coef, s->data.expn);	
		}
		//下一項存在且係數爲正數,需打印正號(負數會自帶符號)
		s = s->link;
		if (s != NULL && s->data.coef > 0)
		{
			printf("+");
		}
		
	}
	printf("\n");
}
//表達式pa + pb的結果保存在head中
void AddPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
	PolynNode *sa = pa->link;
	PolynNode *sb = pb->link;
	PolynNode *s;

	while (sa != NULL && sb != NULL)
	{
		s = new PolynNode;
		s->link = NULL;
		//sa節點的指數 < sb節點的指數 ----------->
		//1:將sa節點中的數據插入到結果中 2:指向下一個pa節點
		if (sa->data.expn < sb->data.expn)
		{
			s->data.coef = sa->data.coef;
			s->data.expn = sa->data.expn;
			sa = sa->link;
		}
		//sa節點的指數 > sb節點的指數 ----------->
		//1:將sb節點中的數據插入到結果中 2:指向下一個pb節點
		else if (sa->data.expn > sb->data.expn)
		{
			s->data.coef = sb->data.coef;
			s->data.expn = sb->data.expn;
			sb = sb->link;
		}
		//sa節點的指數 == sb節點的指數
		//1:將二者係數的和即相同的指數插入到結果中 2:pa、pb都指向下一個節點
		else if (sa->data.expn == sb->data.expn)
		{
			s->data.coef = sb->data.coef + sa->data.coef;
			s->data.expn = sb->data.expn;
			sb = sb->link;
			sa = sa->link;
		}
		//若所加結果的係數爲0,不用插入結果中,反之需要插入到結果中
		if (s->data.coef != 0)
		{
			push_back(head, s);
		}
	}
	//將pa 或者pb當中表達式較長的剩餘節點全部插入到結果中
	if (sa != NULL)
	{
		while (sa != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = sa->data.coef;
			s->data.expn = sa->data.expn;
			push_back(head, s);
			sa = sa->link;
		}
	}
	if (sb != NULL)
	{
		while (sb != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = sb->data.coef;
			s->data.expn = sb->data.expn;
			push_back(head, s);
			sb = sb->link;
		}
	}
}
//表達式pa - pb的結果保存在head中
void SubPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
	PolynNode *sa = pa->link;
	PolynNode *sb = pb->link;
	PolynNode *s;

	while (sa != NULL && sb != NULL)
	{
		s = new PolynNode;
		s->link = NULL;
		//sa - sb sa中存在而sb中不存在的節點,相減後爲正
		if (sa->data.expn < sb->data.expn)
		{
			s->data.coef = sa->data.coef;
			s->data.expn = sa->data.expn;
			sa = sa->link;
		}
		//sa - sb sb中存在而sa中不存在的節點,相減後爲負
		else if (sa->data.expn > sb->data.expn)
		{
			s->data.coef = -(sb->data.coef);
			s->data.expn = sb->data.expn;
			sb = sb->link;
		}
		//sa - sb 兩者都存在的節點,結果 = 二者相減後的結果
		else if (sa->data.expn == sb->data.expn)
		{
			s->data.coef = sb->data.coef - sa->data.coef;
			s->data.expn = sb->data.expn;
			sb = sb->link;
			sa = sa->link;
		}
		if (s->data.coef != 0)
		{
			push_back(head, s);
		}
		
	}
	if (sa != NULL)
	{
		while (sa != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = sa->data.coef;//sa - sb sa中存在而sb中不存在的節點,相減後爲正
			s->data.expn = sa->data.expn;
			push_back(head, s);
			sa = sa->link;
		}
	}
	if (sb != NULL)
	{
		while (sb != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = -(sb->data.coef);//sa - sb sb中存在而sa中不存在的節點,相減後爲負
			s->data.expn = sb->data.expn;
			push_back(head, s);
			sb = sb->link;
		}
	}
}
int lenth(Polynmail head)
{
	int count = 0;
	PolynNode *s = head->link;
	while (s != NULL)
	{
		count++;
		s = s->link;
	}
	return count;
}
//表達式pa * pb的結果保存在head中
void MulPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
	PolynNode *sb = pb->link;
	while (sb != NULL)//sb中的每一個節點和sa中的所有節點相乘
	{
		PolynNode *sa = pa->link;//因爲sb的每個節點都要和sa中的全部節點相乘,所以sb的每個節點
		while (sa != NULL)       //相乘時,sa總要從頭開始
		{
			//創建相乘後的節點
			PolynNode *p = new PolynNode;
			p->data.coef = (sa->data.coef)*(sb->data.coef);//係數相乘
			p->data.expn = (sa->data.expn)+(sb->data.expn);//指數相加
			p->link = NULL;
			//尋找已存在的節點中是否存在與剛創建的節點(指數)相同的節點
			PolynNode *s = head->link;
			while (s != NULL && (s->data.expn) != (p->data.expn))
			{
				s = s->link;
			}
			//不存在指數相同的節點,直接尾插即可
			if (s == NULL)
			{
				push_back(head, p);
			}
			//存在指數相同的節點,修改係數即可
			else
			{
				s->data.coef += p->data.coef;
			}
			//(sb的當前節點)爲乘以sa中的下一個節點做準備
			sa = sa->link;
		}
		//爲sb中的下一個節點乘以sa的全部節點做準備
		sb = sb->link;
	}
}
void destory(Polynmail &head)
{
	PolynNode *s = head->link;
	while (s != NULL)
	{
		head->link = s->link;
		delete s;
		s = head->link;
	}
	delete head;
	head = NULL;
}

main.cpp

#include"Polynomail.h"
#include<cstdlib>
int main()
{
	Polynmail pa;
	Polynmail pb;
	Polynmail pc;

	InitPolyn(pa);
	InitPolyn(pb);
	InitPolyn(pc);
	
	int select = 1;
	int n;
	while (select)
	{
		printf("*****************************************\n");
		printf("* [1]創建多項式pa       [2]創建多項式pb *\n");
		printf("* [3]打印多項式pa       [4]打印多項式pb *\n");
		printf("* [5]AddPolyn           [6]SubPolyn     *\n");
		printf("* [7]MulPolyn           [8]打印多項式pc *\n");
		printf("* [0]退出系統           [0]退出系統     *\n");
		printf("*****************************************\n");

		scanf_s("%d", &select);
		switch (select)
		{
		case 1:
			printf("請輸入多項式的項數:>");
			scanf_s("%d", &n);
			CreatPolyn(pa, n);
			break;
		case 2:
			printf("請輸入多項式的項數:>");
			scanf_s("%d", &n);
			CreatPolyn(pb, n);
			break;
		case 3:
			printf("pa = ");
			ShowPolyn(pa);
			break;
		case 4:
			printf("pb = ");
			ShowPolyn(pb);
			break;
		case 5:
			AddPolyn(pc, pa, pb);
			break;
		case 6:
			SubPolyn(pc, pa, pb);
			break;
		case 7:
			MulPolyn(pc, pa, pb);
			break;
		case 8:
			printf("pc = ");
			ShowPolyn(pc);
			break;
		default:
			break;
		}
	}
	destory(pa);
	destory(pb);
	destory(pc);
	system("pause");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章