靈感範文站

數據結構課程設計心得體會(多篇)

數據結構課程設計心得體會(多篇)

數據結構課程設計 篇一

一,課程題目

(算符優先法計算算數表達式)以字符序列的形式從終端輸入語法正確的、不含變量的整數表達式。利用教材表3.1(P53)給出的算符優先關係,實現對於算術四則混合運算(加、減、乘、除)表達式的求值。例如:7+(4-2)*3+12/2=19。注:按照四捨五入的方式將四則運算結果取整。

二,程序設計思想

在程序中分別設立一個運算符棧(OPTR 棧),用於存儲‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用於判斷算術表達式結束),和一個操作數棧(OPND 棧),用於存放整數,輸入算式後,先將數字與運算符分開入i棧,若爲數字則先用轉換函數將char類型的數轉換爲int型並進入操作數棧,若爲運算符則根據教材表3.1(P53)給出的算符優先級關係,判斷棧頂運算符和從鍵盤取得的運算符作優先級比較,若取得的運算符優先級高則進棧,直到取得運算符優先級低的,則將操作數取出作operate運算後存入棧頂,反覆操作知道遇到‘#’,則結束運算,輸出棧頂元素即爲結果。 三,程序流程圖

四,程序關鍵代碼設計

本次程序設計共調用了12個方法分別是:

InitNumStack,ParseInt,PushNum,PopNum ,InitCalStack,PopCal ,PushCal,In,GetTopCal,GetTopNum,Preced,Operate。 其中

ParseInt方法

int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){

number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10 *number[3]+number[4]; return i; } 爲將輸入的數字字符型轉換爲整型的轉換函數,通過Ascall表的轉換關係,將輸入的字符型數字轉換爲整型。在入棧前進行此方法,以便整型數的計算。 Preced,Operate函數

char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; int Operate (int a,char theta,int b){ int c ; if (theta=='+'){

c=a+b; return c; } if (theta=='-'){

c=a-b; return c; } if (theta=='*'){

c=a*b; return c; } if (theta=='/'){

c=a/b; return c; } return 0; } 其中preced是判定運算符棧的棧頂運算符C1與讀入的運算符C2之間優先關係函數;Opearte爲進行二元運算aCb的函數,如果是編譯表達式,則產生這個運算的一組相應的指令並返回存放結果的中間變量名;如果是解釋執行表達式,則直接進行該運算,並返回運算結果。 五,程序源代碼以及運行結果

#include#include #includetypedef struct{ int *base; int *top; int Stacksize; }SqlNum; void InitNumStack(SqlNum &S){ =(int *)malloc(100*sizeof(int)); =; ksize=100; } int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){

number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10*number[3]+number[4]; return i; } void PushNum(SqlNum &S,int c){ *=c; ++; } int PopNum(SqlNum &S){ int c; --; c=*; return c; } typedef struct{ char *base; char *top; int Stacksize; }SqlCal; void InitCalStack(SqlCal &S){ =(char *)malloc(100*sizeof(char)); =; ksize=100; } void PushCal(SqlCal &S,char c){ *=c; ++; } char PopCal(SqlCal &S){ char c; --; c=*; return c; }

