1010 一元多項式求導

// ---------------------------------------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++參考答案,大家可以去看一看,提高一下姿勢水平,理解一下機智聰慧


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章