版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目:模式匹配中的KMP算法的實(shí)現(xiàn)專業(yè):計(jì)算機(jī)科技院系:計(jì)算機(jī)學(xué)院姓名:xxxxxxxx學(xué)號(hào):xxxxxxx時(shí)間:2013年9月22日目錄TOC\o"1-2"\h\uHYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc9734"1需求分析 3HYPERLINK"C:\\DocumentsandSettings\\Administrat(yī)or\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc22288"1.1問(wèn)題描述?3HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc19939"1.2基本要求?3HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc14344"2概要設(shè)計(jì)?3HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc2157"3詳細(xì)設(shè)計(jì) 5HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc15028"3.1為主串和模式串賦值 5HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc2475"3.2利用Output()函數(shù)輸出串。?PAGEREF_Toc2475-5HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc15056"3.3求各串的長(zhǎng)度 6HYPERLINK"C:\\DocumentsandSettings\\Administrat(yī)or\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc7928"3.4求模式串的模式值next[]函數(shù)?6HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"4測(cè)試與分析?7HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"5總結(jié) 9HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc19342"6附錄:源程序清單 9HYPERLINK"C:\\DocumentsandSettings\\Administrator\\桌面\\畢業(yè)設(shè)計(jì)\\參考文獻(xiàn)\\數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告.doc"\l"_Toc20886"參考文獻(xiàn) 131需求分析1.1問(wèn)題描述KMP算法是對(duì)一般模式匹配算法的改進(jìn),由D.E.Knuth與V.R.Pratt和J.H.Morris同時(shí)發(fā)現(xiàn)的因此人們稱它為克努特-莫里斯-莫拉特操作(簡(jiǎn)稱為KMP算法)。對(duì)于一般的模式匹配算法:分別利用兩個(gè)指針i和j指示主串S和T中的當(dāng)前正待比較的字符位置。算法的基本思想是:從主串的S的第POS個(gè)字符開(kāi)始起和模式的第一個(gè)字符比較之,如相等,則繼續(xù)逐個(gè)比較后續(xù)字符;否則從主串的下一個(gè)字符起再重新和模式的字符比較之。以此類推,直到模式T中的每個(gè)字符依次和主串S中的一個(gè)連續(xù)字符序列相等,則稱匹配成功,則函數(shù)值為和模式T中的第一個(gè)字符相等的字符在主串S中的序號(hào),否則稱匹配不成功,函數(shù)值為0.而對(duì)于模式匹配的KMP算法可以在O(n+m)的時(shí)間數(shù)量級(jí)上完成串的模式匹配操作。其改進(jìn)過(guò)程在于:每當(dāng)一趟匹配過(guò)程出現(xiàn)字符比較不相等時(shí),不需回溯i指針,而是利用已經(jīng)得到的部分匹配的結(jié)果將模式串向右滑動(dòng)一段盡可能遠(yuǎn)的距離后,繼續(xù)進(jìn)行比較?;瑒?dòng)的這一段距離我們將會(huì)用到函數(shù)Next[],KMP算法的最大特點(diǎn)是指示主串的指針不須回溯,整個(gè)匹配過(guò)程中,對(duì)主串僅需從頭到尾掃描一遍,這對(duì)處理從外設(shè)輸入的龐大文件很有效,可以邊度入邊匹配,而無(wú)需回頭重讀。開(kāi)發(fā)工具:C語(yǔ)言1.2基本要求用C編寫一個(gè)程序?qū)崿F(xiàn)模式匹配的KMP算法。要求對(duì)于任何輸入串A,實(shí)現(xiàn)算法求next函數(shù)值;利用next函數(shù)值,實(shí)現(xiàn)串A在串B中的定位;若未搜索到,就返回0。首先要從鍵盤輸入主串B和模式串A,并采用用鏈?zhǔn)酱鎯?chǔ),再根據(jù)Next()函數(shù)求模式串的Next值,利用KMP算法進(jìn)行匹配,再用輸出函數(shù)輸出結(jié)果!2概要設(shè)計(jì)對(duì)該kmp算法,定義的抽象數(shù)據(jù)類型如下:ADTString{數(shù)據(jù)對(duì)象:D={ai|ai∈CharacterSet,i=1,2,3,…,n,n≥0}數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}基本操作:StrAssign(&T,chars)初始條件:chars是字符串常量。操作結(jié)果:生成一個(gè)其值等于chars的串T。StrCopy(S)初始條件:串S存在。操作結(jié)果:若S為空串,則返回TRUE,否則返回FALSE。StrLength(S)初始條件:串S存在。操作結(jié)果:返回S元素的個(gè)數(shù),成為串的長(zhǎng)度。Index(S,T,pos)初始條件:串S和T存在,T是非空串,1≤pos≤StrLength(S).操作結(jié)果:若主串S中存在和串T相同的子串,則返回他在主串S中的第pos個(gè)字符之后第一次出現(xiàn)的位置;否則函數(shù)值為0。DestoryString(&S)初始條件:串S存在。操作結(jié)果:串S被銷毀。}ADTString該算法是對(duì)串進(jìn)行操作,對(duì)串的存儲(chǔ)結(jié)構(gòu)用線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)表示:typedefstructLString{chardata;structLString*next;}LString;該算法分為三個(gè)模塊:第一模塊[Input()函數(shù)](利用該函數(shù)輸入主串和模式串);第二模塊[Output()函數(shù)利用該函數(shù)輸出串)。第三模塊[Length()](利用該函數(shù)求各串的長(zhǎng)度);第四模塊[Get_next()函數(shù)](利用該函數(shù)求出模式串的next函數(shù)值);第五模塊[Index_KMP()函數(shù)](利用該函數(shù)進(jìn)行主串和模式串之間的匹配);各個(gè)模塊之間的調(diào)用關(guān)系如下圖所示:圖2.1是對(duì)整個(gè)函數(shù)的流程圖。開(kāi)始開(kāi)始輸入A,B,pos調(diào)用Input函數(shù)存儲(chǔ)A,B調(diào)用Get_next函數(shù)對(duì)A,B執(zhí)行Length函數(shù)調(diào)用Index_KMP函數(shù),并用Loc接收函數(shù)值調(diào)用Output輸出A,B,輸出LOC,Next結(jié)束整個(gè)函數(shù)的流程圖3詳細(xì)設(shè)計(jì):3.1為主串和模式串賦值利用Input()函數(shù)輸入主串和模式串Input()函數(shù)偽代碼:LString*Input(){ //通過(guò)標(biāo)準(zhǔn)輸入設(shè)備輸入串以鏈?zhǔn)酱鎯?chǔ)存儲(chǔ)數(shù)據(jù)并返回鏈的頭指針。?LString*head,*tail,*p;intcurlen=0;charch;head=(LString*)malloc(sizeof(LString));//建立頭指針。if(!head){printf("存儲(chǔ)分配失敗");exit(0);}//存儲(chǔ)分配失敗。scanf("%c",&ch);while(ch!='\n'){p=(LString*)malloc(sizeof(LString));if(!p){ printf("存儲(chǔ)分配失敗");exit(0);}//存儲(chǔ)分配失敗。p->dat(yī)a=ch;p->next=NULL;if(curlen==0)head->next=p;else{tail->next=p;}tail=p;++curlen;head->data=curlen;//用頭指針存儲(chǔ)串的長(zhǎng)度scanf("%c",&ch);}returnhead;}//Inpute3.2利用Output()函數(shù)輸出串。voidOutput(LString*T){ //在標(biāo)準(zhǔn)輸出設(shè)備上輸出串T。LString*p;p=T->next;while(p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}//Output3.3求各串的長(zhǎng)度Length()函數(shù)求的各串的長(zhǎng)度,利用一個(gè)while循環(huán)語(yǔ)句,為后面的函數(shù)做好準(zhǔn)備工作;intLength(LString*T){ //求串T的長(zhǎng)度并返回其值。?intn=0;?LString*head;?head=T; if(head)n=head->data;returnn;}//Length3.4求模式串的模式值next[]函數(shù)用《模式匹配的KMP算法》當(dāng)主串和模式串匹配不相等是,模式串應(yīng)向右移動(dòng)一段距離,此時(shí)我們需要得到模式串的next函數(shù)值。如何求next函數(shù),next函數(shù)值僅取決于模式本身而和主串無(wú)關(guān)。我們可以從分析next函數(shù)的定義出發(fā)用遞推的方法求得next函數(shù)值。由定義知:next[1]=0設(shè)next[j]=k,即有:"t1t2…tk-1"="tj-k+1tj-k+2…tj-1next[j+1]=?可能有兩種情況:一種情況:若tk=tj則表明在模式串中這就是說(shuō)next[j+1]=k+1,即next[j+1]=next[j]+1第二種情況:若tk≠tj則表明在模式串中t1t2…tk"≠"tj-k+1tj-k+2…tj"此時(shí)可把求next函數(shù)值的問(wèn)題看成是一個(gè)模式匹配問(wèn)題,整個(gè)模式串既是主串又是模式,而當(dāng)前在匹配的過(guò)程中,已有(4.6)式成立,則當(dāng)tk≠tj時(shí)應(yīng)將模式向右滑動(dòng),使得第next[k]個(gè)字符和“主串”中的第j個(gè)字符相比較。若next[k]=k′,且tk′=tj,則說(shuō)明在主串中第j+1個(gè)字符之前存在一個(gè)最大長(zhǎng)度為k′的子串,使得"t1t2…tk′"="tj-k′+1tj-k′+2…tj"此:next[j+1]=next[k]+1同理若tk′≠tj,則將模式繼續(xù)向右滑動(dòng)至使第next[k′]個(gè)字符和tj對(duì)齊,依此類推,直至tj和模式中的某個(gè)字符匹配成功或者不存在任何k′(1<k′<k<…<j)滿足,此時(shí)若t1≠tj+1,則有:next[j+1]=1否則若t1=tj+1,則有:next[j+1]=0綜上所述,求next函數(shù)值過(guò)程的偽碼算法如下:voidGet_next(SStringT,intnext[]){ //求模式串T的next函數(shù)并存入數(shù)組next。i=1;next[1]=0;j=0;while(i<t[0]){if(j==0||t[i]==t[j]){++i;++j;next[i]=j;}elsej=next[j];}}//Get_next3.5模式匹配KMP算法的實(shí)現(xiàn):KMP算法的思想:主串s,模式t希望某趟在si和tj匹配失敗后,指針i不回溯,模式t向右“滑動(dòng)”至某個(gè)位置上,使得tk對(duì)準(zhǔn)si繼續(xù)向右進(jìn)行。顯然,現(xiàn)在問(wèn)題的關(guān)鍵是串t“滑動(dòng)”到哪個(gè)位置上?不妨設(shè)位置為k,即si和tj匹配失敗后,指針i不動(dòng),模式t向右“滑動(dòng)”,使tk和si對(duì)準(zhǔn)繼續(xù)向右進(jìn)行比較,要滿足這一假設(shè),就要有如下關(guān)系成立:"t1t2…tk-1"="si-k+1si-k+2…si-1"(4.1)式左邊是tk前面的k-1個(gè)字符,右邊是si前面的k-1個(gè)字符。而本趟匹配失敗是在si和tj之處,已經(jīng)得到的部分匹配結(jié)果是:"t1t2…tj-1"="si-j+1si-j+2…si-1"(4.2)因?yàn)椋?lt;j,所以有:"tj-k+1tj-k+2…tj-1"="si-k+1si-k+2…si-1"(4.3)式左邊是tj前面的k-1個(gè)字符,右邊是si前面的k-1個(gè)字符,通過(guò)(4.1)和(4.3)得到關(guān)系:"t1t2…tk-1"="tj-k+1tj-k+2…tj-1"(4.4)結(jié)論:某趟在si和tj匹配失敗后,如果模式串中有滿足關(guān)系(4)的子串存在,即:模式中的前k-1個(gè)字符與模式中tj字符前面的k-1個(gè)字符相等時(shí),模式t就可以向右“滑動(dòng)”至使tk和si對(duì)準(zhǔn),繼續(xù)向右進(jìn)行比較即可。在求得模式的next函數(shù)之后,匹配可如下進(jìn)行:假設(shè)以指針i和j分別指示主串和模式中的比較字符,令i的初值為pos,j的初值為1。若在匹配過(guò)程中si≠tj,則i和j分別增1,若si≠tj匹配失敗后,則i不變,j退到next[j]位置再比較,若相等,則指針各自增1,否則j再退到下一個(gè)next值的位置,依此類推。直至下列兩種情況:一種是j退到某個(gè)next值時(shí)字符比較相等,則i和j分別增1繼續(xù)進(jìn)行匹配;另一種是j退到值為零(即模式的第一個(gè)字符失配),則此時(shí)i和j也要分別增1,表明從主串的下一個(gè)字符起和模式重新開(kāi)始匹配。KMP算法如下:intIndex_KMP(SStringS,SStringT,intpos,intnext[]){//利用模式串T的next函數(shù)求T在主串S中第pos個(gè)字符之后的位置的//KMP算法。其中,T非空。,1≤pos≤StrLength(S)。i=pos;j=1;while(i<=S[0]&&j<=T[0]){if(j==0||s[i]==t[j]){//繼續(xù)比較后繼字符++i;++j;}elsej=next[j];//模式串向右移動(dòng)}if(j>t[0])returni-t[0];//匹配成功elsereturn0;}//Index_KMP4測(cè)試與分析4.1若匹配成功:調(diào)試結(jié)果如下圖所示圖4.14.2若匹配不成功:調(diào)試結(jié)果如下所示圖4.25總結(jié)通過(guò)此次模式匹配中的KMP算法的實(shí)現(xiàn)的課設(shè),我認(rèn)識(shí)到自己在以前的課程學(xué)習(xí)中還有很多的不足。在課設(shè)中,我了解到各種算法對(duì)軟件設(shè)計(jì)的重要性,它能幫助程序設(shè)計(jì)者設(shè)計(jì)出更好的程序?yàn)槿藗兊娜粘I钐峁┝烁蟮膸椭1敬握n設(shè)在平時(shí)的字符的查找中發(fā)揮了重要作用。這次課設(shè)讓我對(duì)C語(yǔ)言又復(fù)習(xí)了一遍。6附錄:源程序清單#include<stdio.h>#include<string.h>#include<stdlib.h>typedefstructLString{ //串的鏈?zhǔn)酱鎯?chǔ)表示。?chardata; structLString*next;?}LString;LString*Input(){?//通過(guò)標(biāo)準(zhǔn)輸入設(shè)備輸入串以鏈?zhǔn)酱鎯?chǔ)存儲(chǔ)數(shù)據(jù)并返回鏈的頭指針。?LString*head,*tail,*p;intcurlen=0;charch;head=(LString*)malloc(sizeof(LString));//建立頭指針。if(!head){?printf("存儲(chǔ)分配失敗"); exit(0);}//存儲(chǔ)分配失敗。scanf("%c",&ch);while(ch!='\n'){p=(LString*)malloc(sizeof(LString));if(!p){printf("存儲(chǔ)分配失?。?;exit(0);}//存儲(chǔ)分配失敗。p->data=ch;p->next=NULL;if(curlen==0)head->next=p;else{tail->next=p;}tail=p;++curlen;head->data=curlen;//用頭指針存儲(chǔ)串的長(zhǎng)度scanf("%c",&ch);}returnhead;}//InputevoidOutput(LString*T){?//在標(biāo)準(zhǔn)輸出設(shè)備上輸出串T。LString*p;p=T->next;while(p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}//OutputintLength(LString*T){ //求串T的長(zhǎng)度并返回其值。 intn=0;?LString*head;?head=T;?if(head)n=head->dat(yī)a;returnn;}//LengthvoidGet_next(LString*T,intnext[]){?//求模式串T的next函數(shù)并存入數(shù)組next。inti=1;intj=0;intk;chart[100];LString*p;p=T;for(k=0;k<=Length(T);k++)//將串T的鏈?zhǔn)酱鎯?chǔ)轉(zhuǎn)換為順序存儲(chǔ)并存入數(shù)組t。{t[k]=p->data;p=p->next;}next[1]=0;while(i<t[0]){if(j==0||t[i]==t[j]){++i;++j;next[i]=j;}elsej=next[j];}next[i+1]='\n';}//Get_nextintIndex_KMP(LString*S,LString*T,intpos,intnext[]){//利用模式串T的next函數(shù)求T在主串S中第pos個(gè)字符之后的位置的//KMP算法。其中,T非空。,1≤pos≤StrLength(S)。inti=pos;intj=1;intk;LString*p,*q;chars[255],t[255];p=S;q=T;for(k=0;k<=Length(S);k++)//將串S的鏈?zhǔn)酱鎯?chǔ)轉(zhuǎn)換為順序存儲(chǔ){s[k]=p->data;p=p->next;}for(k=0;k<=Length(T);k++)//將串T的鏈?zhǔn)酱鎯?chǔ)轉(zhuǎn)換為順序存儲(chǔ){t[k]=q->data;q=q->next;}while(i<=Length(S)&&j<=Length(T)){if(j==0||s[i]==t[j]){//繼續(xù)比較后繼字符++i;++j;}elsej=next[j];//模式串向右移動(dòng)}if(j>t[0])returni-t[0];//匹配成功elsereturn0;}//Index_KMPvoidmain(){system("cls");system("color1f");system("modecon:cols=78lines=35");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃㊣必做題4:KMP算法㊣┃\n");printf("┃姓名:xxxx┃\n");printf("┃學(xué)號(hào):xxxxxxxxxx┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度綠色建筑租賃合同(含能源管理)2篇
- 2025年度個(gè)人債務(wù)重組合同范本2篇
- 2025版施工隊(duì)中途退場(chǎng)原因調(diào)查及責(zé)任追究合同3篇
- 2025-2030全球微注塑材料行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2024年全國(guó)營(yíng)養(yǎng)師技能大賽福建選拔賽考試題庫(kù)(附答案)
- 2025-2030全球軍事應(yīng)用防護(hù)涂層行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球駐極體過(guò)濾介質(zhì)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球植入性人工器官行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 外墻清洗合同范例
- 2025年度鋼材價(jià)格預(yù)測(cè)居間服務(wù)協(xié)議3篇
- 贍養(yǎng)老人證明書
- 團(tuán)隊(duì)管理總結(jié)及計(jì)劃安排PPT模板
- 中國(guó)的世界遺產(chǎn)知到章節(jié)答案智慧樹(shù)2023年遼寧科技大學(xué)
- 道路通行能力手冊(cè)第4章-高速公路基本路段
- 傳感器與測(cè)試技術(shù)試卷及答案
- 2020年普通高等學(xué)校招生全國(guó)統(tǒng)一數(shù)學(xué)考試大綱
- 土方轉(zhuǎn)運(yùn)方案
- (11.3.1)-10.3蒸汽壓縮制冷循環(huán)
- GB/T 679-2002化學(xué)試劑乙醇(95%)
- 總則(養(yǎng)牛場(chǎng)環(huán)評(píng)報(bào)告)
- 最全新能源材料-鋰離子電池材料189張課件
評(píng)論
0/150
提交評(píng)論