int In(char c,char s[]){ int i; for(i=0;i

if(c==s[i])

return 1;

return 0; }

char GetTopCal(SqlCal &s){ char c; c=*(-1); return c; } int GetTopNum(SqlNum &s){ int c; c=*(-1); return c; } char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, } uaw ; if(a=='+'){

if(b=='+'){

return d[0][0];}

if(b=='-'){

return d[0][1];}

if(b=='*'){

return d[0][2];}

if(b=='/'){

return d[0][3];}

if(b=='('){

return d[0][4];}

if(b==')'){

return d[0][5];}

if(b=='#'){

return d[0][6];} } if(a=='-'){

if(b=='+'){

return d[1][0];}

if(b=='-'){

return d[1][1];}

if(b=='*'){

return d[1][2];}

if(b=='/'){

return d[1][3];}

if(b=='('){

return d[1][4];}

if(b==')'){

return d[1][5];}

if(b=='#'){

return d[1][6];} } if(a=='*'){

if(b=='+'){

return d[2][0];}

if(b=='-'){

return d[2][1];}

if(b=='*'){

return d[2][2];}

if(b=='/'){

return d[2][3];}

if(b=='('){

return d[2][4];}

if(b==')'){

return d[2][5];}

if(b=='#'){

return d[2][6];} } if(a=='/'){

if(b=='+'){

return d[3][0];}

if(b=='-'){

return d[3][1];}

if(b=='*'){

return d[3][2];}

if(b=='/'){

return d[3][3];}

if(b=='('){

return d[3][4];}

if(b==')'){

return d[3][5];}

if(b=='#'){

return d[3][6];} } if(a=='('){

if(b=='+'){

return d[4][0];}

if(b=='-'){

return d[4][1];}

if(b=='*'){

return d[4][2];}

if(b=='/'){

return d[4][3];}

if(b=='('){

return d[4][4];}

if(b==')'){

return d[4][5];}

if(b=='#'){

return d[4][6];} } if(a==')'){

if(b=='+'){

return d[5][0];}

if(b=='-'){

return d[5][1];}

if(b=='*'){

return d[5][2];}

if(b=='/'){

return d[5][3];}

if(b=='('){

return d[5][4];}

if(b==')'){

return d[5][5];}

if(b=='#'){

return d[5][6];} } if(a=='#'){

if(b=='+'){

return d[6][0];}

if(b=='-'){

return d[6][1];}

if(b=='*'){

return d[6][2];}

if(b=='/'){

return d[6][3];}

if(b=='('){

return d[6][4];}

if(b==')'){

return d[6][5];}

if(b=='#'){

return d[6][6];} } return 0; } int Operate (int a,char theta,int b){ int c ; if (theta=='+'){

c=a+b; return c; } if (theta=='-'){

c=a-b; return c; } if (theta=='*'){

c=a*b; return c; } if (theta=='/'){

c=a/b; return c; } return 0; } void main(){ SqlCal OPTR; SqlNum OPND; char c,d[5]={'0','0','0','0','0'}; int f=0; char op[]={'+','-','*','/','(',')','#'}; InitCalStack(OPTR); InitNumStack(OPND); printf(“請輸入算式並在尾部添加一個#號n”); c=getchar(); PushCal(OPTR,'#'); while(c!='#'||GetTopCal(OPTR)!='#') { if (!In(c,op))

{

d[0]=d[1];

d[1]=d[2];

d[2]=d[3];

d[3]=d[4];

d[4]=c;

c=getchar(); f=1;

}

else

{

if(f==1){

PushNum(OPND,ParseInt(d));

d[0]='0';d[1]='0';d[2]='0';d[3]='0';d[4]='0';

f=0;

}

switch(Preced(GetTopCal(OPTR),c))

{

case'<':

PushCal(OPTR,c);

c=getchar();

break;

case'=':

PopCal(OPTR);

c=getchar();

break;

case'>':

char theta;int a;int b;

theta=PopCal(OPTR);

b=PopNum(OPND);

a=PopNum(OPND);

PushNum(OPND,Operate(a,theta,b));

break;

}

} } printf(“%dn”,GetTopNum(OPND)); }

程序運行結果: 六,心得體會

通過這次編程,我發現很多編程過程中的不足與問題,很多問題由於考慮不全面,導致程序運行失敗。還有一些小問題,比如字母的大小寫,括號的遺漏,語法書寫錯誤等等一些基礎錯誤,也是讓我體會很深寫程序要謹慎仔細。

