這一個一看就知道是個作業文,
雖知道 linklist, 不過一直沒用過它,
這次用 c 把它 coding 出來...
有空時再用 C++ 弄一個 class  出來吧..

// =============================================
// filename : link_poly_c.c
// author   : edison.shih.
// date     : 2010.10.21
// complier : vc 2008
//
// all rights reserve
// =============================================

#include <stdio.h>
#include <stdlib.h>

// =============================================
typedef struct Link{
        int exp;
        int coef;
        struct Link* pNext;
};

typedef struct Link* Poly;
typedef struct Link* pLink;

// =============================================
void AddData(Poly p, int _coef, int _exp); // 新增資料
void Travel(Poly p); // 印出資料
void InputData(Poly p); // 輸入資料
void LinkAdd(Poly A, Poly B, Poly C); // a+b=c相加
void LinkMul(Poly A, Poly B, Poly C); // a*b=c相乘
void RemoveCoefZero(Poly p); //將系數為0之 node 移除
// =============================================

// =============================================
// 新增資料
void AddData(Poly p, int _coef, int _exp)
{
        Poly tmp = p;

        while(tmp->pNext!=NULL) {
               
                if(tmp->pNext->exp == _exp) {
                        // 次方一樣,系數直接再加進去
                        tmp->pNext->coef += _coef;
                        return ;
                }
                else if(tmp->pNext->exp > _exp){
                        // 次方比現有的小,節點加在這個之前
                        Poly tmp2 = tmp->pNext;
                        tmp->pNext = (pLink)malloc(sizeof(struct Link));
                        tmp->pNext->exp = _exp;
                        tmp->pNext->coef=_coef;
                        tmp->pNext->pNext = tmp2;
                        return ;
                       
                }
                else{
                        // 次方比現有的大,繼續往後找
                        tmp=tmp->pNext;
                }
        }

        // 最後沒找到, 生個新的節點出來
        // malloc the new node, be the last .
        tmp->pNext = (pLink)malloc(sizeof(struct Link));
        tmp->pNext->pNext = NULL;
        tmp->pNext->coef = _coef;
        tmp->pNext->exp = _exp;
}
// =============================================
// 印出資料
void Travel(Poly p)
{
        Poly tmp = p->pNext;
        printf("\n===== travel =====\n");
        if(tmp==NULL) {
                printf("0\n");
                return ;
        }

        while(tmp!=NULL){
                if(tmp==p->pNext)printf("%d*X^%d ",  tmp->coef,tmp->exp);
                else printf("%+d*X^%d ",  tmp->coef,tmp->exp);
                tmp = tmp->pNext;
        }
        printf("\n");
}
// =============================================
// 輸入資料
void InputData(Poly p)
{
        int n=0, i=0;
        int _coef=0, _exp=0;
        scanf("%d", &n);
        for(i=0; i<n; i++){
                scanf("%d%d", &_coef, &_exp);
                AddData(p, _coef, _exp );
               
        }
}
// =============================================
// 相加
void LinkAdd(Poly A, Poly B, Poly C)
{
        Poly tmpA = A->pNext;
        Poly tmpB = B->pNext;

        while(tmpA!=NULL) AddData(C, tmpA->coef, tmpA->exp), tmpA=tmpA->pNext;
        while(tmpB!=NULL) AddData(C, tmpB->coef, tmpB->exp), tmpB=tmpB->pNext;
}
// =============================================
// 相乘
void LinkMul(Poly A, Poly B, Poly C)
{
        Poly tmpA = A->pNext;
        Poly tmpB = B->pNext;

        while(tmpA!=NULL){
                tmpB = B->pNext;

                while(tmpB!=NULL){
                        AddData(C, tmpA->coef * tmpB->coef,        tmpA->exp + tmpB->exp);
                        tmpB = tmpB ->pNext;
                }
                tmpA = tmpA->pNext;
        }
}
// =============================================
// 將系數為 0 者去除
void RemoveCoefZero(Poly p)
{
        Poly pre = p;
        Poly cur = p->pNext;

        while(cur!=NULL){
                if(cur->coef==0) {
                        pre->pNext = cur->pNext;
                        free(cur);
                        cur = pre->pNext;
                        continue;
                }
                pre = cur;
                cur = cur->pNext;
        }
}

// =============================================
// 釋放記憶體
void ReleaseLink(Poly p)
{
        Poly tmp = p->pNext;
        while(tmp!=NULL){
                p->pNext = tmp->pNext;
                free(tmp);
                tmp = p->pNext;
        }
        free(p);
}
// =============================================
int main()
{
        int i=0;
        // initialize

        Poly A, B, Add_C, Mul_D;
        A = (pLink)malloc(sizeof(struct Link));
        A->pNext = NULL;

        B = (pLink)malloc(sizeof(struct Link));
        B->pNext = NULL;

        Add_C = (pLink)malloc(sizeof(struct Link));
        Add_C->pNext = NULL;

        Mul_D = (pLink)malloc(sizeof(struct Link));
        Mul_D->pNext = NULL;

        // input data
        InputData(A); 
        InputData(B); 
        LinkAdd(A, B, Add_C);
        LinkMul(A, B, Mul_D);
        RemoveCoefZero(Add_C), Travel(Add_C);
        RemoveCoefZero(Mul_D), Travel(Mul_D);
        ReleaseLink(A);
        ReleaseLink(B);

        return 0;
}

執行結果如圖下所示...

link-list poly 

 

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(3) 人氣()