日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1.多项式乘法实现

發布時間:2024/5/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.多项式乘法实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于稀疏多項式,采用數組存儲效率低下,因此考慮采用鏈表結構,節點包括系數,指數,next指針三個域。多項式的運算中,主要要考慮的是同類項合并的問題,這實際是一個數組元素去重的問題(合并冪相同的節點),因此可以采用先排序(快排平均O(Nlog(N))),后遍歷(O(N))的方式完成。總時間O(nlog(n))。

#include <stdio.h> #include <stdlib.h>typedef struct node {int coef;int exponent;struct node* next; }node;typedef struct List {node* next; }List;//打印多項式 void print_poly(List* poly) {node* p = poly->next;while (p != NULL){printf("%d*x^%d + ", p->coef,p->exponent);p = p->next;}printf("\n"); }//創建空表 List* make_empty() {List* list = (List*)malloc(sizeof(List));list->next = NULL;return list; }//在鏈表p節點后插入一個節點 void insert_node(List* list, node* p,int coef,int exponent) {if (list == NULL)return;node* p_new = (node*)malloc(sizeof(node));p_new->coef = coef;p_new->exponent = exponent;if (p == NULL)//在頭部插入{p_new->next = list->next;list->next = p_new; }else{p_new->next = p->next;p->next = p_new;} }//獲取鏈表長度 int length(List* list) {int len = 0;node* pCur = list->next;while (pCur != NULL){++len;}return len; }//獲取尾部節點 node* last_node(List* list) {node* p_node = list->next;while (p_node->next != NULL){p_node = p_node->next;}return p_node; } //交換兩節點內容 void swap_node(node* n1,node* n2) {int tmp_coef = n1->coef;int tmp_exponent = n1->exponent;n1->coef = n2->coef;n1->exponent = n2->exponent;n2->coef = tmp_coef;n2->exponent = tmp_exponent; } //快速排序的分割,隨機選取一個基準,把小于它的放到前面,大于的放到后面 node* partition(node* start, node* end) {//取第一個數作為基準數,這其實有問題,當為有序數組時速度很慢,應當選(start+end)/2位置的數,保證一定的隨機性node* p = start;node* q = p->next; //q比p初始快一步node* reference = start; //基準//從start開始向后進行一次遍歷(單鏈表無法從后向前)while (/*q != NULL &&*/ q != end->next){if (q->exponent < reference->exponent){p = p->next; //p永遠指向的是當前已遍歷過且比基準數小的最后一個數swap_node(p, q);}q = q->next;}swap_node(p, reference); //最后將位于頭部的基準與p交換,完成當前段的分割return p; }void quick_sort(node* start,node* end) {if (start == end || start == NULL || end == NULL) //這個停止條件要注意必須保證start和end非空{return;}node* mid = partition(start, end);quick_sort(start, mid);quick_sort(mid->next, end); } //鏈表多項式的排序,同時合并指數相同的項 void sort_list(List* list) {if ((list->next == NULL) || (list->next->next == NULL)){return;}node* start = list->next;node* end = last_node(list);quick_sort(start, end); }//多項式乘法返回一個新多項式鏈表 List* mult_polynomial(List* list_in1, List* list_in2) {//先準備好新的多項式鏈表的大小List* prod = make_empty();node* p_node_in1 = list_in1->next;node* p_node_in2 = list_in2->next;int prod_exponent = 0;int prod_coef = 0;while (p_node_in1 != NULL){p_node_in2 = list_in2->next; //這里記住要及時返回while (p_node_in2 != NULL){prod_coef = p_node_in1->coef * p_node_in2->coef;prod_exponent = p_node_in1->exponent + p_node_in2->exponent;insert_node(prod, NULL, prod_coef, prod_exponent); //每次都在頭部插入p_node_in2 = p_node_in2->next;}p_node_in1 = p_node_in1->next;}//鏈表排序sort_list(prod);//合并同類項node* pCur = prod->next;node* pDelete = NULL;int i = 0;while (pCur->next != NULL){if (pCur->exponent == pCur->next->exponent){pCur->coef += pCur->next->coef;//刪除多余節點pDelete = pCur->next;pCur->next = pDelete->next;free(pDelete);pDelete = NULL;continue; //這個很關鍵,因為這里的if中修改了節點的next的指向,因此pCur就不能進行步進,而應當停留原地}pCur = pCur->next;}return prod; }int main() {List* poly1 = (List*)malloc(sizeof(List));List* poly2 = (List*)malloc(sizeof(List));node* x1 = (node*)malloc(sizeof(node));x1->coef = 3; x1->exponent = 7; //3x^3node* x2 = (node*)malloc(sizeof(node));x2->coef = 5; x2->exponent = 12; //5x^1node* x3 = (node*)malloc(sizeof(node));x3->coef = 2; x3->exponent = 15; //2x^6node* x4 = (node*)malloc(sizeof(node));x4->coef = 9; x4->exponent = 6; //9x^6x1->next = x2;x2->next = x3;x3->next = x4;x4->next = NULL;poly1->next = x1;node* y1 = (node*)malloc(sizeof(node));y1->coef = 4; y1->exponent = 7; //4x^2node* y2 = (node*)malloc(sizeof(node));y2->coef = 1; y2->exponent = 6; //1x^5node* y3 = (node*)malloc(sizeof(node));y3->coef = 3; y3->exponent = 12; //3x^4node* y4 = (node*)malloc(sizeof(node));y4->coef = 7; y4->exponent = 5; //7x^5y1->next = y2; y2->next = y3; y3->next = y4;y4->next = NULL;poly2->next = y1;sort_list(poly1);sort_list(poly2);print_poly(poly1);print_poly(poly2);List* prod = mult_polynomial(poly1, poly2);print_poly(prod);return 0; }

總結

以上是生活随笔為你收集整理的1.多项式乘法实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。