《數據結構》課程設計文檔格式(定稿 篇二

課程設計報告的內容

設計結束後要寫出課程設計報告,以作爲整個課程設計評分的書面依據和存檔材料。設計報告以規定格式的電子文檔書寫,打印並裝訂,排版及圖,表要清楚,工整。 裝訂順序如下:封面、目錄、正文。正文包括以下7個內容:

1、需求分析

陳述說明程序設計的任務,強調的是程序要做什麼 ,需要什麼結果、所能達到的功能。

2、概要設計

說明本程序中用到的所有抽象數據類型的定義,主程序的流程以及各程序模塊之間的層次(調用)關係。3.詳細設計

實現概要設計中定義的所有數據類型,對每個操作只需要寫出僞碼算法;對主程序和其他模塊也都需要寫出僞碼算法(僞碼算法達到的詳細程度建議爲:按照僞碼算法可以在計算機鍵盤直接輸入高級程序設計語言程序);可採用流程圖、N S 圖進行描述,畫出函數和過程的調用關係圖。

4、調試分析

內容包括:

a.調試過程中遇到的問題是如何解決的以及對設計與實現的回顧討論和分析; b.算法的時空分析(包括基本操作和其他算法的時間複雜度和空間複雜度的分析)和 改進設想;

c.經驗和體會等。5.測試結果

列出你的測試結果,包括輸入和輸出。這裏的測試數據應該完整和嚴格,最好多於需求分析中所列。

6、參考文獻

列出參考的相關資料和書籍。

封面格式如下:

數據結構課程設計報告

班級:_____ _____ _____ _________

姓名:____________________

指導教師:___________________

成績:__________________________

信息工程學院

年月日

目錄

1、需求分析 ………………………………………………

22.概要設計………………………………………………2

3、詳細設計 ………………………………………………2

4、調試分析 ………………………………………………2

5、測試結果… ……………………………………………2 參考文獻 …………………………………………………6

附錄……………………………………………………

一、需求分析

二、概要設計

三、詳細設計

四、調試分析

五、測試結果

六、參考文獻

七、附錄

附錄爲程序代碼!4

數據結構課程設計心得體會 篇三

通過本次課程設計,對圖的概念有了一個新的認識,在學習離散數學的時候,總覺得圖是很抽象的東西,但是在學習了《數據結構與算法》這門課程之後,我慢慢地體會到了其中的奧妙,圖能夠在計算機中存在,首先要捕捉他有哪些具體化、數字化的信息,比如說權值、頂點個數等,這也就說明了想要把生活中的信息轉化到計算機中必須用數字來完整的構成一個信息庫,而圖的存在,又涉及到了頂點之間的聯繫。圖分爲有向圖和無向圖,而無向圖又是有向圖在權值雙向相等下的一種特例,如何能在計算機中表示一個雙向權值不同的圖,這就是一件很巧妙的事情,經過了思考和老師同學的幫助,我用edges[i][j]=up和edges[j][i]=up就能實現了一個雙向圖信息的存儲。對整個程序而言,Dijkstra算法始終都是核心內容,其實這個算法在實際思考中並不難,也許我們誰都知道找一個路徑最短的方法,及從頂點一步一步找最近的路線並與其直接距離相比較,但是,在計算機中實現這麼一個很簡單的想法就需要涉及到很多專業知識,爲了完成設計,在前期工作中,基本都是以學習C語言爲主,所以浪費了很多時間,比如說在程序中,刪除頂點和增加頂點的模塊中都有和建圖模塊相互重複的函數,但是由於技術的原因,只能做一些很累贅的函數,可見在調用知識點,我沒有掌握好。不過,有了這次課程設計的經驗和教訓,我能夠很清楚的對自己定一個合適的水平,而且在這次課程設計中我學會了運用兩個新的函數sprintf和包涵在#include頭文件中的輸入函數。因爲課程設計的題目是求最短路徑,本來是想通過算法的實現把這個程序與交通情況相連,但是因爲來不及查找各地的信息,所以,這個計劃就沒有實現,我相信在以後有更長時間的情況下,我會做出來的。

數據結構課程設計 篇四

《數據結構》

課程設計報告

學 號 姓 名 班 級 指導教師

XXX XXX XXX XXX 安徽工業大學計算機學院

2014年6月

利用棧實現迷宮問題的求解

一、問題描述

以一個M*N的長方陣表示迷宮,0和1分別表示迷宮中的通路和牆壁。設計一個程序,對任意設定的迷宮,求出一條從入口到出口的通路,或得出米有通路的結論。

二、設計思路

(1)以二維數組maze[m][n]表示迷宮,數組中元素值爲0表示通路,1表示障礙。

(2)其中迷宮的入口位置和出口位置默認於maze數組的起始元素位置和最後個元素位置。

(3)以鏈表作存儲結構的棧類型,實現求解迷宮的非遞歸程序。

三、數據結構定義 typedef struct{

int x; int y; }item; typedef struct{ int x,y,d; }DataType; typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

四、程序清單 #include#include#include#define m 6 #define n 8 int maze[m+2][n+2]={{1,1,1,1,1,1,1,1,1,1},

typedef struct{

{1,0,1,1,1,0,1,1,1,1}, {1,0,0,0,0,1,1,1,1,1}, {1,0,1,0,0,0,0,0,1,1}, {1,0,1,1,1,0,0,1,1,1}, {1,1,0,0,1,1,0,0,0,1}, {1,0,1,1,0,0,1,1,0,1}, {1,1,1,1,1,1,1,1,1,1}}; int x; int y; }item;

