數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-一元多項式計算器_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-一元多項式計算器_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-一元多項式計算器_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-一元多項式計算器_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-一元多項式計算器_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實習(xí)1、一元稀疏多項式計算器一、 需求分析1. 問題描述設(shè)計一個一元稀疏多項式簡單計算器。2. 基本要求 一元稀疏多項式簡單計算器的基本功能是:(1)輸入并建立多項式。(2)輸出多項式,輸出形式為整數(shù)序列:n, c1, e1, c2, e2, ········,cn, en ,其中n是多項式的項數(shù),ci,ei分別是第i項的系數(shù)和指數(shù),序列按指數(shù)降序排列。(3)多項式a和b想加,建立多項式a+b 。(4)多項式a和b想減,建立多項式a-b 。3. 測試數(shù)據(jù) (1) (2x+5x8-3.1x1

2、1)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9+12x-3-x) (3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5) (4) (x+x3)+(-x-x3)=0 (5) (x+x100)+(x100+x200)=(x+2x100+x200) (6) (x+x2+x3)+0=(x+x2+x3) (7) 互換測試數(shù)據(jù)的前后兩個多項式。4. 實現(xiàn)提示 用帶表頭結(jié)點的單鏈表存儲多項式。二、概要設(shè)計為實現(xiàn)上述程序功能,應(yīng)用

3、帶頭結(jié)點的單鏈表存儲多項式。為此需要一個抽象數(shù)據(jù)類型:一元多項式。1.抽象數(shù)據(jù)類型一元多項式定義為:ATD Ploynomial 數(shù)據(jù)對象:D=ai|aiTermset, i=1,2,3···,m,m0 Termset中的每個元素包含一個表示系數(shù)的實數(shù)和表示指數(shù)的整數(shù)數(shù)據(jù)關(guān)系:R1=<ai-1,ai>ai-1,aiD,且ai-1中的指數(shù)<ai中的指數(shù)的值,i=1,2,3···n基本操作:Insert(p,h)初始條件:h已存在。操作結(jié)果:插入p項。CreateLinklist(head, m)操作結(jié)果:建立一個頭指針

4、為head、項數(shù)為m的一元多項式。DestroyLinklist( p)初始條件:一元多項式p已存在。操作結(jié)果:銷毀一元多項式p。PrintLinklist( P)初始條件:一元多項式p已存在。操作結(jié)果:輸出一元多項式p。Compare(a,b) 初始條件:項a,b已存在。操作結(jié)果:比較a,b中x的指數(shù)的大小。 AddLinklist(pa,pb)初始條件:一元多項式pa,pb已存在。操作結(jié)果:完成一元多項式pa,pb的相加運算。SubtractionLinklist(Sa,Sb) 初始條件:一元多項式Sa,Sb已存在。操作結(jié)果:完成一元多項式Sa,Sb的相減運算。 ATD Ploynomia

5、l三、詳細(xì)設(shè)計(源代碼)(使用C語言)#include<stdio.h>#include<malloc.h>#define maxlen 10#define large 999typedef struct Linklistomial float coef; int expn; struct Linklistomial *next;Linklistomial,*Linklist;/結(jié)點類型,指針類型void Insert(Linklist p,Linklist h)/ h已存在插入p項 if(p->coef=0) free(p);/系數(shù)為0的話釋放結(jié)點 else L

6、inklist q1,q2; q1=h; q2=h->next; while(q2&&p->expn<q2->expn) /查找插入位置 q1=q2; q2=q2->next; if(q2&&p->expn=q2->expn) /將指數(shù)相同相合并 q2->coef+=p->coef; free(p); if(!q2->coef) /系數(shù)為0的話釋放結(jié)點 q1->next=q2->next; free(q2); else /指數(shù)為新時將結(jié)點插入 p->next=q2; q1->ne

