1. 程式人生 > >資料結構—— 一元多項式的表示及相加(C語言實現)

資料結構—— 一元多項式的表示及相加(C語言實現)

程式碼比較簡單,沒有完全按照嚴蔚敏版《資料結構(C語言版)》上39頁到43頁上的要求,只是實現了簡單功能,且此程式碼輸入多項式時只能按升冪的順序輸入(因為沒有寫多項式排序的函式) 個人感覺此程式碼短小精悍,且易理解,看懂了的話可以嘗試完全按照書上的要求自己寫程式碼。

直接上程式碼:

#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof(Poly)

typedef struct term{
	float coef;  //係數 
	int expn;	 //指數 
	struct term *next;
}Poly,*Link;

void CreatePolyn(Link *p,int m);
void PrintPolyn(Link p);
int cmp(Link p1, Link p2);
Link AddPolyn(Link pa, Link pb); 

int main()
{
	Link P1,P2;
	int L1,L2;
	printf("請輸入第一個多項式的項數:");
	scanf("%d",&L1);
	CreatePolyn(&P1,L1);
	printf("第一個多項式為:");
	PrintPolyn(P1);
	printf("請輸入第二個多項式的項數:");
	scanf("%d",&L2);
	CreatePolyn(&P2,L2);
	printf("第二個多項式為:");
	PrintPolyn(P2); 
	printf("\n");
	printf("兩個一元多項式相加的結果為:");
	PrintPolyn(AddPolyn(P1, P2));
}

void CreatePolyn(Link *p,int m)//*p是雙重指標,用此意在改變指標 
//建立多項式(帶頭結點),基礎:動態連結串列的建立 
{
	Link r,s;
	int i;
	*p=(Link)malloc(LEN);
	r=*p;
	for(i=0;i<m;i++)
	{
		s=(Link)malloc(LEN);
		printf("輸入係數和指數(以空格隔開):");
		scanf("%f %d", &s->coef, &s->expn);
		r->next=s;
		r=s;
	}
	r->next=NULL; 
}

void PrintPolyn(Link p)
//列印顯示多項式,基礎:遍歷連結串列 
{
	Link s;
	s = p->next;
	while(s)
	{
	        printf("%.2f X^%d", s->coef, s->expn);
            s = s->next;
            if(s!=NULL)  //是正數則用'+'連線兩項,是負數則直接用負數的負號'-'連線兩項 
                if(s->coef>=0) printf("+");
	}
	printf("\n");
}
int cmp(Link a, Link b)
//比較兩項的指數的大小,並返回特定的值。 
{
	if (a->expn<b->expn) return  -1;
	else if(a->expn == b->expn) return  0;
	else return 1;
}
Link AddPolyn(Link pa, Link pb)//pa, pb是兩個指向頭結點的指標
//兩個多項式相加得一個新多項式,並且返回新多項式的頭結點的指標  
{
	Link newp, p, q, s, pc;
	float sum;
	p = pa->next; //p指向pa的第一個元素
	q = pb->next; //q指向pb的第一個元素
	newp=(Link)malloc(LEN); //pc指向新多項式pc的頭結點
	pc = newp;
	while(p&&q){
		switch(cmp(p, q))
		{
			case -1:   //若指數:p<q,則將p所指結點鏈入頭結點為newp的連結串列中,且p向後遍歷 
				s = (Link)malloc(LEN); 
				s->coef = p->coef;
				s->expn = p->expn;
				pc->next = s;
				pc = s;
				p = p->next;
				break;
			case 0://若比較兩項的指數相等,則將兩項係數相加後得到的項放入頭結點為newp的連結串列中 ,且p,q同時向後遍歷 
				sum = p->coef+q->coef; 
				if(sum!=0.0)//若兩項係數相加為0,則不放入頭結點為newp的連結串列中 
				{
					s = (Link)malloc(LEN);
					s->coef = sum;
					s->expn = p->expn;
					pc->next = s;
					pc = s;
				}
				p = p->next;
				q = q->next;
				break;
			case 1:   //若指數:q<p,則將q所指結點鏈入頭結點為newp的連結串列中,且q向後遍歷 
				s = (Link)malloc(LEN);
				s->coef = q->coef;
				s->expn = q->expn;
				pc->next = s;
				pc = s;
				q = q->next;
				break;
		}
	}
	while(p) //若p所在連結串列還有剩餘項,直接將剩餘項依次鏈入頭結點為newp的連結串列中
	{
		s = (Link)malloc(LEN);
		s->coef = p->coef;
		s->expn = p->expn;
		pc->next = s;
		pc = s;
		p = p->next;
	}
	while(q)//若q所在連結串列還有剩餘項,直接將剩餘項依次鏈入頭結點為newp的連結串列中 
	{
		s = (Link)malloc(LEN);
		s->coef = q->coef;
		s->expn = q->expn;
		pc->next = s;
		pc = s;
		q = q->next;
	}
	pc->next = NULL;
	return newp; //返回新多項式的首地址
}

程式碼僅供參考,如若有錯誤,請大家指出改正。