資料結構 一元稀疏多項式 利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和
一、實驗原理
利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和。一元多項式由係數和指數構成。
1、create()儲存係數指數:首先建立一個頭結點headLnode,從headLnode->next開始存入係數和指數,只有係數是0時,才表示這個多項式的結束,否則每次把係數和指數存入結點後,就把指標向後移動一個接著存入,直到輸入的係數是0為止。返回的是一個帶頭結點的連結串列
2、Print()輸出連結串列:只要當前指標指向的結點不是空,就把係數和指數輸出,直到係數為0為止
3、Compare()比較指數大小:根據這個結果確定先插入哪個結點
4、AddLine()連結串列相加:先讓hc=lc=ha,即相當於給hc和lc建立了一個頭結點,然後以後通過比較得到的結點都插入了hc為頭結點的連結串列中。
比較:
(1)ha為空,hb不為空,直接return(hb)
(2)ha和hb都不空,通過比較指數大小,決定插入hc的順序
二、參考程式
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
typedef struct Lnode
{
int coef; //定義係數變數
int exp; //定義指數變數
struct Lnode *next; //定義指標next變數
} Lnode,*LinkList;
/*建立多項式列表*/
LinkList create()
{
int n;
LinkList headLnode;
LinkList head;
LinkList p1,p2; //定義p1,p2指標
n=0;
printf("請輸入多項式(輸入的數必須是整數,指數須從小到大依次輸入,係數為零表示多項式結束)\n");
p1=p2= ( LinkList)malloc(sizeof(Lnode)); /*開闢一個新單元*/
scanf("%d%d",&p1->coef,&p1->exp); /*錄入多項式*/
headLnode=(LinkList)malloc(sizeof(Lnode));
if (p1->coef==0){//開始輸入的就是0,建立空連結串列
head=NULL;
}
else
{
while(p1->coef!=0)
{ n++;
if(n==1){
head=p1;//記錄第一個輸入的是頭結點
}
else{
p2->next=p1;//P1指向下一個結點,並輸入資料
}
p2=p1;
p1=( LinkList)malloc(sizeof(Lnode));
scanf("%d%d",&p1->coef,&p1->exp);
}
p2->next=0;
headLnode->next=head;//把頭結點與第一個結點相連
}
return(headLnode);
}
/* 以下是輸出多項式的函式 */
void print (LinkList p)
{
LinkList p0; //定義p0指標
p0=p->next;
if(p0!=NULL){ //只要不是頭結點就輸出
do
{
printf("%dx的%d次冪",p0->coef,p0->exp);
p0=p0->next;
if(p0!=NULL){
printf("+");
}
}while(p0!=0);
}
else {
printf(" 空多項式!!");
}
printf("\n");
}
/*比較兩個指數的大小的函式*/
int compare(int m,int n)
{
int j;
if (m<n) j=-1;
if (m==n) j=0;
if (m>n) j=1;
return(j);
}
/*兩個非空多項式相加*/
LinkList AddLine(LinkList ha, LinkList hb)
{
LinkList la, lb, lc,hc; //定義三個指標la,lb,lc
int a,b,sum;
lc=hc=ha;
la=ha->next;//從頭結點的下一個元素開始
lb=hb->next;
//如果ha為空,hb不為空,直接返回hb
if ((ha->next==NULL)&&(hb->next!=NULL)){
return(hb);
}
//如果ha,hb都不為空,根據指數大小,移動指標lc,形成新的連結串列hc
while ((la!= NULL)&&(lb!= NULL)) //當兩個多項式都不為空時
{
a=la->exp; //將la的指數賦給a
b=lb->exp; //將lb的指數賦給b
switch( compare(a,b) ) /*比較當前結點指數的大小 */
{
case -1: //a<b,lc指向la
{ lc->next =la;
lc=la;
la=la->next;//la向後移
break;
}
case 0: //a=b
{
sum=la->coef+lb->coef;
if(sum!=0)//不等於0時,把sum值存入la的係數中,
{ /* 將其不為零的係數和儲存 */
la->coef=sum;
lc->next=la;
lc=la;
la=la->next;
//釋放掉lb,利用ha
ha=lb;
lb=lb->next;
free(ha);
}
else //兩係數之和為0
{ /* 分別刪除係數和為零的對應的兩個結點 */
ha=la;
la=la->next;
free(ha);
ha=lb;
lb=lb->next;
free(ha);
} /* 剛開始時特殊處理頭結點 */
break;
}
case 1: //a>b
{ /* 將指數小的項插入到la的前部 */
lc->next=lb;
lc=lb;
lb=lb->next;
break;
}
} /*end swtich*/
} /*end while*/
//當兩個連結串列長度不一致時,會有一個先都插入到lc中
if (lb!= NULL ){
lc->next=lb;
}
else{
lc->next=la;
}
return(hc);
} /*end AddLine */
/*主程式*/
main()
{
LinkList la,lb,lc;
printf("請輸入多項式La: ");
la=create();
printf("請輸入多項式Lb: ");
lb=create();
printf("多項式La:\n");
print(la);
printf("多項式Lb:\n");
print(lb);
printf("多項式La與Lb的和是: \n");
lc=AddLine(la,lb);
print(lc);
}
/*執行結果:請輸入多項式La: 請輸入多項式(輸入的數必須是整數,指數須從小到大依次輸入,係數為零表示多項式結束)
2 1
3 2
4 5
0 9
請輸入多項式Lb: 請輸入多項式(輸入的數必須是整數,指數須從小到大依次輸入,係數為零表示多項式結束)
2 3
4 4
5 6
7 8
0 9
多項式La:
2x的1次冪+3x的2次冪+4x的5次冪
多項式Lb:
2x的3次冪+4x的4次冪+5x的6次冪+7x的8次冪
多項式La與Lb的和是:
2x的1次冪+3x的2次冪+2x的3次冪+4x的4次冪+4x的5次冪+5x的6次冪+7x的8次冪
--------------------------------
Process exited after 24.31 seconds with return value 0
請按任意鍵繼續. . .
*/