// ---------------------------------------1010-------------------------------------------
// 設計函數求一元多項式的導數。
//
// 輸入格式:以指數遞降方式輸入多項式非零項係數和指數(絕對值均爲不超過1000的整數)。數字間以空格分隔。
//
// 輸出格式:以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。注意“零多項式”的指數和係數都是0,但是表示爲“0 0”。
// 輸入樣例:3 4 - 5 2 6 1 - 2 0
//
// 輸出樣例:12 3 - 10 1 6 0
#include <stdio.h>
#include <malloc.h>
typedef struct polynode{
int coe; // 係數
int exp; // 指數
struct polynode * next; // 單鏈表指針
}POLYNODE, *POLY;
void InsertNode(POLYNODE * pos, int coe, int exp); // 在指針pos後面插入一個結點
void DeleteNode(POLYNODE * pos); // 刪除pos後面的結點
void DestoryList(POLY H); // 銷燬鏈表
int main(void)
{
// 定義一個多項式,實質爲POLYNODE單鏈表的頭結點指針,頭結點不包含有效信息
POLY poly = (POLYNODE *)malloc(sizeof(POLYNODE));
poly->coe = 0;
poly->exp = 0;
poly->next = NULL;
POLYNODE * p = poly; // 輔助指針,用以遍歷單鏈表
int coe, exp; // 用以暫存用戶輸入,以每兩個數字爲基本單位來構造多項式
while (1)
{
scanf("%d %d", &coe, &exp); // 以兩個數字爲一組,獲取用戶輸入
InsertNode(p, coe, exp); // 插入新項
p = p->next; // 建立鏈表過程中,指針始終指向鏈表的最後一個結點
if (getchar() == '\n')
break; // 用戶輸入處理結束,至此,單鏈表多項式建立完成,跳出循環
}
POLYNODE * q = poly; // 另一輔助指針,協助完成刪除操作
p = q->next; // p指針始終指向當前求導結點,q指針指向其前驅
while (p != NULL) // 求導循環
{
// 如果某一項的指數或係數爲0,則說明該項爲0項或常數項,求導後爲0,刪除之
if (p->coe == 0 || p->exp == 0)
{
DeleteNode(q);
p = q->next;
}
else
{
p->coe = p->coe * p->exp;
p->exp--;
p = p->next;
q = q->next;
}
}
p = poly->next; // p指針指向求導後多項式的第一個結點
if (p == NULL) // 這是本道題的一個坑,題意沒有明確說明的一個坑
printf("0 0");
else
{
while (p != NULL) // 進行輸出遍歷
{
printf("%d %d", p->coe, p->exp);
if (p->next != NULL)// 若p不是最後一個結點,則應該輸出一個空格
printf(" ");
p = p->next;
}
}
DestoryList(poly);
return 0;
}
void InsertNode(POLYNODE * pos, int coe, int exp)
{
POLYNODE * newnode = (POLYNODE *)malloc(sizeof(POLYNODE));
newnode->coe = coe;
newnode->exp = exp;
newnode->next = pos->next;
pos->next = newnode;
}
void DeleteNode(POLYNODE * pos)
{
POLYNODE * temp = pos->next;
pos->next = pos->next->next;
free(temp);
}
void DestoryList(POLY H)
{
POLYNODE * p;
p = H;
while(H)
{
H = H->next;
free(p);
p = H;
}
}
// 這個題有兩點要說
// 1:用單鏈表的解法實際上是很笨拙的,代碼量是別人的參考答案的4倍,但是鑑於我寫的代碼還少,看到多項式第一反應就是單鏈表,原諒我吧
// 2:本題有一個坑,就是,如果整個多項式總的求導結果爲0,那麼要輸出“0 0”
// 網上關於這個題有20行的C++參考答案,大家可以去看一看,提高一下姿勢水平,理解一下機智聰慧
1010 一元多項式求導
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.