设为首页 加入收藏

TOP

C算法与数据结构-线性表的应用,多项式求和---ShinePans(二)
2015-01-22 21:34:24 来源: 作者: 【 】 浏览:126
Tags:算法 数据结构 线性 应用 多项 求和 ---ShinePans
= NULL) { if (p->next != NULL) printf("%0.1f*x^%d + ", p->A, p->m); else printf("%0.1f*x^%d;", p->A, p->m); p = p->next; } printf("\n"); } /** *Operation: 将输入的无序多项式链表排序 *Precondition:无序多项式链表 *Postcondition:递增顺序的多项式链表 */ void PolySort(LNode *plist) { LNode *pa = plist->next, *pb = pa->next; LNode *temp = (LNode*)malloc(sizeof(LNode)); int length = GetLength(plist); int i; for (i = 0; i m > pb->m) { temp->A = pa->A; temp->m = pa->m; pa->A = pb->A; pa->m = pb->m; pb->A = temp->A; pb->m = temp->m; } pa = pa->next; pb = pa->next; } pa = plist->next; pb = pa->next; //这两句用于将pa,pb重新指向头节点 } } /** *Operation: 将输入的多项式中的指数相同项合并(合并同类项) *Precondition:有序多项式链表 *Postcondition:无同类项的有序多项式链表 */ void PolyMerge(LNode *plist) { LNode *prev, *current; int l = GetLength(plist); int i; prev = plist->next; current = prev->next; for (i = 0; i m == current->m) { prev->A += current->A; // why " prev->coef += current->coef " is wrong? prev->next = current->next; free(current); current = prev->next; continue; //! without this sentence ,the function will be wrong and report an problem } prev = prev->next; current = prev->next; } if (current) { prev = plist->next; current = prev->next; } } } /* //合并同类项 void UnitePoly(LNode *h)//合并同类项 { LNode *p1,*p2,*q1,*q2,*temp; q1=h; p1=q1->next; while(p1!=NULL) { p2=p1->next; q2=p1; while(p2!=NULL) { if(p1->expn==p2->expn) { p1->coef=p1->coef+p2->coef; if(p1->coef==0) { temp=p2; q2->next=p2->next; free(temp); temp=p1; q1->next=p1->next; p1=q1; free(temp); break; } else { temp=p2; q2->next=p2->next; p2=p2->next; free(temp); } } else { q2=p2; p2=p2->next; } } q1=p1; p1=p1->next; } } */ /** *求链表长度 */ int GetLength(LNode *plist) { LNode *p = plist; int lenght = 0; p = p->next; //跳过节点 while (p) { lenght++; p = p->next; } return lenght; //return lenght-1; //若没跳过头结点则返回值减一 } /** *Operation: 求两多项式乘积 *Precondition: *Postcondition: */ LinkList PolyMultiply(LNode *plist1, LNode *plist2) { LNode *pa, *pb; LNode *result = (LNode*)malloc(sizeof(LNode)); LNode *r = result; // 不能少!否则result所指不是头指针 pa = plist1->next; pb = plist2->next; while (pa) { while (pb) { LNode *current = (LNode*)malloc(sizeof(LNode)); current->A= pa->m * pb->A; //系数相乘 current->m = pa->m + pb->m; //指数相加 r->next = current; current->next = NULL; r = r->next; pb = pb->next; } pa = pa->next; pb = plist2->next; //pb重新指向头结点 } PolyMerge(result); return result; } /** *Operation: Computing the value of the polynomia *Precondition: Ordered Polynomial Linklist *Postcondition: The value of the polynomial */ float Hornoreva luate(LNode *plist, float x) { //int max = GetMaxExpn(plist) + 10; int n = 0; int i; float result = 0; //float Poly[max]; //VC6 sidn't support VLA float Poly[20]; LNode *p = plist->next; memset(Poly, 0, sizeof(Poly)); while (p) { if (p->m == n) { Poly[n++] = p->A; p = p->next; } else Poly[n++] = 0; } //Transform linklist to array to store the polynomial /*for(i=0;i 0; i--) //循环次数及下标关系千万不能错! { result = result*x + Poly[i - 1]; //printf("[%d %0.2f] ",i,result); //调试时输出中间变量方便调试 } return result; } /** *Operation: *Precondition: *Postcondition: */ int GetMaxExpn(LNode *plist) { LNode *p = plist->next; int max = p->m; while (p) { if (p->m > max) max = p->m; p = p->next; } return max; }
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言基础知识之综合案例(1) 下一篇邻接矩阵有向图(一)之 C语言详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: