當前位置:編程學習大全網 - 源碼破解 - 數據結構課程設計報告(壹元多項式的計算)

數據結構課程設計報告(壹元多項式的計算)

問題描述

編程實現壹元多項式的加法計算。

基本要求

能用鏈表實現壹元多項式的加法計算,並能打印出計算結果。

所需知識

(1)基本編程方法和程序設計知識。

(2)鏈表的理解和運算與運用。

所用算法

遍歷算法和遞歸算法。

操作平臺

Visual C++

#include<stdio.h>

#include<graphics.h>

#define MAX 100

typedef struct polynode

{ float coef;

int expn;

struct polynode *next;

}node;

node * create(void) /*指針函數,返回指針類型;用尾插法建立壹元多項式的鏈表的函數*/

{

node *h,*r,*s;

float c;

int e;

h=(node *)malloc(sizeof(node)); /*建立多項式的頭結點,為頭結點分配存儲空間*/

r=h; /*r指針始終動態指向鏈表的當前表尾,以便於做尾插入,其初值指向頭結點*/

printf("coef:");

scanf("%f",&c); /*輸入系數*/

printf("expn: ");

scanf("%d",&e); /*輸入指數*/

while(c!=0.0) /*輸入系數為0時,表示多項式的輸入結束*/

{

s=(node *)malloc(sizeof(node)); /*申請新結點*/

s->coef=c; /*申請新結點後賦值*/

s->expn=e; /*申請新結點後賦值*/

r->next=s; /*做尾插,插入新結點*/

r=s; /*r始終指向單鏈表的表尾*/

printf("coef:");

scanf("%f",&c);

printf("expn: ");

scanf("%d",&e);

}

r->next=NULL; /*將表的最後壹個結點的next置NULL,以示表結束*/

return(h);

}

void polyadd(node *pa, node *pb) /*壹元多項式相加函數,用於將兩個多項式相加,

然後將和多項式存放在多項式pa中,並將多項式pb刪除*/

{

node *p,*q,*pre,*temp;

int sum;

p=pa->next; /*令p和q分別指向pa和pb多項式鏈表中的第壹個結點*/

q=pb->next;

pre=pa; /*位置指針,指向和多項式pa*/

while(p!=NULL&&q!=NULL) /*當兩個多項式均未掃描結束時,執行以下操作*/

{

if(p->expn<q->expn) /*若p指向的多項式指數小於q指的指數*/

{

pre->next=p; /*將p結點加入到和多項式中*/

pre=pre->next;

p=p->next;

}

if(p->expn==q->expn) /*若指數相等,則相應的系數相加*/

{

sum=p->coef+q->coef;

if(sum!=0)

{

p->coef=sum;

pre->next=p;pre=pre->next;p=p->next;

temp=q;q=q->next;free(temp);

}

else /*如果系數和為零,則刪除結點p與q,並將指針指向下壹個結點*/

{

temp=p->next;free(p);p=temp;

temp=q->next;free(q);q=temp;

}

}

if (q->expn<p->expn)

{

pre->next=q; /*將q結點加入到和多項式中*/

pre=pre->next;

q=q->next;

}

}

if(p!=NULL) /*多項式A中還有剩余,則將剩余的結點加入到和多項式中*/

pre->next=p;

else /*否則將B的結點加入到和多項式中*/

pre->next=q;

}

void print(node * p) /*輸出函數,打印出壹元多項式*/

{

while(p->next!=NULL)

{

p=p->next;

printf(" %f*x^%d",p->coef,p->expn);

}

}

void calculate() /*給多項式賦值並計算*/

{ float cal=1.0,mid=0.0,las;

int j;

float num, x;

int i=0;

float later=0.0;

int e[MAX];float c[MAX];

printf("Please input num:"); /*輸入常數的值*/

scanf("%f",&num);

printf("Please input x:"); /*輸入未知數X的值*/

scanf("%f",&x);

printf("Please input e[0]:"); /*輸入數組的初值以判斷是否循環*/

scanf("%d",&e[0]);

printf("Please input c[0]:");

scanf("%f",&c[0]);

while(e[i]!=0 && c[i]!=0.0 ) /*此循環用於多項式的計算*/

{ cal=1;

for(j=0;j<e[i];j++) /*表示出X的幾次方*/

{

cal=cal*x;

}

i++;

mid=cal*c[i-1]; /*表示出單項*/

later+=mid;

printf("Please input e[%d] and c[%d] :",i,i);

scanf("%d%f",&e[i],&c[i]);

}

las=later+num; /*表示出完整的多項式*/

printf("The Result is :\n");

printf("%f",las); /*最終的計算結果*/

sleep(3);

}

void main()

{

node * pa,* pb,*pc,*p,*q,*pre;

int driver=VGA,mode=VGAHI;

initgraph(&driver,&mode,"c:\\tc ");

setbkcolor(BLUE);

setcolor(RED);

printf("Welcome,Let's go!\n");

printf("Next, you will see the process of computing !");

printf("\nPlease input the coef and expn of pa:\n");

pa=create(); /*調用建立鏈表函數,創建多項式A*/

print(pa);

printf("\nPlease input the coef and expn of pb:\n");

pb=create(); /*同理,創建B*/

print(pb);

p=pa->next; /*以下代碼用於排序*/

pa->next=NULL;

while(p!=NULL)

{

if(pa->next==NULL)

{

pa->next=p;p=p->next;

pa->next->next=NULL;

}

else

{ pre=pa;q=pre->next;

while(q!=NULL && p->expn>q->expn)

{

pre=q;q=q->next;

}

q=p->next;

p->next=pre->next;

pre->next=p;

p=q;

}

}

printf("\nthe first ordered one:\n");print(pa); /*輸出排序後的pa*/

p=pb->next; /*以下代碼用於給pb排序*/

pb->next=NULL;

while(p!=NULL)

{

if(pb->next==NULL)

{

pb->next=p;p=p->next;

pb->next->next=NULL;

}

else

{ pre=pb;q=pre->next;

while(q!=NULL && p->expn>q->expn)

{

pre=q;q=q->next;

}

q=p->next;

p->next=pre->next;

pre->next=p;

p=q;

}

}

printf("\nthe second ordered one:\n");print(pb); /*輸出排序後的pb*/

printf("\nSum of the polys is:\n");

polyadd(pa,pb); /*調用壹元多項式相加函數*/

print(pa); /*調用輸出函數,打印結果*/

printf("\n");

setbkcolor(RED);

calculate(); /*調用計算多項式值的函數*/

}

編後總結

本程序在邏輯設計,詳細設計,程序編碼和程序調試階段時本來都城有設計save()保存函數,和load()下載函數,分別用來保存創建的多項式,和下載其它需計算的多項式數據,這樣這個系統才能更加實用,void createadj()原來的函數原型為arcnode *createdj()函數中用鏈表結構把adjmatrix[][]的數據都保存其中,這樣就能實現數據的保存,但隨之要把Dijkstra中的adjmatrix[][]轉換成用arcnode 指針的形式進行表示,因為只有這樣,下載後的數據才能使用。但在最後的調試階段中,發現dijkstra無法運行,但又苦於無法用save()函數保存adjmatrix[][],最後只放棄save()和load()函數,在 main()主函數中初始化該算式。從這次程序設計中我看到自己的不足之處,今後要更努力的學習和掌握好數據結構程序設計的知識。

  • 上一篇:svn的checkout命令?
  • 下一篇:電腦上怎麽安裝12306訂票軟件
  • copyright 2024編程學習大全網