7、xt=p; Linklist CreateLinklist(Linklist head,int m)/建立一個頭指針為head、項數(shù)為m的一元多項式 int i; Linklist p; p=head=(Linklist)malloc(sizeof(struct Linklistomial); head->next=NULL; for(i=0;i<m;i+) p=(Linklist)malloc(sizeof(struct Linklistomial);/建立新結(jié)點以接收數(shù)據(jù) printf("請輸入第%d項的系數(shù)與指數(shù):",i+1); scanf("%

8、f %d",&p->coef,&p->expn); Insert(p,head); /調(diào)用Insert函數(shù)插入結(jié)點 return head;void DestroyLinklist(Linklist p)/銷毀多項式p Linklist D1,D2; D1=p; while(D1) D2=D1->next; free(D1); D1=D2; void PrintLinklist(Linklist P)/輸出一元多項式p Linklist q=P->next; int flag=1; /項數(shù)計數(shù)器 if(!q) /若多項式為空,輸出0 putch

9、ar('0'); printf("n"); return; while(q) if(q->coef>0&&flag!=1) putchar('+'); /系數(shù)大于0且不是第一項 if(q->coef!=1&&q->coef!=-1) /系數(shù)非1或-1的普通情況 printf("%g",q->coef); if(q->expn=1) putchar('X'); else if(q->expn) printf("X%d"

10、;,q->expn); else if(q->coef=1) if(!q->expn) putchar('1'); else if(q->expn=1) putchar('X'); else printf("X%d",q->expn); if(q->coef=-1) if(!q->expn) printf("-1"); else if(q->expn=1) printf("-X"); else printf("-X%d",q->e

11、xpn); q=q->next; flag+; printf("n");int Compare(Linklist a,Linklist b)/比較a,b中x的指數(shù)的大小 if(a&&b) if(!b|a->expn>b->expn) return 1; else if(!a|a->expn<b->expn) return -1; else return 0; else if(!a&&b)/a多項式已空,但b多項式非空 return -1; else/b多項式已空,但a多項式非空 return 1;Li

12、nklist AddLinklist(Linklist pa,Linklist pb)/求解并建立多項式a+b,返回其頭指針 Linklist qa=pa->next; Linklist qb=pb->next; Linklist headc,hc,qc; hc=(Linklist)malloc(sizeof(struct Linklistomial);/建立頭結(jié)點 hc->next=NULL; headc=hc; while(qa|qb) qc=(Linklist)malloc(sizeof(struct Linklistomial); switch(Compare(qa,

13、qb) case 1: qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; case 0: qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; case -1: qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; if(qc->coef!=0) qc-&g

14、t;next=hc->next; hc->next=qc; hc=qc; else free(qc);/當(dāng)相加系數(shù)為0時,釋放該結(jié)點 return headc;Linklist SubtractionLinklist(Linklist Sa,Linklist Sb)/求解并建立多項式a-b,返回其頭指針 Linklist Cb=Sb->next; while(Cb) Cb->coef=(-1)*Cb->coef; Cb=Cb->next; return AddLinklist(Sa,Sb);int main() int m,n,a=1; char flag;

15、 Linklist pa=0,pb=0,pc; printf(" 歡迎使用一元多項式加法器nn");/輸出菜單 printf(" *n"); printf(" * 一元多項式簡單運算器 *n"); printf(" * *n"); printf(" * A: 輸入多項式a B: 輸入多項式b *n"); printf(" * *n"); printf(" * C: 輸出多項式a D: 輸出多項式b *n"); printf(" * *n"

16、;); printf(" * E: 輸出a+b F: 輸出a-b *n"); printf(" * *n"); printf(" * G: 使用完畢! *n"); printf(" *n"); while(a) printf("n 請選擇操作:"); scanf(" %c",&flag);/空格符號一定要注意 switch(flag) case'A': case'a': printf("下面進(jìn)行多項式a的輸入:n")

17、; printf("請輸入a的項數(shù):"); scanf("%d",&m); pa=CreateLinklist(pa,m);/建立多項式a break; case'B': case'b': printf("下面進(jìn)行多項式b的輸入:n"); printf("請輸入b的項數(shù):"); scanf("%d",&n); pb=CreateLinklist(pb,n);/建立多項式b break; case'C': case'c': printf("n 多項式a="); PrintLinklist(pa); break; case'D': case'd': printf("n 多項式b="); PrintLinklist(pb); break; case'E': case'e': pc=AddLinklist(pa,pb); printf("n a+b="); PrintLinklist(pc); break; case'F': case'f': pc=Subt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論