item move[4]={{0,1},{1,0},{0,-1},{-1,0}};

typedef struct{ int x,y,d; }DataType;

typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

PSeqStack Init_SeqStack() {

} PSeqStack p; p=(PSeqStack)malloc(sizeof(SeqStack)); if(p) p->top=-1; return p;

int Empty_SeqStack(PSeqStack p) {

}

int Push_SeqStack(PSeqStack p,DataType x) {

}

int Pop_SeqStack(PSeqStack p,DataType *x) { if(p->top==999) return 0; if(p->top==-1) return 1; else return 0; else {

} p->top++; p->data[p->top]=x; return 1;

} if(Empty_SeqStack(p)) return 0; else {

} *x=p->data[p->top]; p->top--; return 1; void Destroy_SeqStack(PSeqStack *p) {

}

int mazepath(int maze[][n+2],item move[],int x0,int y0) {

PSeqStack S; DataType temp; int x,y,d,i,j; if(*p) free(*p); *p=NULL; return;

temp.x=x0; temp.y=y0; temp.d=-1; S=Init_SeqStack(); if(!S) {

} Push_SeqStack(S,temp); while(!Empty_SeqStack(S)) {

Pop_SeqStack(S,&temp); x=temp.x; y=temp.y; d=temp.d+1; while(d<4) {

i=x+move[d]。x; j=y+move[d]。y; if(0==maze[i][j]) { temp.x=x; printf(“棧初始化失敗!!!”); return 0;

}

}

} temp.y=y; temp.d=d; Push_SeqStack(S,temp); x=i; y=j; maze[x][y]=-1; if(x==m&&y==n) {

} else d=0; while(!Empty_SeqStack(S)) {

} Destroy_SeqStack(&S); return 1; Pop_SeqStack(S,&temp); printf(“(%d,%d)<-”,temp.x,temp.y); else d++;

} Destroy_SeqStack(&S); return 0; int main() {

}

五、運行及調試分析 mazepath(maze,move,1,1); return 0;

六、課程設計總結等

在做實驗前,一定要將課本上的知識吃透,因爲這是做實驗的基礎,否則,在做設計程序實驗時,這將使你做的難度加大,浪費寶貴的時間。使你事倍功半。做實驗時,一定要親力親爲,務必要將每個步驟,每個細節弄清楚,弄明白,實驗後,還要複習,思考,這樣,你的印象才深刻,記得才牢固,否則,過後不久你就會忘得一乾二淨,這還不如不做。通過這次程序設計的實驗,使我們學到了不少實用的知識,更重要的是,做實驗的過程,思考問題的方法,這與做其他的實驗是通用的,真正使我們們受益匪淺。

大數相乘

一、問題描述

本問題中,要求輸入兩個相對較大的正整數,能夠通過程序計算出其結果

二、設計思路

1、輸入階段採用一維數組a[],b[] 在輸入階段當大數輸入時,大數a,b從高位到低位分別依次存入數組a[ ],b[ ]。

2、調用函數計算階段採用一維數組c[ ] 在計算過程中,由個位到高位依次計算各位的結果,並依次存入數組c[ ]中。

三、數據結構定義

int x[N],y[N],z[N*N];

