1010 一元多项式求导

来源:互联网 发布:microsoftword mac 编辑:程序博客网 时间:2024/05/05 17:39
// ---------------------------------------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++参考答案,大家可以去看一看,提高一下姿势水平,理解一下机智聪慧


0 0