?? 一元稀疏多項式.txt
字號:
一元稀疏多項式相加
設計一個一元多項式加法器。實現: (1)輸入并建立多項式; (2)兩個多項式相加; (3)輸出多項式:n, c1, e1, c2, e2, …cn , en, 其中,n是多項式項數,ci和ei分別是第 i 項的系數和指數,序列按指數降序排列。
1、一元稀疏多項式相加
詳細設計
1 程序頭的設計:
#include<stdio.h>
#include<malloc.h>
typedef struct pnode
{int coef;/*系數 */
int exp;/*指數 */
struct pnode *next;/*下一個指針*/
}pnode;
2 用頭插法生成一個多項式,系數和指數輸入0時退出輸入
pnode * creat()
{int m,n; pnode *head,*rear,*s;
/*head為頭指針,rear和s為臨時指針*/
head=(pnode *)malloc(sizeof(pnode));
rear=head;
/*指向頭*/
printf("input coef:");/*輸入系數*/
scanf("%d",&n);
printf("input exp:");/*輸入指數*/
scanf("%d",&m);
while(n!=0)/*輸入0就退出*/
{s=(pnode *)malloc(sizeof(pnode));
s->coef=n;
s->exp=m;
s->next=NULL;
rear->next=s;/*頭插法*/
rear=s;
printf("input coef:");/*輸入系數*/
scanf("%d",&n);
printf("input exp:");/*輸入指數*/
scanf("%d",&m);
}
head=head->next;/*第一個頭沒有用到*/
return head;
}
3 顯示一個多項式
void display(pnode *head)
{pnode *p;int one_time=1; p=head;
while(p!=NULL)/*不為空的話*/
{
if(one_time==1)
{if(p->exp==0)/*如果指數為0的話,直接輸出系數*/
printf("%d",p->coef); /*如果系數是正的話前面就要加+號*/
else if(p->coef==1||p->coef==-1)
printf("x^%d",p->exp);/*如果系數是1的話就直接輸出+x*/
/*如果系數是-1的話就直接輸出-x號*/
else if(p->coef>0)/*如果系數是大于0的話就輸出+系數x^指數的形式*/
printf("%dx^%d",p->coef,p->exp);
else if(p->coef<0)/*如果系數是小于0的話就輸出系數x^指數的形式*/
printf("%dx^%d",p->coef,p->exp);
one_time=0;
}
else{
if(p->exp==0)/*如果指數為0的話,直接輸出系數*/
{if(p->coef>0)
printf("+%d",p->coef); /*如果系數是正的話前面就要加+號*/
}
else if(p->coef==1)
printf("+x^%d",p->exp);
else if(p->coef==-1)
printf("x^%d",p->exp);/*如果系數是1的話就直接輸出+x號*/
else if(p->coef>0)/*如果系數是大于0的話就輸出+系數x^指數的形式*/
printf("+%dx^%d",p->coef,p->exp);
else if(p->coef<0)/*如果系數是小于0的話就輸出系數x^指數的形式*/
printf("%dx^%d",p->coef,p->exp);
}
p=p->next;/*指向下一個指針*/
}
printf("\n");
4 兩個多項式的加法運算
pnode * add(pnode *heada,pnode *headb)
{pnode *headc,*p,*q,*s,*r;
/*headc為頭指針,r,s為臨時指針,p指向第1個多項式并向右移動,q指向第2個多項式并并向右移動*/
int x;
/*x為系數的求和*/
p=heada;
/*指向第一個多項式的頭*/
q=headb;
/*指向第二個多項式的頭*/
headc=(pnode *)malloc(sizeof(pnode));
r=headc;
/*開辟空間*/
while(p!=NULL&&q!=NULL)
/*2個多項式的某一項都不為空時*/
{if(p->exp==q->exp)/*指數相等的話*/
{x=p->coef+q->coef;/*系數就應該相加*/
if(x!=0)/*相加的和不為0的話*/
{s=(pnode *)malloc(sizeof(pnode));/*用頭插法建立一個新的節點*/
s->coef=x;
s->exp=p->exp;
r->next=s;
r=s;
}
q=q->next;p=p->next;
/*2個多項式都向右移*/
}
else if(p->exp<q->exp)/*p的系數小于q的系數的話,就應該復制q接點到多項式中*/
{s=(pnode *)malloc(sizeof(pnode));
s->coef=q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;/*q向右移動*/
}
else/*p的系數大于q的系數的話,就應該復制p接點到多項式中*/
{s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;/*p向右移動*/
}
}
當第2個多項式空,第1個數不為空時,將第一個數剩下的全用新節點產生
while(p!=NULL)
{s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
當第1個多項式空,第1個數不為空時,將第2個數剩下的全用新節點產生
while(q!=NULL)
{s=(pnode *)malloc(sizeof(pnode));
s->coef=q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
/*最后指向空*/
headc=headc->next;/*第一個頭沒有用到*/
return headc;/*返回頭接點*/
5 兩個多項式的減法運算,和加法類似,不同的地方已經注釋
pnode * sub(pnode *heada,pnode *headb)
{pnode *headc,*p,*q,*s,*r;
int x;
p=heada;q=headb;
headc=(pnode *)malloc(sizeof(pnode));
r=headc;
while(p!=NULL&&q!=NULL)
{if(p->exp==q->exp)
{x=p->coef-q->coef;/*系數相減*/
if(x!=0)
{s=(pnode *)malloc(sizeof(pnode));
s->coef=x;
s->exp=p->exp;
r->next=s;
r=s;
}
q=q->next;p=p->next;
}
else if(p->exp<q->exp)/*p的系數小于q的系數的話*/
{s=(pnode *)malloc(sizeof(pnode));
s->coef=-q->coef;/*建立的接點的系數為原來的相反數*/
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
else
{s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
}
while(p!=NULL)
{s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
while(q!=NULL)
{s=(pnode *)malloc(sizeof(pnode));
s->coef=-q->coef;/*建立的接點的系數為原來的相反數*/
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
headc=headc->next;
return headc;
6 界面設計:
printf("\n ****************************************\n");
printf("\n ************** 03 Computer *************\n");
printf("\n ******** Class:two **** Num:34 *********\n");
printf("\n *********** Name: xie pan **********\n");
printf("\n ****************************************\n");
printf("\n --------------1: add -------------\n");
printf("\n --------------2: sub -------------\n");
printf("\n --------------3: exit ------------\n");
printf("\n ****************************************\n");
7 連接程序:
case 1:add_main();break;/*加法*/
case 2:sub_main();break;/*減法*/
case 3:break;/*退出*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -