一、題目
二、思路
多項式加法,數據結構學習鏈表時的典型應用。emm不過忘得差不多了,自己用數組寫了一遍。
三、代碼
#include <stdio.h>
int main() {
//ak、bk、ck存儲項數,ae、be、ce存儲指數
int ak, bk, tmp, ae[10] = { 0 }, be[10] = { 0 }, ce[20] = { 0 },sgn = 0, ck = 0, i = 0;
float ac[1001] = { 0.0 }, bc[1001] = { 0.0 };//存儲指數對應的係數
//讀取多項式A
scanf("%d", &ak);
for (i = 0; i < ak; i++) {
scanf("%d",&tmp);
ae[i] = tmp;
scanf("%f", &ac[tmp]);
}
//讀取多項式B
scanf("%d", &bk);
for (i = 0; i < bk; i++) {
scanf("%d", &tmp);
be[i] = tmp;
scanf("%f", &bc[tmp]);
}
//雙層循環做加法,利用ac數組存儲a+b的和c的係數
i = 0;//i作爲指向數組a的指針,標誌當前加法進行到了哪一項
while(i<ak){
if (ae[i] < be[sgn]) {//當多項式b的當前項指數大於a的時,說明a中沒有這一指數級的項
ce[ck] = be[sgn];
ac[ce[ck]] = bc[ce[ck]];
sgn++; //sgn作爲指向數組b的指針,標誌當前加法進行到了哪一項
}
else if (ae[i] == be[sgn]) {//a和b的當前項指數相同
ce[ck] = ae[i];
ac[ce[ck]]+= bc[ae[i]];
if (ac[ce[ck]] == 0)//當兩項相加係數爲0時,不需要記錄該項
ck--;
sgn++; i++;
}
else {//a的當前項指數大於b的當前項
ce[ck] = ae[i];
i++;
}
ck++;
if (sgn >= bk)//判斷多項式b是否加完了
break;
}
if (sgn >= bk) {//說明多項式a可能還剩幾項未加入
for (int j = i; j < ak; j++) {
ce[ck] = ae[j];
ck++;
}
}
else {//說明多項式b可能還剩幾項未加入
for (int j = sgn; j < bk; j++) {
ce[ck] = be[j];
ac[ce[ck]] = bc[ce[ck]];
ck++;
}
}
//輸出結果c
printf("%d", ck);
for (i = 0; i < ck; i++) {
printf(" %d %.1f", ce[i], ac[ce[i]]);
}
return 0;
}
四、循環鏈表做法
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//結點結構體
typedef struct pnode{
float coef;
int exp;
struct pnode *next;
}polynode;
polynode* Creat(int k){
float coef;
int exp,i;
polynode *head,*s,*r;
head=(polynode*)malloc(sizeof(polynode));
head->coef=0;head->exp=-1;r=head;
for(i=0;i<k;i++){
scanf("%d %f",&exp,&cof);
s=(polynode*)malloc(sizeof(polynode));
s->coef=coef;s->exp=exp;r->next=s;r=s;
}
r->next=head;//尾插法建立循環鏈表
return head;
}
polynode* polyadd(polynode *pa,polynode *pb){
polynode *p,*q,*r,*s;//p、q指示a、b當先需做加法的項結點,s指示p的前驅,r指示q的後繼
float x;
p=pa->next;q=pn->next;
s=pa;
while((p!=pa)&&(q!=pb)){
if(p->exp > q->exp){
s=p;p=p->next;
}
else if(p->exp < q->exp){
r=q->next;q->next=p;
s->next=q;s=q;q=r;
}
else{
x=p->coef+q->coef;
if(x!=0){
p->coef=x;
s=p;
}
else{
s->next=p->next;
free(p);
}
p=s->next;
r=q;q=q->next;
free(r);
}
}
if(q!=pb){
r=q;
while(r->next!=pb)
r=r->next;
s->next=q;
r->next=pa;
}
return pa;
}
void Output(polynode *head){
polynode *p;int k=0;
p=head->next;
while(p!=head){
k++;
p=p->next;
}
printf("%d ",&k);
p=head->next;
while(p!=head){
printf("%d %.1f",p->exp,p->coef);
p=p->next;
}
printf("\n");
}
int main(){
polynode *ha,*hb;
int a,b;
scanf("%d",&a);
ha=Creat(a);
scanf("%d",&b);
hb=Creat(b);
ha=PolyAdd(ha,hb);
Output(ha);
}