#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");
}
多項式相加的C語言實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.