資料結構應用————-多項式的相加

來源:互聯網
上載者:User

 

/*----------------------------------------------------------------------------------程式說明:這一個程式是《資料結構》這本書上面的例子來的。功能是實現兩個多項式的相加。這一個程式的核心代碼(虛擬碼)是來源於書上。而我的工作就是將它實現。雖然書上面提供的最核心思想,但是如果完照抄書上面的代碼,你會發現其實那些代碼是十分坑爹的,尤其是要用到指標的地方。本應是要用引用或者指標的,可是書上往往會寫成直接傳數值,而不是地址或者引用。總結:如果不是那麼嚴格,這一個小小程式,應該可以算是一個比較小的課程設計吧。不過,這一個程式雖小,但是我也足足花一個下午加上晚上的時間才完成。本來,我打算一個下午時間就可以完成的。誰知道,竟然大部分時間用在調試方面。尤其是在結構指標上面,往往忘記了分配記憶體就使用。看來是太久沒有動手做點比較大的東西。。-------------------------------------------------------------------------------*//*---------------------------------------------------------------------------------addpolyn.c提供測試代碼edited by Seed,2011-------------------------------------------------------------------------------*/#include<stdio.h>#include"addpolyn.h"int main(void){Polynomial Pa, Pb ;int m ;printf("請輸入多項式 A 的項數 :  ") ;  //構造多項式Ascanf("%d",&m) ;CreatPolyn(&Pa,m) ;PrintPolyn(Pa) ;printf("請輸入多項式 B 的項數 :  ") ;  //構造多項式Bscanf("%d",&m) ;CreatPolyn(&Pb,m) ;PrintPolyn(Pb) ;AddPolyn(&Pa, &Pb) ;   //合并A和BPrintPolyn(Pa) ;Destroy(&Pa) ;return 0 ;}/*------------------------------------------------------------------File : addpolyn.hFuction : 提供各種各樣的定義edited by Seed , 2011----------------------------------------------------------------*/#ifndef ADDPOLYN_H_#define ADDPOLYN_H_/*-----------------------------------------------------------資料類型定義---------------------------------------------------------*/typedef struct{float coef ;int expn ;} term, ElemType ;typedef struct LNode{ElemType data ;struct LNode *next ;} LNode ,*Link, *Position ;typedef struct{Link head , tail ;int len ;} LinkList ;typedef LinkList Polynomial ;/*---------------------------------------------------------函數頭聲明、以及定義函數傳回值定義-------------------------------------------------------*/typedef int Status ;#define OK 1 #define ERROR 0#define TRUE 1#define FALSE 0Link  GetHead(Polynomial *P) ;Status InitList(Polynomial *P) ;Status SetCurElem(Link *p,ElemType e) ;Status LocateElem(Polynomial *P,ElemType e,Position *q,int (*compare)(ElemType,ElemType) ) ;Status MakeNode(Link *p,ElemType e) ;Status InsFirst(Link h,Link s) ;int cmp(term a,term b) ;void CreatPolyn(Polynomial *P ,int m) ;Link NextPos(Polynomial *P, Link l) ;ElemType GetCurElem(Link p)  ;void FreeNode(Link P) ;Status ListEmpty(LinkList L) ;Status Append(LinkList *L,Link s) ;void AddPolyn(Polynomial *Pa, Polynomial *Pb) ;void Destroy(Polynomial *P) ;void PrintPolyn(Polynomial P) ;#endif  /*------------------------------------------------------------------File : polyn.hFuction : 提供介面的實現edited by Seed , 2011----------------------------------------------------------------*/#include"addpolyn.h"#include<stdio.h>#include<stdlib.h>Link GetHead(Polynomial *P){return (P->head) ;}  //GetHeadStatus InitList(Polynomial *P){if((P->head = P->tail = (Link) malloc(sizeof(LNode))) == NULL) //我曾經在這裡寫成p->head = p->tail = e ;但是這會造成程式崩潰{printf("Can't assign room\n") ;exit(1) ;}//因為e只是臨時變數,函數返回時會自動釋放,所以函數返回時不存在,P->len = 0 ;//也就是說指向了已經釋放的記憶體.P->head->next = NULL ;return OK ;}  //InitListStatus SetCurElem(Link *p,ElemType e){if(NULL == p){printf("Error\n") ;return ERROR ;}                           else{(*p)->data = e ;return OK ;}}  //SetCurElemint cmp(term a,term b){if(a.expn > b.expn )return 1 ;else if(a.expn == b.expn )return 0 ;else return -1 ;} // cmpStatus LocateElem(Polynomial *P,ElemType e,Link *q,int (*compare)(ElemType,ElemType) ){Link temp = (Link)malloc(sizeof(LNode)) ;Link pre = (Link) malloc(sizeof(LNode)) ;ElemType t ;temp = P->head->next  ;pre = P->head ;while(temp != NULL){t = temp->data ;switch((*compare)(t,e)){case 1 :(*q) = pre ;return 1 ;case 0 :return 0 ;}                             //switch-case             temp = temp->next ;pre = pre->next ;}                                //whilereturn -1 ;}  //LocateElemStatus MakeNode(Link *p,ElemType e){if(((*p) = (Link) malloc(sizeof(LNode))) != NULL){(*p)->data = e ;(*p)->next = NULL ;return TRUE ;}return FALSE ;}  //MakeNodeStatus InsFirst(Link h,Link s)  {Link temp ;if((temp = (Link) malloc(sizeof(LNode))) != NULL ){temp = h->next ;s->next = temp ;h->next = s ;return OK ;}return FALSE ;}void CreatPolyn(Polynomial *P ,int m){Link  h ,s = NULL;ElemType  e ;int i = 0 ;Link *q = (Link *) malloc(sizeof(LNode)) ;Link last = (Link) malloc(sizeof(LNode)) ;e.coef = 0.0 ;e.expn = -5 ;InitList(P) ;    h = GetHead(P) ;if(!SetCurElem(&h,e)){printf("The pointer is NUUL\n") ;exit(1) ;}for(i = 0 ; i < m ; i++){printf("\n請輸入係數:") ;scanf("%f",&(e.coef )) ;printf("\n請輸入指數: ") ;scanf("%d",&(e.expn) ) ;switch(LocateElem(P,e,q,cmp)){case 0 :break ;case 1 :if(MakeNode(&s,e)){if(InsFirst(*q,s)){P->len++ ;}}break ;case -1 :if(MakeNode(&s,e)){last = P->tail ;last->next = s ;P->tail = s ;P->len++ ;}                //ifbreak ;}//switch}  //for}  //CreatPolynLink NextPos(Polynomial *P, Link l){Link cur = P->head ;while(cur != l && cur != NULL)cur = cur->next ;if(NULL == cur)return NULL ;elsereturn l->next ;} //NextPosElemType GetCurElem(Link p) {return p->data ;} //GetCurElemStatus DelFirst(Link h, Link q){Link temp ;if(NULL == h->next ){q = NULL ;return ERROR ; }temp = h->next ;h->next = h->next ->next ;q = temp ;return OK ;} //DelFirst void FreeNode(Link P){if(NULL == P);else{free(P) ;P = NULL ;}} //FreeNodeStatus ListEmpty(LinkList L){if(L.head == L.tail)return TRUE ;elsereturn FALSE ;} //ListEmptyStatus Append(LinkList *L,Link s){int count = 0 ;L->tail->next = s ;while(s != NULL){s = s->next ;count++ ;}L->tail = s ;L->len += count ;return TRUE ;}//Append void AddPolyn(Polynomial *Pa,Polynomial *Pb){Link ha ,hb ;Link qa, qb ;ElemType a ,b ;float sum ;ha = GetHead(Pa) ;hb = GetHead(Pb) ;qa = NextPos(Pa,ha) ;qb = NextPos(Pb,hb) ;while((qa != NULL) && (qb != NULL)){a = GetCurElem(qa) ;b = GetCurElem(qb) ;switch(cmp(a,b)){case -1 :ha = qa ;qa = NextPos(Pa,qa) ;break ;case 0 :sum = a.coef + b.coef ;a.coef = sum ;if(sum != 0.0){SetCurElem(&qa,a) ;      //Status SetCurElem(Link *p,ElemType e)ha = qa ;}else{if(DelFirst(ha,qa)){Pa->len-- ;}FreeNode(qa) ;}DelFirst(hb,qb) ;FreeNode(qb) ;qb = NextPos(Pb,hb) ;qa = NextPos(Pa,ha) ;break ;case 1 :DelFirst(hb,qb) ;InsFirst(ha,qb) ;qb = NextPos(Pb,hb) ;ha = NextPos(Pa,ha) ;break ;}  //switch}  //whileif(!ListEmpty(*Pb)){Append(Pa,qb) ;}FreeNode(hb) ;}  //AddPolynvoid Destroy(Polynomial *P){Link h = P->head ;Link temp ;while(h != NULL){temp = h ;h = h->next ;free(temp) ;}} //Destroyvoid PrintPolyn(Polynomial P){Link h= P.head ;while(h != NULL) {printf("%.2f^%d + " ,h->data.coef ,h->data.expn ) ;h = h->next ;}printf("\n\n\n") ;} //PrintPolyn

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.