版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、軟件技術(shù)基礎(chǔ)一.項(xiàng)目題目當(dāng)正整數(shù)的位數(shù)較多時(shí),采用int或者long變量?jī)?chǔ)存時(shí)會(huì)發(fā)生溢出??梢圆捎靡粋€(gè)單鏈表儲(chǔ)存,每一位作為一個(gè)節(jié)點(diǎn)。設(shè)計(jì)完成如下功能的算法并用給定數(shù)據(jù)進(jìn)行測(cè)試。(1)由一數(shù)字字符串創(chuàng)建對(duì)應(yīng)的整數(shù)單鏈表;(2)輸出一個(gè)由證書單鏈表表示的正整數(shù);(3)實(shí)現(xiàn)兩個(gè)多位正整數(shù)的加法運(yùn)算;(4)實(shí)現(xiàn)兩個(gè)多位正整數(shù)的乘法運(yùn)算。二算法設(shè)計(jì)(1)輸入要進(jìn)行處理的數(shù)據(jù)(2)輸出要測(cè)試的數(shù)據(jù)(3)分別調(diào)用已定義的“求和”、“求積”函數(shù)對(duì)數(shù)據(jù)進(jìn)行操作(4)打印得到的結(jié)果(5)銷毀所有鏈表三.函數(shù)設(shè)計(jì)(1)求字符數(shù)組長(zhǎng)度函數(shù):傳入一個(gè)字符數(shù)組的指針,用一個(gè)指針p和一個(gè)計(jì)數(shù)變量遍歷整個(gè)字符數(shù)組,返回計(jì)數(shù)
2、變量,即為數(shù)組長(zhǎng)度。(2)字符串轉(zhuǎn)鏈表函數(shù): 遍歷字符串, 使用尾插法將數(shù)據(jù)存入單鏈表中,并將字符型數(shù)據(jù)轉(zhuǎn)換成整形數(shù)據(jù),每一個(gè)節(jié)點(diǎn)儲(chǔ)存一個(gè)數(shù)字。(3)求鏈表長(zhǎng)度函數(shù):傳入一個(gè)鏈表的頭結(jié)點(diǎn),用一個(gè)指針p和一個(gè)計(jì)數(shù)變量遍歷整個(gè)鏈表,返回計(jì)數(shù)變量,即為鏈表長(zhǎng)度。(4)讀取鏈表指定位數(shù)字函數(shù):傳入一個(gè)鏈表的頭結(jié)點(diǎn)、指定第n個(gè)節(jié)點(diǎn)和讀取元素的地址,返回鏈表中第n個(gè)元素的值,賦給讀取變量。(5)將指定數(shù)字寫入鏈表指定位函數(shù):傳入一個(gè)鏈表的斗節(jié)點(diǎn)、指定第n個(gè)元素和待寫入的值,將該值賦給鏈表中第n個(gè)節(jié)點(diǎn)的數(shù)據(jù)域。(6)逆置函數(shù): 利用一個(gè)指針p,使整個(gè)鏈表尾插改頭插, 具體過程為令p為L(zhǎng)指向的下一結(jié)點(diǎn),斷開L
3、結(jié)點(diǎn)使之指向NULL,再將P插到L結(jié)點(diǎn)后面,且P結(jié)點(diǎn)后移一位,再插到L結(jié)點(diǎn)后面,一直重復(fù)操作直到P結(jié)點(diǎn)指向NULL,停止操作,則逆置完成,實(shí)現(xiàn)鏈表的原地逆置。(7)創(chuàng)建全零鏈表函數(shù):根據(jù)指定鏈表長(zhǎng)度n,創(chuàng)建一個(gè)全零的鏈表,用于后續(xù)的累加操作(8)進(jìn)位化簡(jiǎn)函數(shù):將鏈表中每一個(gè)節(jié)點(diǎn)的數(shù)對(duì)10取整,進(jìn)位給下一個(gè)節(jié)點(diǎn),本節(jié)點(diǎn)的數(shù)變?yōu)閷?duì)自身取余,直至整個(gè)鏈表每一個(gè)節(jié)點(diǎn)的數(shù)都在0-9之間,如果節(jié)點(diǎn)數(shù)不夠進(jìn)位,則先開辟一個(gè)節(jié)點(diǎn),連到鏈表尾部,再進(jìn)行上述進(jìn)位過程。(9)加法函數(shù):用鏈表儲(chǔ)存兩個(gè)大數(shù)的數(shù)據(jù)p,q,pp,pq分別為指向的下一結(jié)點(diǎn),利用逆置函數(shù)分別逆置數(shù)據(jù),當(dāng)pp和pq指向均不為NULL時(shí), 兩數(shù)相
4、加儲(chǔ)存在新建的一個(gè)和鏈表中; 當(dāng)pp或pq一個(gè)指向?yàn)榭諘r(shí),另一個(gè)不為空的鏈表數(shù)據(jù)直接存儲(chǔ)到新建的鏈表中去,此時(shí)存在進(jìn)位情況,利用simple函數(shù)實(shí)現(xiàn)進(jìn)位運(yùn)算,最后逆置和鏈表,輸出即為兩數(shù)之和。(10)乘法函數(shù):用鏈表儲(chǔ)存兩個(gè)大數(shù)的數(shù)據(jù)a,b,利用逆置函數(shù)分別逆置數(shù)據(jù),創(chuàng)建長(zhǎng)度為a,b長(zhǎng)度和減1的全0積鏈表,從b的第一位開始,將b的低位依次乘以a的各位,加到積鏈表中,b每移動(dòng)以為,積鏈表開始累加的第一位也向右移動(dòng)一位,即實(shí)現(xiàn)豎式乘法的移位相加,再利用simplify函數(shù)實(shí)現(xiàn)進(jìn)位運(yùn)算,最后逆置積鏈表,輸出即為兩數(shù)之積。(11)銷毀鏈表算法:從頭結(jié)點(diǎn)開始,利用一個(gè)遍歷指針,依次釋放所有節(jié)點(diǎn),直至p指
5、向NULL。四.測(cè)試數(shù)據(jù)(1)測(cè)試數(shù)據(jù)1(2)D1=100009;D2=900001(3)求D1+D2,D1*D2(4)測(cè)試數(shù)據(jù)2(5)D3=9999999999;D4=888888888(6)求D3+D4,D3*D4五.程序代碼#include#include#includetypedefintElemType;typedefstructnodeElemTypedata;/數(shù)據(jù)域structnode*next;/指針域SLinkNode;/單鏈表結(jié)點(diǎn)類型voidDestroyList(SLinkNode*L)/銷毀一個(gè)鏈表SLinkNode*pre=L,*p=pre-next;while(p
6、!=NULL)free(pre);pre=p;p=p-next;/pre、p同步后移free(pre);intGetLength(SLinkNode*L)/獲取鏈表的長(zhǎng)度inti=0;SLinkNode*p=L-next;while(p!=NULL)i+;p=p-next;returni;voidDispList(SLinkNode*L)/輸出一個(gè)鏈表SLinkNode*p=L-next;while(p!=NULL)printf(%d,p-data);p=p-next;printf(n);intGetElem(SLinkNode*L,inti,ElemType*e)/查找鏈表的第i個(gè)元素int
7、j=0;SLinkNode*p=L;/p指向頭結(jié)點(diǎn),計(jì)數(shù)器j置為0if(i=0)return0;/參數(shù)i錯(cuò)誤返回0while(p!=NULL&jnext;)if(p=NULL)return0;未找到返回0else*e=p-data;return1;/找到后返回1)intWriteElem(SLinkNode*L,inti,ElemTypea)/寫入鏈表的第i個(gè)元素intj=0;SLinkNode*p=L;/p指向頭結(jié)點(diǎn),計(jì)數(shù)器j置為0if(i=0)return0;/參數(shù)i錯(cuò)誤返回0while(p!=NULL&jnext;)if(p=NULL)return0;未找到返回0elsep-data=a
8、;/寫入指定數(shù)字areturn1;/找到后返回1)voidCreate(SLinkNode*L,intn)/創(chuàng)建長(zhǎng)度為n的全零鏈表SLinkNode*s,*tc;inti;tc=L;/tc始終指向尾結(jié)點(diǎn),初始時(shí)指向頭結(jié)點(diǎn)for(i=0;inext=s;s-data=0;/將s插入tc之后tc=s;)tc-next=NULL;/尾結(jié)點(diǎn)next域置為NULL)voidCreateListR(SLinkNode*L,chara口,intn)/將給定字符數(shù)組轉(zhuǎn)為鏈表SLinkNode*s,*tc;inti;tc=L;/tc始終指向尾結(jié)點(diǎn),初始時(shí)指向頭結(jié)點(diǎn)for(i=0;idata=(int)(ai-0
9、);/創(chuàng)建存放ai元素的新結(jié)點(diǎn)stc-next=s;/將s插入tc之后tc=s;)tc-next=NULL;/尾結(jié)點(diǎn)next域置為NULL)intLens(charc)/獲取指定字符數(shù)組的長(zhǎng)度(inti=0;char*p=c;while(*p!=0)(i+;p+;)returni;)voidReverse(SLinkNode*L)/逆置函數(shù),將指定鏈表原地逆置SLinkNode*p=L-next,*q;L-next=NULL;while(p!=NULL)/遍歷所有數(shù)據(jù)結(jié)點(diǎn)q=p-next;/q臨時(shí)保存p結(jié)點(diǎn)之后的結(jié)點(diǎn)p-next=L-next;/將結(jié)點(diǎn)p插入到頭結(jié)點(diǎn)之后L-next=p;p=q
10、;)intMax(inta,intb)/return(ab?a:b);)voidSimplify(SLinkNode*L)/進(jìn)位化簡(jiǎn)函數(shù)SLinkNode*p,*q;p=L-next;q=p;while(p-next!=NULL|p-data=10)if(p-next=NULL)q=(SLinkNode*)malloc(sizeof(SLinkNode);q-data=0;p-next=q;q-next=NULL;)q=p-next;q-data=q-data+(int)(p-data/10);p-data=p-data%10;p=q;)voidAdd(SLinkNode*p,SLinkNod
11、e*q,SLinkNode*sumhead)/intmm=Max(GetLength(p),GetLength(q);比較兩數(shù)的大小,返回最大數(shù)加法函數(shù)Create(sumhead,mm);Reverse(p);Reverse(q);SLinkNode*pp=p-next,*pq=q-next,*psum=sumhead-next;while(pp!=NULL&pq!=NULL)psum-data=pp-data+pq-data;pp=pp-next;pq=pq-next;psum=psum-next;)if(pp=NULL)while(pq!=0)psum-data=pq-data;pq=p
12、q-next;psum=psum-next;)if(pq=NULL)while(pp!=0)(psum-data=pp-data;pp=pp-next;psum=psum-next;Reverse(p);Reverse(q);Simplify(sumhead);Reverse(sumhead);DispList(sumhead);printf(n);voidPlus(SLinkNode*p,SLinkNode*q,SLinkNode*plushead)/(乘法函數(shù)inti,j,k;intai,bj,ck;Reverse(p);Reverse(q);Create(plushead,(GetLen
13、gth(p)+GetLength(q)-1);for(j=1;j=GetLength(q);j+)for(k=j,i=1;i=GetLength(p);k+,i+)(GetElem(p,i,&ai);GetElem(q,j,&bj);GetElem(plushead,k,&ck);ck=ck+bj*ai;WriteElem(plushead,k,ck);Simplify(plushead);Reverse(p);Reverse(q);Reverse(plushead);DispList(plushead);printf(n);)intmain()(SLinkNodesum,plus;SLink
14、Nodec1head,c2head,c3head,c4head;charc1=100009;charc2=900001;charc3=9999999999;charc4=888888888;CreateListR(&c1head,c1,Lens(c1);CreateListR(&c2head,c2,Lens(c2);CreateListR(&c3head,c3,Lens(c3);CreateListR(&c4head,c4,Lens(c4);printf(第一組測(cè)試數(shù)據(jù)為n);DispList(&c1head);DispList(&c2head);printf(n);printf(兩數(shù)之和為n);Add(&c1head,&c2head,&sum);printf(兩數(shù)之積為n);Plus(&c1head,&c2head,&plus);printf(nn);printf(第二組測(cè)試數(shù)據(jù)為n);DispList(&c3head);DispList(&c4head);printf(n);printf(兩數(shù)之和為n);Add(&c3head,&c4head,&sum);printf(兩數(shù)之積為n);Plus(&c3head,&c4head,&plus);DestroyList(&c1head
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 咨詢服務(wù)合同簽訂流程及規(guī)范
- 二零二五年度電商內(nèi)容營(yíng)銷與品牌推廣合作合同4篇
- 2025版南京住宅物業(yè)管理服務(wù)合同范本4篇
- 2025年度知識(shí)產(chǎn)權(quán)質(zhì)押借款合同執(zhí)行細(xì)則4篇
- 毛坯房買賣合同的市場(chǎng)分析
- 2025年度智慧城市建設(shè)承包合同協(xié)議3篇
- 二零二五版民辦學(xué)校校長(zhǎng)任期家長(zhǎng)溝通協(xié)作合同3篇
- 專業(yè)證券投資解析服務(wù)合同
- 2025版成都二手房產(chǎn)買賣合同違約責(zé)任規(guī)定4篇
- 2025簽訂合同的要經(jīng)過些階段
- 高考滿分作文常見結(jié)構(gòu)完全解讀
- 理光投影機(jī)pj k360功能介紹
- 六年級(jí)數(shù)學(xué)上冊(cè)100道口算題(全冊(cè)完整版)
- 八年級(jí)數(shù)學(xué)下冊(cè)《第十九章 一次函數(shù)》單元檢測(cè)卷帶答案-人教版
- 帕薩特B5維修手冊(cè)及帕薩特B5全車電路圖
- 系統(tǒng)解剖學(xué)考試重點(diǎn)筆記
- 小學(xué)五年級(jí)解方程應(yīng)用題6
- 云南省地圖含市縣地圖矢量分層地圖行政區(qū)劃市縣概況ppt模板
- 年月江西省南昌市某綜合樓工程造價(jià)指標(biāo)及
- 作物栽培學(xué)課件棉花
評(píng)論
0/150
提交評(píng)論