版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計報告</b></p><p> 一元多項式計算VS迷宮求解</p><p><b> 系 別: </b></p><p><b> 專業(yè)年級:</b></p><p><b> 學生姓名: </b><
2、;/p><p><b> 學 號:</b></p><p><b> 任課老師: </b></p><p> 二 ○ 一 二 年 三 月</p><p><b> 一、題目內(nèi)容描述</b></p><p> ?。ㄒ唬?、實驗二 一元多項式計算*
3、*</p><p> 1、任務:能夠按照指數(shù)降序排列建立并輸出多項式;能夠完成兩個多項式的相加、相減、相乘,并將結果輸出;</p><p> 2、在上交資料中請寫明:存儲結構、多項式相加的基本過程的算法(可以使用程序流程圖)、源程序、測試數(shù)據(jù)和結果、算法的時間復雜度、另外可以提出算法的改進方法;</p><p> ?。ǘ?、實驗四 迷宮求解</p>
4、<p> 1、任務:可以輸入一個任意大小的迷宮數(shù)據(jù),用非遞歸的方法求出一條走出迷宮的路徑,并將路徑輸出;</p><p> 2、要求:在上交資料中請寫明:存儲結構、基本算法(可以使用程序流程圖)、源程序、</p><p> 測試數(shù)據(jù)和結果、算法的時間復雜度、另外可以提出算法的改進方法。</p><p><b> 二、解題分析</
5、b></p><p> ?。ㄒ唬?、一元多項式計算分析:</p><p> 1、一元稀疏多項式簡單計算器的功能是:</p><p> 1.1 輸入并建立多項式;</p><p> 1.2 輸出多項式,輸出形式為整數(shù)序列:n,c1,e1,c2,e2,………cn,en,其中n是多項式的項數(shù),ci和ei分別是第i項的系數(shù)和指數(shù),序列按指數(shù)
6、降序排列; </p><p> 1.3 求多項式a、b的導函數(shù);</p><p> 1.4 計算多項式在x處的值;</p><p> 1.5多項式a和b相加,建立多項式a+b;</p><p> 1.6 多項式a和b相減,建立多項式a-b。</p><p><b> 2、設計思路:</b>
7、;</p><p> 2.1 定義線性表的動態(tài)分配順序存儲結構;</p><p> 2.2 建立多項式存儲結構,定義指針*next</p><p> 2.3利用鏈表實現(xiàn)隊列的構造。每次輸入一項的系數(shù)和指數(shù),可以輸出構造的一元多項式</p><p> 2.4演示程序以用戶和計算機的對話方式執(zhí)行,即在計算機終站上顯示“提示信息”之后,由用
8、戶在鍵盤上輸入演示程序中規(guī)定的運行命令;最后根據(jù)相應的輸入數(shù)據(jù)(濾去輸入中的非法字符)建立的多項式以及多項式相加的運行結果在屏幕上顯示。多項式顯示的格式為:c1x^e1+c2x^e2+…+cnx^en</p><p><b> 3、設計思路分析:</b></p><p> 要解決多項式相加,必須要有多項式,所以必須首先建立兩個多項式,在這里采用鏈表的方式存儲鏈表,
9、所以我將結點結構體定義為:</p><p> 運用尾插法建立兩條單鏈表,以單鏈表polyn p和polyn h分別表示兩個一元多項式a和b,a+b的求和運算等同于單鏈表的插入問題(將單鏈表polyn p中的結點插入到單鏈表polyn h中),因此“和多項式”中的結點無須另生成。</p><p> 為了實現(xiàn)處理,設p、q分別指向單鏈表polya和polyb的當前項,比較p、q結點的指數(shù)項
10、,由此得到下列運算規(guī)則:</p><p> ?、?若p->expn<q->expn,則結點p所指的結點應是“和多項式”中的一項,令指針p后移。</p><p> ?、?若p->expn=q->expn,則將兩個結點中的系數(shù)相加,當和不為0時修改結點p的系數(shù)。</p><p> ?、?若p->expn>q->expn,則
11、結點q所指的結點應是“和多項式”中的一項,將結點q插入在結點p之前,且令指針q在原來的鏈表上后移。</p><p> ?。ǘ?、迷宮求解分析:</p><p> 1、 迷宮形狀由0表示可通過,用1表示是障礙。為方便用0,1輸入。并把迷宮圖形保存在二維數(shù)組grid中。而打印出的圖形中 ‘0’表示能過‘1’表示障礙。</p><p> 2、 對探索過的位置加以標記,
12、輸入起點終點后可由相應函數(shù)來完成搜索。到目的點就可退出該調(diào)用程序。把每步路徑保存到二維數(shù)組中,通過反向進行退步可把完整的路徑保存在相應結構體數(shù)組內(nèi),通過標記的路徑可將串作相應的改變就能輸出的帶路徑的圖。</p><p> 3、根據(jù)二維字符數(shù)組和加標記的位置坐標,輸出迷宮的圖形。</p><p> 4、 該程序在獲取迷宮圖結構后,可對迷宮任意入口到出口的路線進行搜索,主要由廣度優(yōu)先搜索完
13、成該操作。它可以是30以內(nèi)大小的迷宮,有自行提供的迷宮圖,本課程設計是以二維數(shù)組作為迷宮的存儲結構。而廣度優(yōu)先搜索用的隊列一步一步完成的,從而找到的是最短路徑,并能輸出打印。</p><p> 三、所用數(shù)據(jù)結構的描述(用偽代碼)</p><p> ?。ㄒ唬?、一元多項式計算:</p><p> 1、元素類型、結點類型和指針類型:</p><p&
14、gt; typedef struct Polynomial{float coef; //系數(shù)</p><p> int expn; //指數(shù)</p><p> struct Polynomial *next;}*Polyn,Polynomial;</p><p> 2、建立一個頭指針為head、項數(shù)為m的一元多項式, 建立新結點以接收
15、數(shù)據(jù), 調(diào)用Insert函數(shù)插入結點:</p><p> Polyn CreatePolyn(Polyn head,int m){ int i;</p><p> Polyn p;</p><p> p=head=(Polyn)malloc(sizeof(struct Polynomial));</p><p> head
16、->next=NULL;</p><p> for(i=0;i<m;i++){p=(Polyn)malloc(sizeof(struct Polynomial)); </p><p> printf("請輸入第%d項的系數(shù)與指數(shù):",i+1);</p><p> scanf("%f %d",&p-&
17、gt;coef,&p->expn);</p><p> Insert(p,head); }</p><p> return head;}</p><p><b> 3、調(diào)用關系圖:</b></p><p><b> ?。ǘ?、迷宮求解:</b></p><p&
18、gt;<b> 1、各個函數(shù)說明:</b></p><p> int InitStack(Stack *s) //制造空棧</p><p> int StackEmpty(Stack *s) //若s為空返回TURE,否則返回FALSE</p><p> int StackIsFull(Stack *s) //判斷棧是否為滿
19、</p><p> int Push(Stack *s,MazeNode mn) //插入元素e為新的棧頂元素</p><p> int Pop(Stack *s,MazeNode *mn) //若棧不空刪除棧頂元素用e返回OK,否則返回ERROR</p><p> int DestroyStack(Stack *s) //銷毀棧s</p>
20、<p> int MazeInit(MazeType *maze) //初始化迷宮</p><p> int Pass(MazeType *maze,Coordinate pos) //判斷n指定坐標是否可通過</p><p> int MarkerPass(MazeType *maze,Coordinate pos) //標記可通過</p>
21、<p> Coordinate NextCoord(Coordinate pos,int i) //獲取下一位置</p><p> int MarkerNoPass(MazeType *maze,Coordinate pos)//曾走過但不是通路標記并返回OK</p><p> int MazePath(MazeType *maze,Coordinate start,C
22、oordinate end)//從迷宮maze的入口到出口查找路徑</p><p> void PrintMaze(MazeType *maze) //輸出迷宮</p><p> 四、部分算法的描述(用偽代碼)</p><p> (一)、一元多項式計算:</p><p><b> 1、加法:</b></
23、p><p> Polyn AddPolyn(Polyn pa,Polyn pb){ //求解并建立多項式a+b,返回其頭指針</p><p> Polyn qa=pa->next;</p><p> Polyn qb=pb->next;</p><p> Polyn headc,hc,qc;</p><p&
24、gt; hc=(Polyn)malloc(sizeof(struct Polynomial)); //建立頭結點</p><p> hc->next=NULL;</p><p><b> headc=hc;</b></p><p> while(qa||qb){</p><p> qc=(Polyn)ma
25、lloc(sizeof(struct Polynomial));</p><p> switch(compare(qa,qb)){</p><p><b> case 1:{</b></p><p> qc->coef=qa->coef;</p><p> qc->expn=qa->exp
26、n;</p><p> qa=qa->next;</p><p><b> break;}</b></p><p> case 0: { </p><p> qc->coef=qa->coef+qb->coef;</p><p> qc->expn=qa-&
27、gt;expn;</p><p> qa=qa->next;</p><p> qb=qb->next;</p><p><b> break;}</b></p><p><b> case -1:{</b></p><p> qc->coef=q
28、b->coef;</p><p> qc->expn=qb->expn;</p><p> qb=qb->next;</p><p><b> break;} </b></p><p><b> }</b></p><p> if(qc-&g
29、t;coef!=0){</p><p> qc->next=hc->next;</p><p> hc->next=qc;</p><p><b> hc=qc;}</b></p><p> else free(qc); //當相加系數(shù)為0時,釋放該結點</p><p>
30、<b> }</b></p><p> return headc;}</p><p><b> 2、減法:</b></p><p> Polyn SubtractPolyn(Polyn pa,Polyn pb){ //求解并建立多項式a-b,返回其頭指針</p><p> Polyn h=
31、pb;</p><p> Polyn p=pb->next;</p><p><b> Polyn pd;</b></p><p> while(p){ //將pb的系數(shù)取反</p><p> p->coef*=-1;</p><p> p=p->next;}</
32、p><p> pd=AddPolyn(pa,h);</p><p> for(p=h->next;p;p=p->next) //恢復pb的系數(shù)</p><p> p->coef*=-1;</p><p> return pd;}</p><p><b> 3、求解x:</b>
33、;</p><p> float ValuePolyn(Polyn head,int x){ //輸入x值,計算并返回多項式的值</p><p><b> Polyn p;</b></p><p><b> int i,t;</b></p><p> float sum=0;</p&g
34、t;<p> for(p=head->next;p;p=p->next){</p><p><b> t=1;</b></p><p> for(i=p->expn;i!=0;){</p><p> if(i<0){t/=x;i++;}//指數(shù)小于0,進行除法</p><p>
35、; else{t*=x;i--;}//指數(shù)大于0,進行乘法</p><p><b> }</b></p><p> sum+=p->coef*t;}</p><p> return sum;}</p><p><b> 4、求導:</b></p><p>
36、Polyn Derivative(Polyn head){ //求解并建立導函數(shù)多項式,并返回其頭指針</p><p> Polyn q=head->next,p1,p2,hd;</p><p> hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點</p><p> hd->next=NUL
37、L;</p><p><b> while(q){</b></p><p> if(q->expn!=0){//該項不是常數(shù)項時</p><p> p2=(Polyn)malloc(sizeof(struct Polynomial));</p><p> p2->coef=q->coef*q-&
38、gt;expn;</p><p> p2->expn=q->expn-1;</p><p> p2->next=p1->next; //連接結點</p><p> p1->next=p2;</p><p><b> p1=p2;}</b></p><p>
39、q=q->next;}</p><p> return hd;}</p><p><b> 5、乘法:</b></p><p> Polyn MultiplyPolyn(Polyn pa,Polyn pb){ //求解并建立多項式a*b,返回其頭指針</p><p> Polyn hf,pf;</p&
40、gt;<p> Polyn qa=pa->next;</p><p> Polyn qb=pb->next;</p><p> hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點</p><p> hf->next=NULL;</p><p> fo
41、r(;qa;qa=qa->next){</p><p> for(qb=pb->next;qb;qb=qb->next){</p><p> pf=(Polyn)malloc(sizeof(struct Polynomial));</p><p> pf->coef=qa->coef*qb->coef;</p>
42、<p> pf->expn=qa->expn+qb->expn;</p><p> Insert(pf,hf); //調(diào)用Insert函數(shù)以合并指數(shù)相同的項</p><p><b> }</b></p><p><b> }</b></p><p> retu
43、rn hf;}</p><p><b> ?。ǘ?、迷宮求解:</b></p><p><b> 1、初始化:</b></p><p> int MazeInit(MazeType *maze) {//初始化迷宮</p><p> int m,n,i,j;</p><p
44、> printf("輸入迷宮的行數(shù)和列數(shù):");</p><p> scanf("%d%d",&maze->row,&maze->column); //迷宮行和列數(shù)</p><p> for(i=0;i<=maze->column+1;i++) { //迷宮行外墻</p><
45、;p> maze->grid[0][i]='1'; //設置為障礙墻</p><p> maze->grid[maze->row+1][i]='1';}</p><p> for(i=0;i<=maze->row+1;i++) {//迷宮列外墻</p><p> maze->g
46、rid[i][0]='1'; //設置為障礙墻</p><p> maze->grid[i][maze->column+1]='1';} </p><p> for(i=1;i<=maze->row;i++) //初始化迷宮</p><p> for(j=1;j<=maze->col
47、umn;j++)</p><p> maze->grid[i][j]='0'; //設置為可通過</p><p> printf("輸入障礙墻的坐標(輸入坐標0,0結束):");</p><p> while(1){scanf("%d%d",&m,&n); //接收障礙的坐標
48、</p><p> if(m==0) //輸入0</p><p> break; //結束坐標的輸入</p><p> if(m<=0||n<=0||m>maze->row||n>=maze->column) { //越界</p><p> printf("坐標越界,重新輸入!\
49、n");</p><p> continue;}</p><p> maze->grid[m][n]='1'; //迷宮障礙用‘1’標記</p><p><b> }</b></p><p> return 1;}</p><p><b>
50、2、獲取下一位置:</b></p><p> Coordinate NextCoord(Coordinate pos,int i) {//獲取下一位置</p><p> switch(i) {//1,2,3,4分別代表東南西北方向</p><p> case 1: //向右查找</p><p> pos.colum
51、n+=1; </p><p><b> break;</b></p><p> case 2: //向下查找</p><p> pos.row+=1; </p><p><b> break;</b></p><p> case 3: //向左查找
52、 </p><p> pos.column-=1;</p><p><b> break;</b></p><p> case 4: //向上查找</p><p> pos.row-=1;</p><p><b> break;</b></p>&
53、lt;p><b> default:</b></p><p> exit(0); }</p><p> return pos;}</p><p><b> 3、路徑查找:</b></p><p> int MazePath(MazeType *maze,Coordinate star
54、t,Coordinate end){//從迷宮maze的入 </p><p><b> 口到出口查找路徑</b></p><p> Stack s; //定義棧</p><p> Coordinate pos;</p><p> int curstep; //當前序號1,2,3,4分別表
55、示東南西北方向</p><p> MazeNode e;</p><p> InitStack(&s); //初始化棧</p><p> pos=start; //從入口位置開始查找路徑</p><p> curstep=1; //探索第一步</p><p> do{if(Pass(maz
56、e,pos)) {//若指走位置可通過</p><p> MarkerPass(maze,pos); //標記能通過</p><p> e.ord=curstep; //保存步數(shù)</p><p> e.seat=pos; //保存當前坐標</p><p> e.di=1; //向右探測</p><p
57、> Push(&s,e); //將節(jié)點添加到棧中(保存路徑)</p><p> if(pos.row==end.row&&pos.column==end.column) {//若當前位置是出口坐標</p><p> DestroyStack(&s); //釋放棧已用空間</p><p> return 1;
58、//返回查找成功</p><p><b> }</b></p><p> else {//與出口坐標不同</p><p> pos=NextCoord(pos,1); //向右探測</p><p> curstep++; //增加前進步數(shù)</p><p><b> }&l
59、t;/b></p><p><b> }</b></p><p> else {//若指定位置不通(為障礙墻或已走過)</p><p> if(!StackEmpty(&s)) { //若棧不為空(之前有走過的位置)</p><p> Pop(&s,&e); //出棧(返回上一
60、步的位置)</p><p> while(e.di==4&&!StackEmpty(&s)) {//上一步4個方向都得測完, 且棧不為空</p><p> MarkerNoPass(maze,e.seat); //標記該位置不為空</p><p> Pop(&s,&e); //出棧(返回上一步)</p>
61、<p><b> }</b></p><p> if(e.di<4) //若為探測完4個方向</p><p> e.di++; //準備探測下一個方向 </p><p> Push(&s,e); //將當前節(jié)點入棧(保存當前位置,準備下一位置的探測)</p><p> p
62、os=NextCoord(e.seat,e.di); //查找下一個應該探測位置的坐標</p><p><b> }</b></p><p><b> }</b></p><p> }while(!StackEmpty(&s)); //程序運行到這里,表示沒有能通達的路徑</p><
63、;p> DestroyStack(&s); //釋放棧占用的空間</p><p> return 0; //返回失敗 </p><p><b> }</b></p><p> 五、算法復雜度的簡單分析</p><p> (一)、一元多項式計算:</p><p>&l
64、t;b> 1、加法:O(n)</b></p><p> 2、減法:O(n+m)</p><p> 3、求解x:O(n^2)</p><p><b> 4、求導:O(n)</b></p><p> 5、乘法:O(n^2)</p><p><b> ?。ǘ⒚詫m
65、求解:</b></p><p> 1、初始化:O(n^2)</p><p> 2、獲取下一位置:O(n)</p><p> 3、路徑查找:O(n)</p><p><b> 六、程序測試數(shù)據(jù)</b></p><p> ?。ㄒ唬⒁辉囗検接嬎悖?lt;/p><p
66、> 1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);</p><p> 2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15</p><p> )=(-7.8x^15-1.2x^9+12x^-3-x);</p><p>
67、3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5);</p><p> 4、(x+x^3)+(-x-x^3)=0;</p><p> 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200);</p><p> 6、(x+x^2+x^3)+0=x+x^2+x^3.</p>
68、<p><b> ?。ǘ⒚詫m求解:</b></p><p><b> 5</b></p><p><b> 0 0 0 0 0</b></p><p><b> 1 1 1 1 0</b></p><p><b> 0 0
69、0 0 0</b></p><p><b> 0 1 1 1 1</b></p><p><b> 0 0 0 0 0</b></p><p><b> 路徑:</b></p><p> 七、出現(xiàn)問題及解決方法</p><p> 1
70、、我編程時最常見的問題就是馬虎,常常丟三落四,如:經(jīng)常忘記語句后的分號,經(jīng)常忘記地址符號,經(jīng)常丟一半括號等一些細小的問題沒有注意好。</p><p> 我的解決方法是反復檢查或編譯檢查,寫代碼時多多提醒自己,注意小問題的發(fā)生。</p><p> 2、剛拿到題時急于完成作業(yè),沒有對題仔細分析就忙于做,結果在編程過程中思路不清晰,思維不連貫,想到哪里就做到哪里,常忽略一些細節(jié)上的問題和整體
71、連貫的問題,并且對題意理解不夠全面。</p><p> 我的解決方法是靜下心來,仔細讀題審題,分析題意,做出大體設計,條理清晰,不要慌忙編寫代碼。</p><p> 3、我對書中鏈表,文件等部分掌握的都不夠好,所以寫程序時遇到不少問題。</p><p> 我的解決方法是:邊編程邊看書;找學長學姐請教;參考有關方面的書籍等。</p><p&g
72、t; 4、在函數(shù)編寫過程中也遇到了或大或小的問題,對各類函數(shù)掌握的不是很熟練,運行時常常出現(xiàn)問題。</p><p> 我的解決方法是:上網(wǎng)查找相關內(nèi)容參考研究;問學長學姐;查找課本類似函數(shù)加以修改等。</p><p> 5、在寫迷宮求解程序的時候發(fā)現(xiàn),求出起點到終點的路徑的函數(shù),經(jīng)過反復運行求出的結果總是無任何現(xiàn)象。</p><p> 我的解決方法是查找資料
73、,詢問學姐后發(fā)現(xiàn)原因是把相關重要的變量重復定義以至賦過的值被覆蓋,改正后運行正確。</p><p><b> 八、設計總結</b></p><p> 通過本次課程設計,我對《數(shù)據(jù)結構(c 語言版)》這門課程有了很深入的理解。數(shù)據(jù)結構是計算機程序設計的重要理論技術基礎,它不僅是計算機科學的核心課程,而且已成為其他理工專業(yè)的熱門專業(yè)熱門選修課程。因此熟練掌握數(shù)據(jù)結構知
74、識對我們計算機專業(yè)的學習非常必要,為以后我們對編程、軟件設計等打下堅實的基礎。經(jīng)過本次課程設計,我深刻地明白了理論與實踐應用相結合的重要性,并努力克服自己在分析復雜問題的弱點。這次課程設計同時也考驗我的綜合運用所學知識的能力和操作能力。虛心求教,敢于懷疑,敢于發(fā)現(xiàn)問題,并及時動腦解決問題,提出自己新的見解和構思思想。個人的力量是薄弱的,集體的力量是強大的。獨立思考問題的同時也要適當合作,相互交流意見,讓你我在編程方面都有所進步,有所收獲
75、。在發(fā)現(xiàn)彼此各自優(yōu)缺點時,吸取各自的優(yōu)點,克服缺點,善于發(fā)揮自己的長處。</p><p> 一開始寫一元多項式計算的程序時調(diào)理不清晰,遇到了一些問題,在看書查資料或是問同學之后都能解決,在查資料時發(fā)現(xiàn)了題目要求以外的功能,嘗試了一下,效果還好??墒敲詫m求解的程序就沒那么簡單了,曾一度讓我想放棄,就算看書查資料還是有好些不懂得,還好有位同專業(yè)的學姐,找她詢問了好多次,才有所了解,在她的幫助下完成了迷宮求解程序的編
76、寫。最后要將兩個程序?qū)懙揭黄穑@個以前接觸過所以寫起來還比較容易。就這樣我的程序在歷經(jīng)艱辛后終于誕生了。</p><p> 雖然寫程序的道路崎嶇并艱辛,但經(jīng)過努力得到收獲時的喜悅卻又無與倫比。總之---痛并快樂著,這是此次寫程序我最大的感受。這次寫程序也同樣提醒著我在以后的學習中要更努力,更細心,更刻苦,這樣才會快樂多一點,痛苦少一點。</p><p><b> 九、參考文獻
77、</b></p><p> 1、C語言大學實用教程(第2版) 蘇小紅等 著 電子工業(yè)出版社</p><p> 2、數(shù)據(jù)結構(C語言版) 秦鋒 著 清華大學出版社</p><p> 3、《數(shù)據(jù)結構》(C語言版) 嚴蔚敏、吳偉民 著 清華大學出版社<
78、;/p><p><b> 十、附錄:源程序</b></p><p> #include<stdio.h></p><p> #include<stdlib.h></p><p> #include<string.h></p><p> #include&l
79、t;conio.h></p><p> #define MAXLEN 30 //迷宮包括外墻最大行列數(shù)目</p><p> #define INIT_SIZE 100 //存儲空間初始分配量</p><p> typedef struct {int row; //迷宮的行數(shù)</p><p> int colum
80、n; //迷宮的列數(shù)</p><p> char grid[MAXLEN][MAXLEN];//1表示障礙,0表示空,2表示可通,3表示已經(jīng)走過但不通</p><p> }MazeType; //迷宮類型</p><p> typedef struct {//迷宮中的坐標</p><p> int row; //行號&
81、lt;/p><p> int column; //列號</p><p> }Coordinate;</p><p> typedef struct {int ord; //當前位置在路徑上的序號</p><p> Coordinate seat; //當前坐標</p><p> int di; /
82、/往下一坐標的方向</p><p> }MazeNode; //棧元素類型</p><p> typedef struct {MazeNode base[INIT_SIZE]; //迷宮節(jié)點信息</p><p> int top; //棧頂元素</p><p><b> }Stack;</b><
83、/p><p> typedef struct Polynomial { //定義多項式的項</p><p> float coef; //系數(shù)</p><p> int expn; //指數(shù)</p><p> struct Polynomial *
84、next;</p><p> }*Polyn,Polynomial;</p><p> void Insert(Polyn p,Polyn h){ if(p->coef==0) free(p); //系數(shù)為0的話釋放結點</p><p> else{Polyn q1,q2;</p><p><b> q1
85、=h;</b></p><p> q2=h->next;</p><p> while(q2&& p->expn < q2->expn) { //查找插入位置 </p><p><b> q1=q2;</b></p><p> q
86、2=q2->next;}</p><p> if(q2&& p->expn == q2->expn) { //將指數(shù)相同相合并 </p><p> q2->coef += p->coef;</p><p><b> free(p);</b></
87、p><p> if(!q2->coef) {//系數(shù)為0的話釋放結點 </p><p> q1->next=q2->next;</p><p> free(q2);}</p><p><b> }</b></p><p> else {
88、//指數(shù)為新時將結點插入 </p><p> p->next=q2;</p><p> q1->next=p;}</p><p><b> }</b></p><p><b> }</b></p><p> P
89、olyn CreatePolyn(Polyn head,int m) {//建立一個頭指針為head、項數(shù)為m的一元多項式 </p><p> int i;</p><p> Polyn p;</p><p> p=head=(Polyn)malloc(sizeof(struct Polynomial));</
90、p><p> head->next=NULL;</p><p> for(i=0;i<m;i++){p=(Polyn)malloc(sizeof(struct Polynomial)); //建立新結點以接收數(shù)據(jù)</p><p> printf("請輸入第%d項的系數(shù)與指數(shù):",i+1);</p><p>
91、 scanf("%f %d",&p->coef,&p->expn);</p><p> Insert(p,head); //調(diào)用Insert函數(shù)插入結點</p><p><b> }</b></p><p> return head;}</p>&l
92、t;p> void DestroyPolyn(Polyn p){ //銷毀多項式p </p><p> Polyn q1,q2;</p><p> q1=p->next;</p><p> q2=q1->next;</p><p> while(q1->next
93、){</p><p><b> free(q1);</b></p><p><b> q1=q2;</b></p><p> q2=q2->next;}</p><p><b> }</b></p><p> void PrintPoly
94、n(Polyn P){Polyn q=P->next; </p><p> int flag=1; //項數(shù)計數(shù)器</p><p> if(!q){ //若多項式為空,輸出0</p><p> putchar('0'); </p><
95、;p> printf("\n");</p><p> return;} </p><p> while(q){ if(q->coef>0&& flag!=1) putchar('+'); //系數(shù)大于0且不是第一項</p><p> if(q->coef!=1&&a
96、mp;q->coef!=-1){ //系數(shù)非1或-1的普通情況</p><p> printf("%g",q->coef); </p><p> if(q->expn==1) putchar('X');</p><p> else if(q->expn) printf("X^%d"
97、,q->expn);}</p><p> else{if(q->coef==1){</p><p> if(!q->expn) putchar('1'); </p><p> else if(q->expn==1) putchar('X'); </p><p> else pri
98、ntf("X^%d",q->expn);}</p><p> if(q->coef==-1){</p><p> if(!q->expn) printf("-1"); </p><p> else if(q->expn==1) printf("-X"); </p>
99、<p> else printf("-X^%d",q->expn);}</p><p><b> }</b></p><p> q=q->next; </p><p><b> flag++;}</b></p><p> printf("
100、;\n");}</p><p> int compare(Polyn a,Polyn b){ if(a&&b){</p><p> if(!b||a->expn>b->expn) return 1;</p><p> else if(!a||a->expn<b->expn) return -1;&l
101、t;/p><p> else return 0;}</p><p> else if(!a&&b) return -1; //a多項式已空,但b多項式非空</p><p> else return 1; //b多項式已空,但a多項式非空</p&g
102、t;<p><b> }</b></p><p> Polyn AddPolyn(Polyn pa,Polyn pb) {//求解并建立多項式a+b,返回其頭指針 </p><p> Polyn qa=pa->next;</p><p> Polyn qb=pb->next;<
103、/p><p> Polyn headc,hc,qc;</p><p> hc=(Polyn)malloc(sizeof(struct Polynomial)); //建立頭結點</p><p> hc->next=NULL;</p><p><b> headc=hc;</b></p><p
104、> while(qa||qb){qc=(Polyn)malloc(sizeof(struct Polynomial));</p><p> switch(compare(qa,qb)){</p><p> case 1:{qc->coef=qa->coef;</p><p> qc->expn=qa->expn;</p&g
105、t;<p> qa=qa->next;</p><p><b> break;}</b></p><p> case 0:{ qc->coef=qa->coef+qb->coef;</p><p> qc->expn=qa->expn;</p><p> qa=
106、qa->next;</p><p> qb=qb->next;</p><p><b> break;}</b></p><p> case -1:{qc->coef=qb->coef;</p><p> qc->expn=qb->expn;</p><p&
107、gt; qb=qb->next;</p><p><b> break;} </b></p><p><b> }</b></p><p> if(qc->coef!=0){qc->next=hc->next;</p><p> hc->next=qc;<
108、;/p><p><b> hc=qc;}</b></p><p> else free(qc); //當相加系數(shù)為0時,釋放該結點</p><p><b> }</b></p><p> return headc;}</p>
109、<p> Polyn SubtractPolyn(Polyn pa,Polyn pb) { //求解并建立多項式a-b,返回其頭指針 </p><p> Polyn h=pb;</p><p> Polyn p=pb->next;</p><p><b> Polyn pd;</b></p>
110、<p> while(p){ //將pb的系數(shù)取反</p><p> p->coef*=-1;</p><p> p=p->next;}</p><p> pd=AddPolyn(pa,h);</p><p> for(p=
111、h->next;p;p=p->next) //恢復pb的系數(shù)</p><p> p->coef*=-1;</p><p> return pd;}</p><p> float ValuePolyn(Polyn head,int x) { //輸入x值,計算并返回多項式的值 &l
112、t;/p><p><b> Polyn p;</b></p><p><b> int i,t;</b></p><p> float sum=0;</p><p> for(p=head->next;p;p=p->next){t=1;</p><p> f
113、or(i=p->expn;i!=0;){</p><p> if(i<0){t/=x;i++;} //指數(shù)小于0,進行除法</p><p> else{t*=x;i--;} //指數(shù)大于0,進行乘法</p><p><b> }</b></p><p
114、> sum+=p->coef*t;}</p><p> return sum;}</p><p> Polyn Derivative(Polyn head) {//求解并建立導函數(shù)多項式,并返回其頭指針 </p><p> Polyn q=head->next,p1,p2,hd;</p><p&g
115、t; hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點</p><p> hd->next=NULL;</p><p> while(q){if(q->expn!=0){ //該項不是常數(shù)項時</p><p> p2=(Polyn)malloc(sizeof(st
116、ruct Polynomial));</p><p> p2->coef=q->coef*q->expn;</p><p> p2->expn=q->expn-1;</p><p> p2->next=p1->next; //連接結點</p><p> p1->ne
117、xt=p2;</p><p><b> p1=p2;}</b></p><p> q=q->next;}</p><p> return hd;}</p><p> Polyn MultiplyPolyn(Polyn pa,Polyn pb) {//求解并建立多項式a*b,返回其頭指針 </p>
118、;<p> Polyn hf,pf;</p><p> Polyn qa=pa->next;</p><p> Polyn qb=pb->next;</p><p> hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點</p><p> hf->ne
119、xt=NULL;</p><p> for(;qa;qa=qa->next){for(qb=pb->next;qb;qb=qb->next){</p><p> pf=(Polyn)malloc(sizeof(struct Polynomial));</p><p> pf->coef=qa->coef*qb->coef;&
120、lt;/p><p> pf->expn=qa->expn+qb->expn;</p><p> Insert(pf,hf); //調(diào)用Insert函數(shù)以合并指數(shù)相同的項</p><p><b> }</b></p><p><b> }</b&g
121、t;</p><p> return hf;}</p><p> void Polynomial_solve(void){int m,n,a,x;</p><p> char flag;</p><p> Polyn pa=0,pb=0,pc;</p><p> printf("
122、 歡迎使用一元多項式計算程序!\n");</p><p> printf("請輸入a的項數(shù):");</p><p> scanf("%d",&m);</p><p> pa=CreatePolyn(pa,m); //建立多項式a</p&g
123、t;<p> printf("請輸入b的項數(shù):");</p><p> scanf("%d",&n);</p><p> pb=CreatePolyn(pb,n); //建立多項式b</p><p><b> //輸出菜單</b><
124、;/p><p> printf(" **************************************************\n");</p><p> printf(" * 一元多項式計算 *\n");</p><p> printf(
125、" **************************************************\n");</p><p> printf(" * A:輸出多項式a B:輸出多項式b *\n");</p><p> printf(" * C:輸出a的導數(shù)
126、 D:輸出b的導數(shù) *\n");</p><p> printf(" * E:代入x的值計算a F:代入x的值計算b *\n");</p><p> printf(" * G:輸出a+b H:輸出a-b *\n");</p
127、><p> printf(" * I:輸出a*b J:退出程序 *\n");</p><p> printf(" **************************************************\n");</p><p> while(a){
128、printf("\n請選擇操作:");</p><p> scanf(" %c",&flag); </p><p> switch(flag){ case'A':</p><p> case'a':{printf("\n 多項式a=")
129、;</p><p> PrintPolyn(pa);</p><p><b> break;}</b></p><p><b> case'B':</b></p><p> case'b':{printf("\n 多項式b=")
130、;</p><p> PrintPolyn(pb);</p><p><b> break;}</b></p><p><b> case'C':</b></p><p> case'c':{pc=Derivative(pa);</p><
131、p> printf("\n 多項式a的導函數(shù)為:a'=");</p><p> PrintPolyn(pc);</p><p><b> break;}</b></p><p><b> case'D':</b></p><p>
132、 case'd':{pc=Derivative(pb);</p><p> printf("\n 多項式b的導函數(shù)為:b'=");</p><p> PrintPolyn(pc);</p><p><b> break;}</b></p><p><b
133、> case'E':</b></p><p> case'e':{printf("輸入x的值:x=");</p><p> scanf("%d",&x);</p><p> printf("\n x=%d時,a=%.3f\n",x
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設計--一元多項式計算
- 課程設計報告---一元多項式計算器
- 一元多項式運算課程設計報告
- 一元多項式運算課程設計
- 一元多項式計算(數(shù)據(jù)結構課程設計)
- 數(shù)據(jù)結構課程設計報告一元多項式的計算
- 數(shù)據(jù)結構課程設計報告一元多項式的計算
- 數(shù)據(jù)結構課程設計報告一元多項式的計算
- 一元稀疏多項式計算器課程設計
- 數(shù)據(jù)結構課程設計---一元多項式計算
- 一元多項式課程設計--用c語言實現(xiàn)一元多項式的加減法計算
- 一元多項式的計算數(shù)據(jù)結構課程設計報告
- 數(shù)據(jù)結構課程設計報告一元多項式的計算[1]
- 數(shù)據(jù)結構課程設計---一元多項式
- 課程設計---一元多項式的代數(shù)運算
- 數(shù)據(jù)結構課程設計----一元多項式
- 一元多項式的計算數(shù)據(jù)結構課程設計
- 數(shù)據(jù)結構課程設計-一元多項式計算器
- c++課程設計---一元多項式簡單計算器
- 數(shù)據(jù)結構課程設計報告一元稀疏多項式計算器
評論
0/150
提交評論