數據結構-線性表的應用

目錄

  • 前言
  • 一、有序表的合并
    • 1.1 順序表實現
    • 1.2 單鏈表實現
  • 二、稀疏多項式的相加和相乘
    • 2.1 稀疏多項式的相加
    • 2.2 稀疏多項式的相乘
  • 總結

前言

本篇文章介紹線性表的應用,分別使用順序表和單鏈表實現有序表的合并,最后介紹如何使用單鏈表實現兩個稀疏多項式的相加和相乘。

一、有序表的合并

已知線性表La和Lb的數據元素按值非遞減有序排列,現要求將La和Lb合并為一個新的線性表Lc,且Lc中的數據元素仍按值非遞減有序排序。
非遞減指可以有相同的值出現在同一個線性表中
L a = ( a , b , c ) La=(a,b,c) La=(a,b,c)
L b = ( c , d , e , f ) Lb=(c,d,e,f) Lb=(c,d,e,f)
L a La La L b Lb Lb合并后
L c = ( a , b , c , c , d , e , f ) Lc=(a,b,c,c,d,e,f) Lc=(a,b,c,c,d,e,f)

1.1 順序表實現

算法步驟

  1. 創建一個空表Lc
  2. 依次從La或Lb中摘取元素值較小的結點插入到Lc表后,直至其中一個表變為空為止
  3. 繼續將La或Lb其中一個表的剩余結點插圖到Lc表的最后

代碼實現如下

//定義返回值狀態碼
#define SUCCESS 1
#define ERROR   0//這里假設元素的數據類型為char
typedef char ElemType;//定義一個線性表
struct SeqList {int MAXNUM;			//線性表中最大元素的個數int n;				//線性表中實際的元素個數,n <= MAXNUMElemType* element;	//存放線性表元素,element[0],element[1]...element[n-1]
};//定義一個SeqList的指針類型
typedef struct SeqList* PSeqList;
//合并兩個有序表
void mergeList_seq(PSeqList La, PSeqList Lb, PSeqList Lc)
{ElemType* pa = La->element;ElemType* pb = Lb->element;  //指針pa和pb分別指向兩個表的第一個元素Lc->n = La->n + Lb->n;Lc->MAXNUM = Lc->n;Lc->element = (ElemType*)malloc(sizeof(Lc->n)); //為合并的新表分配一個數組空間if (NULL == Lc->element){printf("malloc fail!\n");exit(ERROR);}ElemType* pc = Lc->element;   //指針pc指向Lc表的第一個元素ElemType* pa_last = La->element + (La->n - 1); //指針pa_last指向La表的最后一個元素ElemType* pb_last = Lb->element + (Lb->n - 1); //指針pb_last指向Lb表的最后一個元素while (pa <= pa_last && pb <= pb_last){if (*pa <= *pb)*pc++ = *pa++;else*pc++ = *pb++;}while (pa <= pa_last) *pc++ = *pa++; //Lb表到達表尾,將La表中剩余元素加入Lcwhile (pb <= pb_last) *pc++ = *pb++; //La表到達表尾,將Lb表中剩余元素加入Lc
}

1.2 單鏈表實現

為了方便使用,選擇帶頭結點的單鏈表

算法步驟

  1. pa和pb指針分別指向La和Lb的首元結點
  2. pc指向La的頭結點,用La的頭結點作為Lc的頭結點
  3. 依次從La或Lb中摘取元素值較小的結點插入到Lc表后,直至其中一個表變為空為止
  4. 繼續將La或Lb其中一個表的剩余結點插圖到Lc表的最后

代碼實現如下

//假設數據元素類型為char
typedef char ElemType;//定義結點類型
struct Node;				  	
typedef struct Node* PNode;   //假設作為結點指針類型
struct Node {ElemType data;   //數據域PNode next;		//指針域
};typedef struct Node* LinkList;  //假設作為單鏈表類型//合并兩個有序表
//帶頭結點
void mergeList_link(LinkList* La, LinkList* Lb, LinkList* Lc)
{PNode pa = (*La)->next;PNode pb = (*Lb)->next;PNode pc = *La;*Lc = *La;      //用La的頭結點作為Lc的頭結點while (pa && pb){if (pa->data <= pb->data){pc->next = pa;pc = pa;pa = pa->next;}else{pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb;  //插入剩余元素free(*Lb);				//釋放Lb的頭結點*Lb = NULL;
}

