版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、石家莊經(jīng)濟(jì)學(xué)院實(shí) 驗(yàn) 報 告網(wǎng)址:實(shí)驗(yàn)名稱:線性表實(shí)現(xiàn)大整數(shù)運(yùn)算學(xué)號:413109030111實(shí)驗(yàn)日期:2015.03姓名:孫曉穎設(shè)備編號:實(shí)驗(yàn)室:152一、 實(shí)驗(yàn)內(nèi)容1. 實(shí)現(xiàn)線性表鏈?zhǔn)浇Y(jié)構(gòu)的插入、刪除、查找以及合并等操作的算法、編程實(shí)現(xiàn);2. 使用雙向鏈表結(jié)構(gòu),設(shè)計并實(shí)現(xiàn)長整數(shù)數(shù)據(jù)類型的表示及相關(guān)運(yùn)算二、 概要設(shè)計ADT Longint 數(shù)據(jù)對象:D=ai,bj|ai,bj0,1,2,3,4,5,6,7,8,9,i=1,2,n,n>=0,j=0,1,2,m,m>=0數(shù)據(jù)關(guān)系:R=<ai,ai+1>&&<ai+1,ai>,i=1,2,n基本
2、操作: shuru(DuLinkList &L) 操作結(jié)果:構(gòu)造一個雙向循環(huán)鏈表。 shuchu(DuLinkList L) 初始條件:雙向鏈表s已存在。 操作結(jié)果:將輸入雙向循環(huán)鏈表輸出。 shu(DuLinkList L) 操作結(jié)果:將操作結(jié)果雙向循環(huán)鏈表輸出。 add(DuLinkList LA, DuLinkList LB,DuLinkList &LC)初始條件:兩雙向循環(huán)鏈表p,q已存在。 操作結(jié)果:將存放長整型數(shù)據(jù)的兩雙向鏈表進(jìn)行加法運(yùn)算, 得到新的鏈表。 minus(DuLinkList LA, DuLinkList LB,DuLinkList &LC)初
3、始條件:兩雙向循環(huán)鏈表p,q已存在 操作結(jié)果:兩雙向循環(huán)鏈表進(jìn)行減法運(yùn)算,得到新的鏈表。mul(DuLinkList LA, DuLinkList LB,DuLinkList &LC)初始條件:兩雙向循環(huán)鏈表已存在。 操作結(jié)果:將存放長整型數(shù)據(jù)的兩雙向鏈表進(jìn)行乘法運(yùn)算,得到新鏈表。 ADT Longint三、 詳細(xì)設(shè)計/-存儲結(jié)構(gòu)表示-typedef struct DuLNode ElemType data; struct DuLNode *prior; struct DuLNode *next;DuLNode,*DuLinkList; /*定義鏈表結(jié)構(gòu)*/ /-基本操作的實(shí)現(xiàn)-voi
4、d shuru(DuLinkList &L)/輸入 建立LA LB 鏈表無空頭節(jié)點(diǎn)char ch;int opra,i;DuLinkList p,q; printf("請輸入長整數(shù) 每3位加',' 輸入以#結(jié)束 n"); L=(DuLinkList)malloc(sizeof(DuLNode);/新建空鏈表 L->prior=NULL; p=L; scanf("%d",&opra);/輸入數(shù)據(jù) p->data=opra;ch=getchar();while(ch!='#')/讀取未結(jié)束q=(Du
5、LinkList)malloc(sizeof(DuLNode);q->data =0;for (i=0;i<3;i+)ch=getchar();q->data =q->data * 10 +(ch-'0');p->next =q;/連入鏈表q->prior =p;p=q;/后移ch=getchar();p->next =NULL; printf("提示:輸入成功 ! n"); void shuchu(DuLinkList L)/輸出 (無空頭節(jié)點(diǎn)) DuLinkList p; int number,i; ElemTy
6、pe e; printf(" 輸出結(jié)果n"); number=0;/計算元素個數(shù) p=L; while(p!=NULL) number+; p=p->next; p=L; for(i=1;i<=number;i+) e=p->data;/對當(dāng)前結(jié)點(diǎn)輸出結(jié)果進(jìn)行分情況討論 p=p->next; if (i=1) /對最高位為0 if(e!=0) printf("%d",e); else/其他位分情況 if(e=0) /數(shù)值為0 printf("000");else if(e<10) /如果數(shù)值為1位 pri
7、ntf("00%d",e); else if(e<100)/如果數(shù)值為2位 printf("0%d",e); else printf("%d",e); /逗號 if(i!=number) if (i!=1) printf(","); else if (e!=0) printf(","); printf(" n 輸出成功 !n ");void shu(DuLinkList L)/輸出運(yùn)算結(jié)果 DuLinkList p; int number,i; ElemType e;
8、printf(" 輸出結(jié)果n"); number=0;/計算元素個數(shù) p=L; while(p->next !=NULL) number+; p=p->next; p=L->next ; for(i=1;i<=number;i+) e=p->data;/對當(dāng)前結(jié)點(diǎn)輸出結(jié)果進(jìn)行分情況討論 p=p->next; if (i=1) /對最高位為0 if(e!=0) printf("%d",e); else/其他位分情況 if(e=0) /數(shù)值為0 printf("000");else if(e<10
9、) /如果數(shù)值為1位 printf("00%d",e); else if(e<100)/如果數(shù)值為2位 printf("0%d",e); else printf("%d",e); /逗號 if(i!=number) if (i!=1) printf(","); else if (e!=0) printf(","); printf(" n 輸出成功 !n ");/加法void add(DuLinkList LA, DuLinkList LB,DuLinkList &
10、;LC) DuLinkList p,q,m,n,tail; ElemType tempa,tempb,tempc,temp;printf("提示: 加法運(yùn)算 n"); p=LA; while (p->next !=NULL)/指向LA尾p=p->next ;q=LB; while (q->next!=NULL)/指向LB尾q=q->next ; /新建鏈表LC LC=(DuLinkList)malloc(sizeof(DuLinkList); LC->prior=NULL;m=(DuLinkList)malloc(sizeof(DuLinkLi
11、st);tail=m;temp=0;/進(jìn)位 while( (p!=NULL)|(q!=NULL) )/當(dāng)短鏈結(jié)束后,繼續(xù)計算,視為當(dāng)前結(jié)點(diǎn)運(yùn)算數(shù)為0if(p!=NULL) tempa=p->data;else tempa=0; if(q!=NULL) tempb=q->data;else tempb=0;tempc=tempa+tempb+temp;if (tempc /1000 =0)/若不需要進(jìn)位 temp=0; if (tempc/1000 >0 )/若需要進(jìn)位 temp=1; tempc=tempc % 1000; n=(DuLinkList)malloc(sizeo
12、f(DuLinkList);/新建節(jié)點(diǎn) m->data =tempc; n->next=m;m->prior=n;m=n; p=p->prior;/向前移一位q=q->prior;/向前移一位 tail->next=NULL; LC->next=m->next; m->next->prior =LC; free(m); shu(LC);/減法void minus(DuLinkList LA, DuLinkList LB,DuLinkList &LC) DuLinkList p,q,m,n,tail; ElemType temp
13、a,tempb,tempc,temp;printf("提示: 減法運(yùn)算 n"); p=LA;/指向LA頭結(jié)點(diǎn) while (p->next !=NULL) p=p->next ;q=LB;/指向LB頭結(jié)點(diǎn) while (q->next !=NULL)q=q->next ;/新建鏈表LC LC=(DuLinkList)malloc(sizeof(DuLinkList); LC->prior=NULL; m=(DuLinkList)malloc(sizeof(DuLinkList);tail=m;temp=0;/借位 while( (p!=NULL
14、)|(q!=NULL) )/當(dāng)短鏈結(jié)束后,繼續(xù)計算,視為當(dāng)前結(jié)點(diǎn)運(yùn)算數(shù)為0if(p!=NULL) tempa=p->data;else tempa=0; if(q!=NULL) tempb=q->data;else tempb=0;tempc=tempa-tempb+temp; if (tempc >=0 )/若不需要借位 temp=0; if (tempc<0 )/若需要借位 temp=-1; tempc=tempc+1000; n=(DuLinkList)malloc(sizeof(DuLinkList);/新建節(jié)點(diǎn) m->data =tempc;n->
15、next =m;m->prior=n;m=n;p=p->prior;/向前移一位q=q->prior;/向前移一位 tail->next=NULL; LC->next=m->next ; m->next->prior =LC;free(m); shu(LC);/乘法void mul(DuLinkList LA,DuLinkList LB,DuLinkList &LC) DuLinkList p,q,m,n,tail; int temp,s; p=LA; q=LB;LC=(DuLinkList)malloc(sizeof(DuLNode);
16、/新建LC->prior=NULL;LC->next=NULL;m=(DuLinkList)malloc(sizeof(DuLNode);m->next=NULL; tail=m; /末尾的值m->prior=NULL;m->data=0;n=m;while (q->next!=NULL) /乘數(shù)移至最后一個節(jié)點(diǎn)q=q->next ;temp=0; /進(jìn)位while (q!=NULL) /乘數(shù)未結(jié)束m=tail;/LC尾部p=LA;while (p->next!=NULL)/被乘數(shù)移至最后一個節(jié)點(diǎn)p=p->next ;while (p!=N
17、ULL) /被乘數(shù)未結(jié)束if(m=NULL) m=(DuLinkList)malloc(sizeof(DuLNode);m->prior=NULL; m->data=(p->data*q->data+temp)%1000; temp=(p->data*q->data+temp)/1000; /進(jìn)位n->prior=m;/相連m->next=n; n=m;m=m->prior ;/向前挪else s=m->data+p->data*q->data+temp; /存放相乘的數(shù)與需要進(jìn)位的和m->data=s%1000;
18、if (m->next!=NULL) temp=s/1000; /判斷是否是第一次運(yùn)算 else temp=(p->data*q->data)/1000+temp; n=m;m=m->prior; p=p->prior ; /被乘數(shù)向前挪一位if (temp!=0) /判斷進(jìn)位m=(DuLinkList)malloc(sizeof(DuLNode);m->data=temp;m->prior=NULL;n->prior =m;m->next=n;n=m;m=m->prior;temp=temp/1000; /判斷進(jìn)位值是否大于1000
19、q=q->prior ; /乘數(shù)向前挪tail=tail->prior ; /錯位相加LC->next=n; /與頭節(jié)點(diǎn)相連n->prior=LC; shu(LC);四、 程序的調(diào)試與測試圖1 雙向鏈表1的建立圖2 雙向鏈表2的建立圖3 加法運(yùn)算圖4 減法運(yùn)算圖5 乘法運(yùn)算 圖一表示輸入數(shù)213100234鏈表的建立。以字符串形式輸入轉(zhuǎn)化為相應(yīng)數(shù)值,保存至節(jié)點(diǎn)中。圖二表示輸入數(shù)100234456鏈表的建立,過程同鏈表一。圖三表示213100234、100234456兩數(shù)的加法運(yùn)算結(jié)果,在進(jìn)行加法運(yùn)算的過程中,要從兩鏈表從后往前對應(yīng)節(jié)點(diǎn)數(shù)值相加,每個結(jié)點(diǎn)中只存放三位數(shù)字,
20、當(dāng)相加的結(jié)果大于或者等于1000時,要進(jìn)位,對該結(jié)果進(jìn)行取余,結(jié)果即為該結(jié)點(diǎn)數(shù)值,整除后的結(jié)果即為當(dāng)前進(jìn)位數(shù)值。注意輸出的過程中,零輸出與逗號輸出。圖四表示213100234、100234456兩數(shù)的減法運(yùn)算結(jié)果,在進(jìn)行減法運(yùn)算的過程中,同樣是要從兩鏈表的尾部向前進(jìn)行,在減法的過程中,若被減數(shù)大于減數(shù),要向前一節(jié)點(diǎn)數(shù)值借位,同時前一結(jié)點(diǎn)數(shù)值減一,當(dāng)減法結(jié)束后,輸出時要從第一個非零數(shù)開始輸出,注意零輸出。圖五表示213100234、100234456兩數(shù)的乘法運(yùn)算結(jié)果,在進(jìn)行乘法運(yùn)算的過程中,同樣是要從兩鏈表的尾部向前進(jìn)行,乘數(shù)的最后一結(jié)點(diǎn)與被乘數(shù)的每一結(jié)點(diǎn)數(shù)值進(jìn)行乘法運(yùn)算,之后被乘數(shù)結(jié)點(diǎn)向前移位,再次與被乘數(shù)的每一節(jié)點(diǎn)進(jìn)行乘法運(yùn)算,乘數(shù)繼續(xù)前移,直到移至第一個結(jié)點(diǎn)為止,同時將相乘結(jié)果進(jìn)行錯位相加,在乘法運(yùn)算的過程中,當(dāng)相乘所得大于等于1000時,要進(jìn)位,對該結(jié)果取余,取余后的結(jié)果即為該結(jié)點(diǎn)保存數(shù)值,整除后的結(jié)果即為要進(jìn)位的數(shù),若輸出的過程中注意零輸出。五
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025公司租賃經(jīng)營合同
- 2025鋼筋工施工勞務(wù)分包合同
- 2025擔(dān)保借款合同新
- 2025廣東省集體建設(shè)用地使用權(quán)出讓合同(宗地出讓)
- 3-6歲兒童發(fā)展與指南健康語言領(lǐng)域
- 設(shè)計單位品牌形象塑造
- 文化與音樂展覽場地租賃協(xié)議
- 21班運(yùn)動會入場班級解說詞200字
- 20歲生日發(fā)言稿簡單大方
- 科技園區(qū)寬帶安裝施工合同
- 基于PLC的食品包裝機(jī)控制系統(tǒng)設(shè)計
- 保密協(xié)議簡單合同范本
- 機(jī)械設(shè)計作業(yè)集
- 食品快速檢測實(shí)驗(yàn)室要求
- 冬季心血管病預(yù)防知識
- DB36-T 720-2013 汽車加油站防雷裝置檢測技術(shù)規(guī)范
- 鐵路護(hù)路巡防服務(wù)投標(biāo)方案(技術(shù)方案)
- 奧數(shù)試題(試題)-2023-2024學(xué)年四年級下冊數(shù)學(xué)人教版
- 《昆蟲記》感悟心得體會
- 白云湖國家濕地公園投資估算表
- 醫(yī)院消防應(yīng)急預(yù)案演練腳本大全(17篇)
評論
0/150
提交評論