四、程序清單 #include#include#define N 80 void mul(int *x,int *y,int *z) { int i,j; for(i=0;i<2*N;i++) z[i]=0; for(i=0;i

五、運行及調試分析

六、課程設計總結。

回顧起此次課程設計,至今我仍感慨頗多,的確,從從拿到題目到完成整個編程,從理論到實踐,可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正提高自己的實際動手能力和獨立思考的能力。

2012數據結構課程設計 篇五

數 據 結 構

課程設計報告

題 目: 一元多項式計算 專 業: 信息管理與信息系統 班 級: 2012級普本班 學 號: 201201011367 姓 名: 左帥帥 指導老師: 郝慎學 時 間:

一、課程設計題目分析

本課程設計要求利用C語言或C++編寫,本程序實現了一元多項式的加法、減法、乘法、除法運算等功能。

二、設計思路

本程序採用C語言來完成課程設計。

1、首先,利用順序存儲結構來構造兩個存儲多項式A(x)和 B(x)的結構。

2、然後把輸入,加,減,乘,除運算分成五個主要的模塊:實現多項式輸入模塊、實現加法的模塊、實現減法的模塊、實現乘法的模塊、實現除法的模塊。

3、然後各個模塊裏面還要分成若干種情況來考慮並通過函數的嵌套調用來實現其功能,儘量減少程序運行時錯誤的出現。

4、最後編寫main()主函數以實現對多項式輸入輸出以及加、減、乘、除,調試程序並將不足的地方加以修改。

三、設計算法分析

1、相關函數說明:

(1)定義數據結構類型爲線性表的鏈式存儲結構類型變量

typedef struct Polynomial{}

(2)其他功能函數

插入函數void Insert(Polyn p,Polyn h)

比較函數int compare(Polyn a,Polyn b)

建立一元多項式函數Polyn Create(Polyn head,int m)

求解並建立多項式a+b,Polyn Add(Polyn pa,Polyn pb)

求解並建立多項式a-b,Polyn Subtract(Polyn pa,Polyn pb) 2

求解並建立多項式a*b,Polyn Multiply(Polyn pa,Polyn pb)

求解並建立多項式a/b,void Device(Polyn pa,Polyn pb)

輸出函數輸出多項式,void Print(Polyn P)

銷燬多項式函數釋放內存,void Destroy(Polyn p)

主函數,void main()

2、主程序的流程基函數調用說明 (1)typedef struct Polynomial {

float coef;

int expn;

struct Polynomial *next; } *Polyn,Polynomial;

在這個結構體變量中coef表示每一項前的係數,expn表示每一項的指數,polyn爲結點指針類型,屬於抽象數據類型通常由用戶自行定義,Polynomial表示的是結構體中的數據對象名。

(2)當用戶輸入兩個一元多項式的係數和指數後,建立鏈表,存儲這兩個多項式,主要說明如下:

Polyn CreatePolyn(Polyn head,int m)建立一個頭指針爲head、項數爲m的一元多項式

p=head=(Polyn)malloc(sizeof(struct Polynomial));爲輸入的多項式申請足夠的存儲空間

p=(Polyn)malloc(sizeof(struct Polynomial));建立新結點以接收數據

Insert(p,head); 調用Insert函數插入結點

這就建立一元多項式的關鍵步驟

(3)由於多項式的係數和指數都是隨即輸入的,所以根據要求需要對多項式按指數進行降冪排序。在這個程序模塊中,使用鏈表,根據對指數大小的比較,對各種情況進行處理,此處由於反覆使用指針對各個結點進行定位,找到合適的位置再利用void Insert(Polyn p,Polyn h)進行插入操作。 (4)加、減、乘、除、的算法實現:

在該程序中,最關鍵的一步是實現四則運算和輸出,由於加減算法原則是一樣,減法可通過係數爲負的加法實現;對於乘除算法的大致流程都是:首先建立多項式a*b,a/b,然後使用鏈表存儲所求出的乘積,商和餘數。這就實現了多項式計算模塊的主要功能。

(5)另一個子函數是輸出函數 PrintPolyn();

