以下是題干要求和源代碼 一直想不通為什么怎么修改 自己在dev編譯運行都是正常的
問題 資料結構作業01 -- 一元多項式的求導
時間限制: 1 Sec 記憶體限制: 128 MB
題目描述
一個一元多項式可以看作由若干個一元單項式按降冪排列成的線性表。請撰寫程式對輸入的一元多項式進行求導,并輸出求導的結果。
輸入
輸入為一個一元多項式,按照降冪依次輸入每個單項式的系數和指數,并以-1 -1作為結束。系數和指數均為整數,指數不小于0。
輸出
輸出為求導結果多項式,按照降冪依次輸出每個單項的系數和指數,每個數值后面用一個空格隔開,輸出結果多項式后換行。 系數為0的單項式不得輸出——除非結果多項式就是0,則直接輸出0并換行。
樣例輸入
2 7 3 5 12 1 6 0 -1 -1
樣例輸出
14 6 15 4 12 0
#include<iostream>
using namespace std;
typedef struct PNode{
int coef;
int expon;
struct PNode *next;
}PNode,*Polynomial;
void CreatePolyn(Polynomial &P){
Polynomial s,pre,q,r;
P=new PNode;
P->next=NULL;
r=P;
while(1){
s=new PNode;
s->next=NULL;
cin>>s->coef>>s->expon;
if(s->coef==-1&&s->expon==-1){
break;
}
r->next=s;
r=s;
}
}
void print(Polynomial P){
Polynomial f;
int count=0;
f=P->next;
if(f->expon==0) {printf("0");}
else{
while(f){
if(count!=0) {printf(" ");}
if(f->coef!=0){
printf("%d %d",f->coef,f->expon);
}
f=f->next;
count++;
}
}
}
void qiudao(Polynomial &p1){
Polynomial f,g;
f=p1->next;
while(f){
f->coef=(f->coef)*(f->expon);
if(f->expon==1||f->expon==0){
f->expon=0;
}
else {f->expon--;}
f=f->next;
}
}
int main(){
Polynomial p1;
CreatePolyn(p1);
qiudao(p1);
print(p1);
return 0;
}
uj5u.com熱心網友回復:
OJ報錯如下:/1069/test5.in:Segmentation fault
輔助解釋:
Segmentation fault:段錯誤,檢查是否有陣列越界,指標例外,訪問到不應該訪問的記憶體區域
查了很多資料 但也不知道怎么改自己的錯誤在哪
uj5u.com熱心網友回復:
問題不少問題1 有記憶體泄漏(申請的記憶體最后沒釋放)
問題2 邏輯有問題,比如用戶一上來就輸入-1 -1,那么P只有頭節點,列印P的時候
f=P->next; 因為只有P是有效的,所以 P->next 是NULL, 即 f 是NULL
if(f->expon==0) {printf("0");} //所以這里 f->expon 就會報非法記憶體訪問錯誤
問題3 if(count!=0) {printf(" ");} 邏輯控制不對, count++ 應該放到 if(f->coef!=0) 里,因為如果第一個節點沒滿足if,也就是第一個節點沒列印,cout++也被執行了,那么下一個節點的if(count!=0) {printf(" ");}就會輸出,造成第一個有效節點列印的前面有空格。
問題4 if(f->expon==1||f->expon==0){ 有問題 f->expon==0是常數,求導結果為0,而f->expon==1是1次冪,求導結果變為常數,所以兩者的情況要分開處理,而不是合在一起把指數變為0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/73297.html
標籤:C++ 語言
上一篇:sumo