二、稀疏多項式的相加和相乘

假設有兩個多項式
f 1 ( x ) = 7 + 3 x + 9 x 8 + 5 x 17 f_1(x)=7+3x+9x^8+5x^{17} f1?(x)=7+3x+9x8+5x17
f 2 ( x ) = 8 x + 22 x 7 ? 9 x 8 f_2(x)=8x+22x^7-9x^8 f2?(x)=8x+22x7?9x8
多項式的通項公式為
P n ( x ) = p 1 x e 1 + p 2 x e 2 + ? + p m x e m P_n(x)=p_1x^{e_1}+p_2x^{e_2}+\cdots+p_mx^{e_m} Pn?(x)=p1?xe1?+p2?xe2?+?+pm?xem?
利用線性表P表示,則
線性表 P = ( ( p 1 , e 1 ) , ( p 2 , e 2 ) , ? , ( p m , e m ) ) 線性表P=((p_1,e_1),(p_2,e_2),\cdots,(p_m,e_m)) 線性表P=((p1?,e1?),(p2?,e2?),?,(pm?,em?))
f 1 ( x ) 和 f 2 ( x ) 分別用線性表 A 和 B 表示 f_1(x)和f_2(x)分別用線性表A和B表示 f1?(x)f2?(x)分別用線性表AB表示
線性表 A = ( ( 7 , 0 ) , ( 3 , 1 ) , ( 9 , 8 ) , ( 5 , 17 ) ) 線性表A=((7,0),(3,1),(9,8),(5,17)) 線性表A=((7,0),(3,1),(9,8),(5,17))
線性表 B = ( ( 8 , 1 ) , ( 22 , 7 ) , ( ? 9 , 8 ) ) 線性表B=((8,1),(22,7),(-9,8)) 線性表B=((8,1),(22,7),(?9,8))
假設使用順序表實現多項式的相加

算法步驟

  1. 創建一個新數組c
  2. 分別從頭遍歷比較a和b的每一項
    指數相同,對應系數相加,若其和為零,則比較兩個表的下一項,若其和不為零,則在c中增加一個新項
    指數不相同,則將指數比較小的項復制到c中
  3. 一個多項式遍歷完畢時,將另一個剩余項依次復制到c中

那么,數組c的大小如何確定?由于無法確定數組c的大小,所以這里不使用順序表實現,而是用單鏈表實現。
定義多項式的結點及其結構

//定義多項式結點
struct PolyNode
{float coef; //系數int   expn; //指數struct PolyNode* next;
};
//定義多項式結點指針類型
typedef struct PolyNode* PPolyNode;
//定義多項式類型
typedef struct PolyNode* PolyLinkList;

2.1 稀疏多項式的相加

算法步驟:

  1. 指針p1和p2初始化,分別指向Pa和Pb的首元結點
  2. p3指向和多項式的當前結點,初值為Pa的頭結點
  3. 當指針p1和p2均為到達表尾時,則循環比較p1和p2所指結點的指數值
  4. p1->expn 與 p2->expn分3種情況:
    當p1->expn == p2->expn是,則將兩個結點中的系數相加
    若和不為零,則修改p1所指結點的系數值,同時刪除p2所指結點
    若和為零,則刪除p1和p2所指結點
    當p1->expn < p2->expn時,則取p1所指結點插入到和多項式鏈表中
    當p1->expn > p2->expn時,則取p2所指結點插入到和多項式鏈表中
  5. 將非空表的剩余結點插入到p3所指結點的后面
  6. 釋放Pb的頭結點

代碼實現如下