輸出最終的結果,算法是將最後計算合併的鏈表逐個結點依次輸出,便得到整鏈表,也就是最後的計算式計算結果。由於考慮各個結點的指數情況不同,分別進行了判斷處理。

四、程序新點

通過多次寫程序,發現在程序在控制檯運行時總是黑色的,本次寫程序就想着改變一下,於是經過查資料利用system(“Color E0”);可以函數解決,這裏“E0,”E是控制檯背景顏色,0是控制檯輸出字體顏色。

五、設計中遇到的問題及解決辦法

首先是,由於此次課程設計裏使用指針使用比較多,自己在指針多的時候易腦子混亂出錯,對於此問題我是採取比較笨的辦法在稿紙上寫明白後開始進行 4

代碼編寫。

其次是,在寫除法模塊時比較複雜,自己通過查資料最後成功寫出除法模塊功能。

最後是,前期分析不足開始急於寫代碼,中途出現各種問題,算是給自己以後設計時的一個經驗吧。

六、測試(程序截圖)

1、數據輸入及主菜單

2、加法和減法模塊

3、乘法和除法模塊

七、總結

通過本次應用C語言設計一元多項式基本計算程序,使我更加鞏固了C語言程序設計的知識,以前對指針這一點使用是比較模糊,現在通過此次課程設計對指針理解的比較深刻了。而且對於數據結構的相關算法和函數的調用方面知識的加深。本次的課程設計,一方面提高了自己獨立思考處理問題的能力;另一方面使自己再設計開發程序方面有了一定的小經驗和想法,對自己以後學習其他語言程序設計奠定了一定的基礎。

八、指導老師評語及成績

附錄:(課程設計代碼)

#include#include #includetypedef struct Polynomial {

float coef; 6

int expn;

struct Polynomial *next; } *Polyn,Polynomial;

//Polyn爲結點指針類型 void Insert(Polyn p,Polyn h) {

if(p->coef==0) free(p);

//係數爲0的話釋放結點

else

{

Polyn q1,q2;

q1=h;q2=h->next;

while(q2&&p->expnexpn)//查找插入位置

{

q1=q2; q2=q2->next; }

if(q2&&p->expn==q2->expn)//將指數相同相合並 {

q2->coef+=p->coef;

free(p);

if(!q2->coef)//係數爲0的話釋放結點

{ q1->next=q2->next; free(q2); }

}

else { p->next=q2; q1->next=p;

}//指數爲新時將結點插入

} 7

} //建立一個頭指針爲head、項數爲m的一元多項式 Polyn Create(Polyn head,int m) {

int i;

Polyn p;

p=head=(Polyn)malloc(sizeof(struct Polynomial));

head->next=NULL;

for(i=0;i

{

p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結點以接收數據

printf(“請輸入第%d項的係數與指數:”,i+1);

scanf(“%f %d”,&p->coef,&p->expn);

Insert(p,head);

//調用Insert函數插入結點

}

return head; } //銷燬多項式p void Destroy(Polyn p) {

Polyn q1,q2;

q1=p->next; 8

q2=q1->next;

while(q1->next)

{

free(q1);

q1=q2;//指針後移

q2=q2->next;

} } //輸出多項式p int Print(Polyn P) {

Polyn q=P->next;

int flag=1;//項數計數器

if(!q) //若多項式爲空,輸出0

{

putchar('0');

printf(“n”);

return;

}

while(q)

{

if(q->coef>0&&flag!=1) putchar('+'); //係數大於0且不是第一項 9

if(q->coef!=1&&q->coef!=-1)//係數非1或-1的普通情況

{

printf(“%g”,q->coef);

if(q->expn==1) putchar('X');

else if(q->expn) printf(“X^%d”,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->expn); }

}

q=q->next;

flag++;

}

