基於單鏈表實現一元n次多項式的創建、輸出和求和操作

在主函數中調用函數CreatePolyn ()函數創建兩個多項式:

2 + 3X + 5X3 + 2X4

3 + 2X + 4X2

然後調用函數AddPolyn求它們的和,最後打印出求和後的結果。

提示:

/*①多項式數據結構定義*/

typedef  struct pnode{

      float coef;                 //係數

      int expn;                  //指數

} ElemType;

typedef  LinkList  Polynomial;    //一元n次多項式類型定義

 

/*②多項式操作接口定義*/

// 創建一個一元多項式 

Status CreatePolyn(Polynomial &P);

 

// 打印該鏈表的結果 

void PrintPolyn(Polynomial pList);

 

// 比較兩個結點的指數的大小

int cmp(ElemType a, ElemType b);

 

// 把兩個一元多項式相加 

Polynomial AddPolyn(Polynomial pa, Polynomial pb);

 

/*③部分操作的實現函數*/

// 創建一個一元多項式 

Status CreatePolyn(Polynomial &P)

{

InitList_L(P); //初始化鏈表

printf("請輸入多項式項數m:\n");

scanf("%d",&m);

printf("請輸入多項式每項的係數和指數,格式如(3.0, 2):\n");

for(i=1;i<=m;i++)

{

輸入一個結點,將其根據指數從小到大的排列順序插入鏈表

}



#include<stdio.h>
#include<stdlib.h>
#define OK     1
#define ERROR  0
typedef int Status ;
typedef int ElemType ;

typedef  struct pnode
{
      float coef;                 //係數 
      int expn;                  //指數 
	  struct pnode *next;
}pnode,*Polynomial; 

//初始化
Status  InitList_L(Polynomial &P);

// 創建一個一元多項式 
Status CreatePolyn(Polynomial & P);

// 打印該鏈表的結果 
Status PrintPolyn(Polynomial pList);

// 比較兩個結點的指數的大小 
int cmp(ElemType a, ElemType b);

// 把兩個一元多項式相加 
Polynomial AddPolyn(Polynomial pa, Polynomial pb);
//單鏈表的初始化
Status  InitList_L(Polynomial &P)
{
       P=new pnode;
       P->next=NULL;
	   return OK;
}

// 創建一個一元多項式 
Status CreatePolyn(Polynomial &P)
{
	InitList_L(P); //初始化鏈表
	Polynomial q;
	int i,m;
	P=(pnode*)malloc(sizeof(pnode));//生成結點
	P->next=NULL;
	q=P;
	printf("請輸入多項式項數m:\n");
	scanf("%d",&m);
	printf("請輸入多項式每項的係數和指數,格式如(3.0, 2):\n");
	for(i=1;i<=m;i++)
	{ // 依次輸入m個非零項(可按任意順序) 
		q=(pnode*)malloc(sizeof(pnode));
		scanf("%f,%d",&q->coef,&q->expn);
		q->next =P->next ;
		P->next =q;
	}
	return OK;
}//CreatPolyn

// 打印該鏈表的結果 
Status PrintPolyn(Polynomial P)
{
    while(P->next !=NULL)
	{ 
       P=P->next;
       printf("(%5.2f)x^%d+",P->coef,P->expn); 
	}
	printf("0");
	printf("\n");
	return OK;
}

// 比較兩個結點的指數的大小 
int cmp(int a,int b) 
{
	if(a>b) return 1;
	else if(a<b) return -1;
	else return 0;
}

// 把兩個一元多項式相加 
Polynomial AddPolyn(Polynomial pa, Polynomial pb)
{ 
	 Polynomial 	qc;	/* 用來指向新鏈表的尾結點的 */
	 Polynomial 	qa;	/* 指向第一個鏈表的當前結點 */
	 Polynomial 	qb;	/* 指向第二個鏈表的當前結點*/
	 Polynomial 	temp;	/* 刪除結點時做臨時變量用 */
	 ElemType   a,b;             /* 分別存放兩個鏈表當前結點的數據 */
	 float	sum;	               /* 存放兩個鏈表中當前結點的係數和 */

	 qc = pa;
	 qa = pa->next;
	 qb = pb->next;

	while( qa && qb )
	{
		a = qa->expn ; 
		b = qb->expn ;
		switch( cmp(a,b) )
		{
    	case -1:	  /* 第一個鏈表中當前結點的指數值小 */
			qc->next=qa;	/* Link the node to the end of qc */
			qc=qa;			/* move the tail pointer to qa */
			qa=qa->next;	/* move to the next node of qa */
			break;
		case 0:		/* 指數值相等 */
			sum = qa->coef + qb->coef;
			if( sum != 0.0)
			{
				qa->coef=sum;
				qc->next=qa;	  /* Link qa to the result polyn */
				qc=qa;		    /* Let qc still point to the tail */
				qa=qa->next;
			}
			else
			{	/* 釋放qa所指向的結點的空間 */
				temp=qa ; /* qa is to be deleted, let temp point to it */
				qa=qa->next;	/* Let qa point to the next node */
				free(temp);		/* Free the space */
			}
				/* 釋放qb所指向的結點的空間 */
			temp = qb;
			qb = qb->next;		/* let qb point to the next node */
			free(temp);
			break;
		case 1:		/* 第一個鏈表中當前結點的指數值大 */
			qc->next = qb;
			qc = qb;
			qb = qb->next;
			break;
		}	/* End of Switch */
	}	/* End of while(!qa && !qb) */

	qc->next = qa?qa:qb;	/* Link the rest nodes of polynomial 1 or 2 */

	free(pb);    /* Free the head node of the 2nd polynomial  */
	return (pa);
}
void main()
{
	Polynomial Pa,Pb;
	printf("***************一元多項式加法運算*********************\n");
	printf("\n______________第一個多項式______________\n");
	CreatePolyn(Pa);
    printf("第一個多項式爲:");
	PrintPolyn(Pa);
	printf("\n\n______________第一個多項式______________\n");
	CreatePolyn(Pb);
	printf("第二個多項式爲:");
	PrintPolyn(Pb);
    AddPolyn(Pa,Pb);
	printf("\n\n兩個多項式的和爲:");
	PrintPolyn(Pa);
	system("pause");
}


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