void poly_add(PolyLinkList* Pa, PolyLinkList* Pb, PolyLinkList* Pc)
{PPolyNode p1 = (*Pa)->next;    //指向Pa鏈表的首元結點PPolyNode p2 = (*Pb)->next;    //指向Pb鏈表的首元結點PPolyNode p3 = *Pa;			  //指向Pa的頭結點,作為和多項式鏈表	*Pc = *Pa;PPolyNode q = NULL;		     //指向要被刪除的結點		while (p1 && p2){if (p1->expn == p2->expn)		//p1指數等于p2指數{float coef = p1->coef + p2->coef;if (coef)		//不為零{//修改p1所指結點的系數p1->coef = coef;p3->next = p1;p3 = p1;p1 = p1->next;}else          //為零{//刪除p1所指結點q = p1;p1 = p1->next;free(q);q = NULL;}//刪除p2所指結點q = p2;p2 = p2->next;free(q);q = NULL;}  else if (p1->expn < p2->expn)		//p1指數小于p2指數{//p1所指結點插入到和多項式鏈表p3->next = p1;p3 = p1;p1 = p1->next;}else                              //p1指數大于p2指數{//p2所指結點插入到和多項式鏈表p3->next = p2;p3 = p2;p2 = p2->next;}}p3->next = p1 ? p1 : p2;	//插入剩余數據元素free(*Pb);		//釋放Pb頭結點*Pb = NULL;
}

2.2 稀疏多項式的相乘

  1. 指針p1和p2初始化,分別指向Pa和Pb的首元結點
  2. 指針p3初始化,指向Pc的頭結點,初化始時,Pc只是一個空表
  3. 用Pa的第一項與Pb的每一項相乘,將每一項相乘結果插入到Pc中(有序)
  4. 從Pa的第二項開始與Pb的每一項相乘,將每一項結果插入到Pc中(插入后有序)
    在Pc尋找插入位置
    設coef = p1->coef * p2->coef ,expn = p1->expn + p2->expn,表示當前p1和p2所指項的相乘結果
    若p3->next->expn < expn,則p3 = p3->next,直到p3->next->expn > expn,分兩種情況
    若存在p3->next->expn > expn, 則新建一個結點插入到p3所指結點后
    若不存在p3->next->expn > expn,即p3->next == NULL時,則新建一個結點插入到p3所指結>點后
    若p3->next->expn == expn,分兩種情況
    若p3->next->coef + coef結果為零,則刪除p3->next所指結點
    若p3->next->coef + coef結果不為零,則修改p3->next所指結點的系數

代碼實現如下

//逐項插入法
void poly_mul(PolyLinkList* Pa, PolyLinkList* Pb, PolyLinkList* Pc)
{PPolyNode p1 = (*Pa)->next;PPolyNode p2 = (*Pb)->next;   //p1,p2分別指向Pa和Pb的首元結點PPolyNode p3 = *Pc;			  //p3分別指向Pc的頭結點	PPolyNode temp = NULL;		  //作為一個臨時的結點指針if (p1)//將p1的第一項乘以Pb的每一項{while (p2){PPolyNode newNode = (PPolyNode)malloc(sizeof(struct PolyNode));if (NULL == newNode){printf("malloc fail!\n");exit(ERROR);}newNode->coef = p1->coef * p2->coef;  //p1,p2所指結點的系數相乘newNode->expn = p1->expn + p2->expn; //p1,p2所指結點的指數相乘newNode->next = NULL;p3->next = newNode;p3 = newNode;p2 = p2->next;}}//從Pa的第二項開始與Pb的每一項相乘,將每一項結果插入到Pc,直到p1到達Pa的表尾p1 = p1->next;while (p1){p2 = (*Pb)->next;p3 = *Pc;while (p2){//在Pc尋找插入位置float coef = p1->coef * p2->coef;int   expn = p1->expn + p2->expn;while (p3->next && p3->next->expn < expn)p3 = p3->next;if (p3->next && p3->next->expn == expn)   //expn與p3->next->expn相同{if (p3->next->coef + coef)	//和不為零p3->next->coef += coef;else    //和為零{//刪除p3->next所指結點temp = p3->next;p3->next = temp->next;free(temp);temp = NULL;}}else   //p3->next->expn > expn 或p3->next == NULL{//在p3->next前插入一個新結點temp = (PPolyNode)malloc(sizeof(struct PolyNode));if (NULL == temp){printf("malloc fail!\n");destoryPoly(Pc);}temp->coef = coef;temp->expn = expn;temp->next = p3->next;p3->next = temp;p3 = p3->next;}p2 = p2->next;}p1 = p1->next;}
}

總結

完整代碼:https://gitee.com/PYSpring/data-structure/tree/master

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37950.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于springboot+vue+uniapp的超市售貨管理平臺

