多項式相加的C語言實現

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


//定義結構體類型
typedef struct Node{
    float xishu;				//定義係數爲浮點數
    int zhishu;					//定義指數爲整型
    struct Node *Next;
}Node;


typedef struct Node* PNode;	//定義指針類型


//多項式按照指數大小排序
void insertNewPoint_link(PNode head,PNode qNode)
{
	PNode p=head;				//向head爲首的鏈表中插入qnode結點,由p從head處開始遍歷
	PNode h=head;
	PNode q;					//用於銷燬節點
    while (p->Next!=NULL)		//若已輸入多項式不止一項
    {
		//若新項的指數比某一項p大則將新項插在該項前面
        if (p->Next->zhishu < qNode->zhishu)
        {
            qNode->Next = p->Next;
            p->Next = qNode;
            break;				//插完之後即可退出
        }
		else if(p->Next->zhishu == qNode->zhishu)
		{
			float sum = p->Next->xishu + qNode->xishu;//計算合併後的係數
			if(sum!=0)		//若合併後係數不爲零
				{
					p->Next->xishu = sum;//重新賦予p項新的係數
				}
				else		//否則刪去已有鏈表中的第一項
				{
					q=p->Next;
					p->Next= p->Next->Next;
					free(q);//銷燬結點
					q=NULL;
				}
				break;
		}
        p = p->Next;			//若新項指數小於p當前指向的項則p移至下一項與下一項進行比較
	}
	if (p->Next == NULL)		//若多項式只有一項則無需排序
    {
        p->Next = qNode;
    }
}


//輸出多項式
void printLinkeLink(PNode head)
{
    PNode temp = head->Next;					//建立臨時指針用於遍歷鏈表
	printf("%fX^%d",temp->xishu,temp->zhishu);	//先輸出第一項(不用前置符號)
	temp=temp->Next;			//temp指針指向下一項
    while (temp != NULL)		//循環輸出後續項
    {
        if (temp->xishu > 0)		//若爲正係數
			printf(" +%fX^%d",temp->xishu,temp->zhishu);
        else if (temp->xishu < 0)	//若爲負係數
			printf("%fX^%d",temp->xishu,temp->zhishu);
        temp=temp->Next;
    }
}


//多項式的加法計算
void add_poly(Node *pa,Node *pb)//pa,pb分別爲多項式一和多項式二的頭指針
{
	Node *p=pa->Next;		//p爲遍歷指針,此時指向多項式一的第一項
    Node *q=pb->Next;		//q爲遍歷指針,此時指向多項式二的第一項
    Node *pre=pa;			//pre此刻指向多項式一的頭指針,後續作爲中間載體
    Node *u;				//u指針做臨時指針,用於釋放節點
    while (p!=NULL&&q!=NULL)//若指針指向的內容都不爲空
    {
        if (p->zhishu > q->zhishu)//若多項式一中的項係數大於對應多項式二中的項
        {
            pre = p ; 
			p = p->Next;
        }
        else if(p->zhishu == q->zhishu)//若兩項係數相等則合併同類項
        {
            float x = p->xishu + q->xishu;//x爲合併後的係數
            if (x != 0)				//若合併後係數不爲零
            {
                p->xishu = x;		//將合併後的係數賦給多項式一中對應的項
                pre=p;				//pre指向p結點
            }
            else					//若合併後係數爲零
            {
                pre->Next = p->Next;//指向下一個結點
                free(p);			//釋放p銷燬結點
            }
            p = pre->Next;
            u = q;
            q = q->Next;
            free(u);
        }
        else				//若多項式一中的項係數小於對應多項式二中的項
		{
            u = q->Next;
            q->Next = p;
            pre->Next = q;
            pre = q ;
            q = u;
        }
    }
    if (q)
    {
        pre->Next = q;
    }
    free(pb);
}


//實現主函數
void main( )
{
    float xishu;		//定義變量  係數和指數
	int zhishu;
    PNode head1 = (PNode)malloc(sizeof(struct Node));
    PNode head2 = (PNode)malloc(sizeof(struct Node));
    PNode tem=NULL;
    head1->Next=NULL;
    head2->Next=NULL;
    //輸入多項式一各項
    printf("輸入鏈表一的係數和指數,如:3,2 (以0,0結束輸入):\n");
    scanf("%f,%d",&xishu,&zhishu);
    while (xishu!=0)	//當係數爲零時停止輸入
    {
        tem=(PNode)malloc(sizeof(struct Node));	//往鏈表中插入新的項
        tem->xishu = xishu;
        tem->zhishu = zhishu;
        tem->Next = NULL;
		insertNewPoint_link(head1,tem);			//插入新結點
        scanf("%f,%d",&xishu,&zhishu);			//輸入下一項
    }
    printf("多項式一爲:\n");					
    printLinkeLink(head1);						//輸出多項式一
    printf("\n");
    //輸入多項式二各項
    printf("\n輸入鏈表二的係數和指數,如:3,2 (以0,0結束輸入):\n");
    scanf("%f,%d",&xishu,&zhishu);
    while (xishu!=0)	//當係數爲零時停止輸入
    {
        tem=(PNode)malloc(sizeof(struct Node));
        tem->xishu=xishu;
        tem->zhishu=zhishu;
        tem->Next=NULL;
	    insertNewPoint_link(head2,tem);
        scanf("%f,%d",&xishu,&zhishu);
    }
    printf("多項式二爲:\n");
    printLinkeLink(head2);
    printf("\n");
    //輸出多項式相加的結果
    add_poly(head1,head2);
    printf("\n多項式相加後的結果爲:\n");
    printLinkeLink(head1);
	printf("\n\n");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章