printf(“n”); } int compare(Polyn a,Polyn b) {

if(a&&b)

{

if(!b||a->expn>b->expn) return 1;

else if(!a||a->expnexpn) return -1;

else return 0;

}

else if(!a&&b) return -1;//a多項式已空,但b多項式非空

else return 1;//b多項式已空,但a多項式非空 } //求解並建立多項式a+b,返回其頭指針 Polyn Add(Polyn pa,Polyn pb) {

Polyn qa=pa->next;

Polyn qb=pb->next;

Polyn headc,hc,qc;

hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點 11

hc->next=NULL;

headc=hc;

while(qa||qb){

qc=(Polyn)malloc(sizeof(struct Polynomial));

switch(compare(qa,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; 12

}

if(qc->coef!=0)

{

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else free(qc);//當相加係數爲0時,釋放該結點

}

return headc; } //求解並建立多項式a-b,返回其頭指針 Polyn Subtract(Polyn pa,Polyn pb) {

Polyn h=pb;

Polyn p=pb->next;

Polyn pd;

while(p)//將pb的係數取反

{ p->coef*=-1; p=p->next; }

pd=Add(pa,h);

for(p=h->next;p;p=p->next)

//恢復pb的係數

p->coef*=-1; 13

return pd; } //求解並建立多項式a*b,返回其頭指針 Polyn Multiply(Polyn pa,Polyn pb) {

Polyn hf,pf;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點

hf->next=NULL;

for(;qa;qa=qa->next)

{

for(qb=pb->next;qb;qb=qb->next)

{

pf=(Polyn)malloc(sizeof(struct Polynomial));

pf->coef=qa->coef*qb->coef;

pf->expn=qa->expn+qb->expn;

Insert(pf,hf);//調用Insert函數以合併指數相同的項

}

}

return hf; }

//求解並建立多項式a/b,返回其頭指針 void Device(Polyn pa,Polyn pb) {

Polyn hf,pf,temp1,temp2;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,存儲商

hf->next=NULL;

pf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,存儲餘數

pf->next=NULL;

temp1=(Polyn)malloc(sizeof(struct Polynomial));

temp1->next=NULL;

temp2=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next=NULL;

temp1=Add(temp1,pa);

while(qa!=NULL&&qa->expn>=qb->expn)

{

temp2->next=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next->coef=(qa->coef)/(qb->coef);

temp2->next->expn=(qa->expn)-(qb->expn);

Insert(temp2->next,hf);

pa=Subtract(pa,Multiply(pb,temp2)); 15

qa=pa->next;

temp2->next=NULL;

}

pf=Subtract(temp1,Multiply(hf,pb));

pb=temp1;

printf(“商是:”);

Print(hf);

printf(“餘數是:”);

Print(pf); } void main() { int choose=1; int m,n,flag=0; system(“Color E0”); Polyn pa=0,pb=0,pc,pd,pf;//定義各式的頭指針,pa與pb在使用前付初值NULL printf(“請輸入A(x)的項數:”); scanf(“%d”,&m); printf(“n”); pa=Create(pa,m);//建立多項式A printf(“n”); printf(“請輸入B(x)的項數:”); 16

scanf(“%d”,&n); printf(“n”); pb=Create(pb,n);//建立多項式B printf(“n”); printf(“**********************************************n”); printf(“*

多項式操作菜單

printf(”**********************************************n“); printf(”tt 1.輸出操作n“); printf(”tt 2.加法操作n“); printf(”tt 3.減法操作n“); printf(”tt 4.乘法操作n“); printf(”tt 5.除法操作n“); printf(”tt 6.退出操作n“); printf(”**********************************************n“); while(choose) {

printf(”執行操作:“);

scanf(”%d“,&flag);

switch(flag)

{

case 1:

printf(”多項式A(x):“);Print(pa); *n”);

printf(“多項式B(x):”);Print(pb);

break;

case 2:

pc=Add(pa,pb);

printf(“多項式A(x)+B(x):”); Print(pc);

Destroy(pc); break;

case 3:

pd=Subtract(pa,pb);

printf(“多項式A(x)-B(x):”); Print(pd);

Destroy(pd); break;

case 4:

pf=Multiply(pa,pb);

printf(“多項式A(x)*B(x):”);

Print(pf);

Destroy(pf);

break;

case 5:

Device(pa,pb); 18

break;

case 6:

exit(0);

break;

} }

Destroy(pa);

Destroy(pb); }