Polyn CreatPolyn(Polyn head, int m) { head = (Polyn)malloc(sizeof(struct Polynomial));//将头指针指向建立的结构体 head->next = NULL; for (int i = 1; i <= m; i++) { Polyn p = (Polyn)malloc(sizeof(struct Polynomial));//新建节点p printf("请输入第%d项的系数与指数(中间用空格隔开):", i); scanf("%f%d", &p->coef, &p->expn); //新建立一个节点p,用来存储读入的系数coef和指数expn if (p->coef == 0) free(p); //将系数为0的节点释放掉 else { Polyn q1, q2; //q1和q2指针一前一后 q1 = head; q2 = head->next; while (q2 != NULL && p->expn < q2->expn) //p的指数小于q2的指数 ,将q1,q2两个指针后移 { q1 = q2; q2 = q2->next; } if (q2 != NULL && p->expn == q2->expn)//如果p和q2的指数相同,即 p->expn == q2->expn则进行两个节点的和并 { q2->coef += p->coef; //合并两项 if (q2->coef == 0) { q1->next = q2->next; free(q2); //将系数为0的节点释放掉 } free(p); //将节点p释放掉 } else { p->next = q2;//q1>p>q2,将p插入q1和q2之间 q1->next = p; } } } return head; }
时间: 2024-04-07 20:32:46 浏览: 132
这是一个建立多项式的函数,输入一个头指针 head 和一个整数 m,返回一个建立好的多项式。在函数中,首先新建一个头结点 head,然后循环 m 次,每次输入一个系数和指数,新建一个节点 p,存储系数和指数,如果系数为 0,则释放节点 p,否则,将节点 p 插入到多项式中,在插入的过程中,将节点 p 与多项式中的节点进行比较,如果指数相同,则将两个节点的系数相加,并将其中系数为 0 的节点释放掉,如果指数不同,则将节点 p 插入到多项式中。最后返回头指针 head。
相关问题
Polyn MultiplyPolyn(Polyn pa, Polyn pb) { //求解并建立多项式a*b,返回其头指针 Polyn hf; Polyn pf; Polyn qa = pa -> next; Polyn qb = pb -> next; hf = (Polyn)malloc(sizeof(struct Polynomial));//建立头结点 hf -> next = NULL; for(;qa;qa = qa->next) { for(qb = pb -> next;qb;qb = qb -> next) { pf = (Polyn)malloc(sizeof(struct Polynomial)); pf -> coef = qa -> coef * qb -> coef; pf -> expn = qa -> expn + qb -> expn; Insert(pf, hf);//调用Insert函数以合并指数相同的项 } } return hf; }从时间、空间复杂度上分析算法效率,或者从其它算法主要评价指标进行分析,
该算法的时间复杂度为O(n^2),其中n为多项式的项数。这是因为算法使用了两个循环嵌套,每次都需要遍历整个多项式,因此总的时间复杂度为n*n=n^2。
空间复杂度方面,算法需要额外的空间来存储结果多项式,以及每次循环中需要动态分配的节点。每个节点需要存储系数和指数,因此总的空间复杂度也为O(n^2)。
综上所述,该算法的效率不是很高,特别是在对大规模多项式进行运算时,会出现较明显的时间和空间瓶颈。如果需要处理大规模多项式,可以考虑使用更高效的算法,如快速傅里叶变换(FFT)算法或者Karatsuba算法。
for (int i = 1; i <= m; i++) { Polyn p = (Polyn)malloc(sizeof(struct Polynomial));//新建节点p printf("请输入第%d项的系数与指数(中间用空格隔开):", i); scanf("%f%d", &p->coef, &p->expn); //新建立一个节点p,用来存储读入的系数coef和指数expn if (p->coef == 0) free(p); //将系数为0的节点释放掉 else { Polyn q1, q2; //q1和q2指针一前一后 q1 = head; q2 = head->next; while (q2 != NULL && p->expn < q2->expn) //p的指数小于q2的指数 ,将q1,q2两个指针后移 { q1 = q2; q2 = q2->next; } if (q2 != NULL && p->expn == q2->expn)//如果p和q2的指数相同,即 p->expn == q2->expn则进行两个节点的和并 { q2->coef += p->coef; //合并两项 if (q2->coef == 0) { q1->next = q2->next; free(q2); //将系数为0的节点释放掉 } free(p); //将节点p释放掉 } else { p->next = q2;//q1>p>q2,将p插入q1和q2之间 q1->next = p; } } } return head; }
这是一个多项式相加的程序,通过输入多项式的系数和指数来新建一个节点p,并将p插入到多项式链表中。如果某个节点的系数为0,则将其释放掉。如果p和链表中的某一个节点指数相同,则将它们的系数相加并合并为一个节点,如果相加后的系数为0,则将该节点释放掉。如果p的指数在链表中的某两个节点之间,则将p插入到这两个节点之间。最后返回多项式链表的头节点head。
阅读全文