開發語言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

考研生活day2--王道課后習題2.3.1、2.3.2、2.3.3

2.3.1 題目描述&#xff1a; 這題和曾經做過的LeetCode203.移除元素一模一樣&#xff0c;所以我們就使用LeetCode進行書寫&#xff0c;題目鏈接203. 移除鏈表元素 - 力扣&#xff08;LeetCode&#xff09; 解題思路 大家的第一反應肯定是根據書上所學的書寫方法一樣書寫&…

【PB案例學習筆記】-26制作一個帶浮動圖標的工具欄

寫在前面 這是PB案例學習筆記系列文章的第26篇&#xff0c;該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習&#xff0c;提高編程技巧&#xff0c;以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼&#xff0c;小凡都上傳到了gite…

爬蟲cookie是什么意思

“爬蟲 cookie”指的是網絡爬蟲在訪問網站時所使用的cookie&#xff0c;網絡爬蟲是一種自動化程序&#xff0c;用于在互聯網上收集信息并進行索引&#xff0c;這些信息可以用于搜索引擎、數據分析或其他目的。 本教程操作系統&#xff1a;Windows10系統、Dell G3電腦。 “爬蟲…

51-1 內網信息收集 - 內網資源探測

導語 在內網滲透過程中,通常需要利用各種技術來探測內網資源,為后續的橫向滲透做準備。發現內網存活的主機及其詳細信息可以幫助確定攻擊方向和潛在的漏洞。 一、基于 ICMP 發現存活主機 ICMP(Internet Control Message Protocol,因特網控制消息協議)是 TCP/IP 協議簇的…

一段式、二段式和三段式狀態機的特點及適用情況:

在FPGA設計中,狀態機的選擇主要取決于具體應用場景和設計需求。 一段式狀態機: 優點: 結構簡單,易于理解和實現占用資源少時序邏輯簡單,延遲小 缺點: 組合邏輯復雜度高可能存在毛刺問題不易于大規模狀態機的設計 適用場景: 簡單的控制邏輯狀態數量較少的場合對時序要求較…

React+TS前臺項目實戰(二十二)-- 全局常用導出組件Export封裝

文章目錄 前言Export組件1. 功能分析2. 代碼詳細注釋3. 使用方式4. 效果展示 總結 前言 今天我們來封裝一個帶導出圖標的導出組件。 Export組件 1. 功能分析 通過傳入鏈接地址&#xff0c;規定要跳轉的導出頁面&#xff0c;或是直接通過鏈接導出數據 2. 代碼詳細注釋 // /c…

虛擬環境管理

虛擬環境 在使用 Python 時我們一般使用“pip install 第三方包名”來安裝第三方包&#xff0c;但是由于pip的特性&#xff0c;系統只能安裝每個包的一個版本。而在實際開發中&#xff0c;可能同時開發多個項目&#xff0c;如&#xff1a;上圖有三個項目&#xff1b;每個項目需…

django學習入門系列之第三點《BootSrap初了解》

文章目錄 初識BootStrap往期回顧 初識BootStrap BootSrap是什么&#xff1f; 是別人幫我們已寫好的CSS樣式&#xff0c;我們如果想要使用這個BootSrap&#xff1a; 下載BootStrap使用 在頁面上引入BootStrap編寫HTML時&#xff0c;按照BootStrap的規定來編寫 自定制 官網&…

【UE5.1】Chaos物理系統基礎——02 場系統的應用

目錄 步驟 一、運用臨時場&#xff08;外部張力&#xff09;破裂幾何體集 二、使用構造場固定幾何體集 步驟 在上一篇中&#xff08;【UE5.1】Chaos物理系統基礎——01 創建可被破壞的物體&#xff09;我們已經創建了可被破碎的幾何體集&#xff0c;在最后我們防止幾何體集…

微信小程序簡歷Demo

微信小程序簡歷Demo 使用介紹最后獲取源碼 bilibili視頻介紹 使用介紹 使用微信小程序實現的一個簡歷實現Demo 拖動馬里奧&#xff0c;到指定Name下方 向上頂就可以顯示對應的簡歷樣式 點擊頭像可撥打電話 點擊信息處可顯示當前位置 最后 這是一個簡單并且有趣的微信小程…

Renesas MCU使用SCI_I2C驅動OLED

目錄 概述 1 軟硬件 1.1 軟件版本信息 1.2 OLED屏幕 1.2.1 OLED簡介 1.2.2 SSD1306介紹 1.2.3 0.9寸OLED模塊介紹 2 FSP配置項目 2.1 配置項目參數 2.2 生成項目文件架構 3 代碼實現 3.1 I2C的庫函數 3.1.1 R_SCI_I2C_Open() 3.1.2 R_SCI_I2C_Read() 3.1.3 R_SCI_…

谷粒商城篇章10 -- P262-P291/P295-P310 -- 訂單服務(支付)【分布式高級篇七】

目錄 1 頁面環境搭建 1.1 靜態資源上傳到nginx 1.2 SwitchHosts增加配置 1.3 網關配置 1.4 訂單模塊基礎配置 1.4.1 引入 thymeleaf 依賴 1.4.2 application.yml配置 1.4.3 bootstrap.properties配置 1.4.4 開啟nacos注冊發現和遠程調用 1.5 修改各個頁面的靜態資源路…

windows電腦開發ios的p12證書申請流程

很多同學在做ios打包的時候&#xff0c;發現ios打包需要一個p12格式的證書和一個證書profile文件&#xff0c;那么ios開發就一定需要使用mac電腦來申請ios證書嗎&#xff1f;其實申請ios證書并不一定需要mac電腦&#xff0c;因為證書是一個通用的技術&#xff0c;使用普通的ssl…

Perl 語言開發(二):變量與數據類型

目錄 1. 變量的基本概念 1.1 標量變量 1.2 數組變量 1.3 哈希變量 2. 數據類型詳解 2.1 標量數據類型 2.1.1 數字 2.1.2 字符串 2.2 數組數據類型 2.2.1 數組操作 2.3 哈希數據類型 2.3.1 哈希操作 3. 變量的作用域與生存期 3.1 全局變量 3.2 局部變量 3.3 詞法…

JavaScript將參數傳遞給事件處理程序

本篇文件我們將實現導航欄中&#xff0c;選中時候&#xff0c;會將您選中的進行高亮顯示&#xff1b; ● 首先我們來獲取我們想要的HTML元素 const nav document.querySelector(.nav);● 接著我們來寫選中的高亮顯示 nav.addEventListener(mouseover, function (e) { //鼠…

主干網絡篇 | YOLOv5/v7 更換主干網絡之 ShuffleNetv2 | 高效CNN架構設計的實用指南

主干網絡篇 | YOLOv5/v7 更換主干網絡之 ShuffleNetv2 | 高效CNN架構設計的實用指南 1. 簡介 近年來&#xff0c;深度卷積神經網絡&#xff08;CNN&#xff09;在圖像識別、目標檢測等領域取得了巨大進展。然而&#xff0c;隨著模型復雜度的不斷提升&#xff0c;模型訓練和部…

申請一張含100個域名的證書-免費SSL證書

挑戰一下&#xff0c;申請一張包含100個域名的證書 首先&#xff0c;我們訪問來此加密網站&#xff0c;進入登錄頁面&#xff0c;輸入我的賬號密碼。 登錄后&#xff0c;咱們就可以開始申請證書&#xff0c;首先說一下&#xff0c;咱賬號是SVIP哦&#xff0c;只有SVIP才可以申…

記一次EasyExcel的錯誤使用導致的頻繁FullGC

記一次EasyExcel的錯誤使用導致的頻繁FullGC 一、背景描述二、場景復現三、原因分析四、解決方案五、思考復盤 一、背景描述 繁忙的校招結束了&#xff0c;美好的大學四年也結束了&#xff0c;作者也有10個月沒有更新了。拿到心儀的offer之后也開始了苦B的打工生活。 最近接到…

Python海量數據處理腳本大集合:pyWhat

pyWhat&#xff1a;精簡海聯數據&#xff0c;直達數據弱點要害- 精選真開源&#xff0c;釋放新價值。 概覽 pyWhat是Github社區上一款比較實用的開源Python腳本工具。它能夠快速提取信息中的 IP 地址、郵箱、信用卡、數字貨幣錢包地址、YouTube 視頻等內容。當你遇到了一串莫名…