數(shù)據(jù)結(jié)構(gòu)將一個鏈表拆分成三個鏈表_第1頁
數(shù)據(jù)結(jié)構(gòu)將一個鏈表拆分成三個鏈表_第2頁
數(shù)據(jù)結(jié)構(gòu)將一個鏈表拆分成三個鏈表_第3頁
數(shù)據(jù)結(jié)構(gòu)將一個鏈表拆分成三個鏈表_第4頁
免費預(yù)覽已結(jié)束,剩余4頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)實驗報告實驗題目 : 將一個鏈表拆分成三個鏈表。實驗?zāi)康模?、掌握使用Visual C+6.0上機調(diào)試程序的基本方法;2、掌握鏈表結(jié)構(gòu)中的基本操作并學(xué)會靈活運用;3、提高自己分析問題和解決問題的能力,在實踐中理解教材上的理論。實驗內(nèi)容:建立鏈表并存儲輸入的數(shù)據(jù),根據(jù)各節(jié)點數(shù)據(jù)的類型,建立三個鏈表并將不同類型的數(shù)據(jù)分別輸出。一、需求分析1、輸入的形式和輸入值的范圍:根據(jù)提示,輸入鏈表中的各數(shù)據(jù),輸入回車結(jié)束輸入,所輸入的數(shù)據(jù)元素為字符類型。2、輸出的形式:根據(jù)輸入的字符串中數(shù)據(jù)的類型(字母、數(shù)字和其它),分類輸出。3、程序所能達(dá)到的功能:根據(jù)提示輸入數(shù)據(jù),然后根據(jù)數(shù)據(jù)元素類型的不同,將其

2、分別輸出,輸出結(jié)束后提示是否結(jié)束,根據(jù)需要繼續(xù)操作。由此可以實現(xiàn)實驗內(nèi)容中的要求。4、測試數(shù)據(jù):輸入鏈表中的各元素:*?9Li(0)02 11字母 :Li數(shù)字 :900211其它 :*?() 是否結(jié)束 ?是 , 輸入 0; 否, 輸入 10謝謝使用,再見!二 概要設(shè)計本程序使用單鏈表表示的線性表, 建立鏈表并存儲數(shù)據(jù), 拆分后的三個鏈表都用帶頭結(jié)點的單鏈表存放, 先建立三個頭結(jié)點, 用一指針掃描待拆分的鏈表, 然后根據(jù)各結(jié)點的數(shù)據(jù)的類型不同將其分別插入三個新鏈表中, 由此實現(xiàn)了對鏈表的拆分, 最后將鏈表中的數(shù)據(jù)輸出即可實現(xiàn)題目要求。本程序的基本操作和模塊:主程序模塊main()對輸入的操作進行

3、提示,調(diào)用其它的各個函數(shù);建立鏈表并輸入數(shù)據(jù)模塊Create(LinkList *&L)輸出鏈表中的數(shù)據(jù)模塊Printf(LinkList *L)將原鏈表拆分成三個鏈表的模塊:Fun(LinkList *hd,LinkList *ha,LinkList *hb,LinkList *hc)程序流程如下所示開 始Create 函數(shù)Fun 函數(shù)Printf 函數(shù)是否結(jié)束是結(jié) 束三 詳細(xì)設(shè)計(一)元素類型、結(jié)點類型和指針類型typedef struct LNodechar data;struct LNode *next;LinkList;(二)每個模塊的分析1、主程序模塊分析int main()否Li

4、nkList *hd,*ha,*hb,*hc;/定義四個頭結(jié)點指針, *hd 代表待拆分鏈表, *ha,*hb 和 *hc 分別代表字母 ,數(shù)字和其它類型的鏈表ha=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建 ha 頭結(jié)點hb=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建 hb 頭結(jié)點hc=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建 hc 頭結(jié)點int i;/定義整型數(shù)據(jù)i ,用于判斷是否終止本程序的運行char m;/定義字符型數(shù)據(jù)m,存放輸入i 的值之后的回車while(1)Creat

5、e(hd);/調(diào)用建立單鏈表并輸入數(shù)據(jù)的函數(shù)Fun(hd,ha,hb,hc);/調(diào)用拆分鏈表的函數(shù)printf(n字母 :);/提示輸出的鏈表中數(shù)據(jù)為字母類型Printf(ha);/調(diào)用輸出鏈表元素的函數(shù),輸出ha 鏈表中的數(shù)據(jù) (字母類型)printf(n數(shù)字 :);/提示輸出的鏈表中數(shù)據(jù)為數(shù)字類型Printf(hb);/調(diào)用輸出鏈表元素的函數(shù),輸出hb 鏈表中的數(shù)據(jù) (數(shù)字類型)printf(n其它 :);/提示輸出的鏈表中數(shù)據(jù)為其它類型Printf(hc);/調(diào)用輸出鏈表元素的函數(shù),輸出hc 鏈表中的數(shù)據(jù) (其它類型)printf(n);printf(n是否結(jié)束scanf(%d,&i);

6、?是,輸入0;否 ,輸入1n);/ 提示是否終止本程序的運行/ 輸入整數(shù)iprintf(n);if(i=1) scanf(%c,&m);/ 存放輸入i 的值之后的回車if(i=0) break;/ 當(dāng)i 為0 時,結(jié)束循環(huán),結(jié)束運行printf(謝謝使用,再見! nn);return 0;2、建立鏈表和輸入數(shù)據(jù)模塊分析void Create(LinkList *&L)LinkList *s,*r;L=(LinkList *)malloc(sizeof(LinkList);L-next=NULL;r=L;printf( 輸入鏈表中的各元素:n);while(1)/創(chuàng)建頭結(jié)點/r 始終指向終端結(jié)點

7、,開始時指向頭結(jié)點/用于提示字符串的輸入s=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建新結(jié)點scanf(%c,&s-data);r-next=s;/輸入新節(jié)點的數(shù)據(jù)/將 *s 插入 *r 之后r=s;if(s-data=n) break;/若輸入回車,則字符串的輸入結(jié)束r-next=NULL;/終端結(jié)點next 域置NULL3、輸出鏈表元素模塊分析void Printf(LinkList *L)LinkList *p=L-next;while (p!=NULL)printf(%c,p-data);/當(dāng)指針p 所指結(jié)點next域不為NULL時,將該結(jié)點的p=p

8、-next;數(shù)據(jù)輸出/p 指針向后移動4、拆分鏈表模塊分析void Fun(LinkList *hd,LinkList *ha,LinkList *hb,LinkList *hc)LinkList *p=hd-next,*ra,*rb,*rc;/ 定義三個指向鏈表結(jié)點的指針ra=ha;rb=hb;rc=hc;while(p!=NULL)/ra 始終指向ha 的末尾結(jié)點/ra 始終指向ha 的末尾結(jié)點/ra 始終指向ha 的末尾結(jié)點/當(dāng)指針 p 所指結(jié)點的指針域不為NULL時,執(zhí)行以下循環(huán)過程if(p-data=A&p-datadata=a&p-datanext=p;ra=p;p=p-next;

9、/ 將 *p 鏈接到/p 指針后移ha 單鏈表末尾elseif(p-data=0&p-datanext=p;rb=p;/將 *p鏈接到ha 單鏈表末尾p=p-next;/p 指針后移else/數(shù)據(jù)為其它類型的情況rc-next=p;rc=p;p=p-next;/將 *p 鏈接到/p 指針后移ha 單鏈表末尾ra-next=NULL;rb-next=NULL;rc-next=NULL;/將三個新鏈表尾結(jié)點next 域置空四 使用說明、測試分析及結(jié)果1、程序使用說明:(1)本程序運行環(huán)境為Visual C+ 6.0;(2)根據(jù)界面提示進行操作,每次從鍵盤輸入數(shù)據(jù)后按回車結(jié)束。2、測試結(jié)果與分析:根

10、據(jù)提示,當(dāng)輸入為時,輸出結(jié)果如下所示字母 :Li數(shù)字 :900211其它 :*?() 是否結(jié)束 ?是 , 輸入0; 否, 輸入10謝謝使用,再見!3、調(diào)試過程中遇到的問題及解決方法當(dāng)代碼編寫完成后, 編譯過程出現(xiàn)了很多小錯誤, 比如語句末尾漏掉分號, 賦值運算符與等號混淆等,但這些問題很快發(fā)現(xiàn)并及時糾正;另外, 在運行時出現(xiàn)可以輸入字符串但卻無法正常輸出結(jié)果的現(xiàn)象, 在進一步分析所編寫的代碼后,發(fā)現(xiàn)函數(shù)調(diào)用過程不對,在參考程序設(shè)計教材后,解決了這一問題。4、運行界面五、實驗總結(jié)本次實驗, 我進行了預(yù)習(xí),但是預(yù)習(xí)過程不夠認(rèn)真,忽略了很多細(xì)節(jié),以致于我用了大約一個小時的時間編寫完代碼,但是對代碼的

11、修改卻花費了大量時間,沒有當(dāng)堂完成。 課后,我參考了C程序設(shè)計的教材并很快發(fā)現(xiàn)自己的問題,又花費了半個小時,才最終修改正確。在最開始編寫程序時,因為長時間沒有應(yīng)用C 語言, 所以部分基本知識有些生疏,以致于發(fā)生了很多低級的錯誤,比如忽略了字符型數(shù)據(jù)和整型數(shù)據(jù)的區(qū)別,在輸入字符串時以空格分隔各其它字符,導(dǎo)致得不到輸出結(jié)果,不過這些錯誤很快糾正。另外,在最初的程序中,通過輸入字符串中字符的個數(shù)然后再輸入字符串,最后輸出結(jié)果,因為要輸入字符串中字符的個數(shù),所以當(dāng)字符串較長時操作起來不方便。所以我對其進行了修改, 在函數(shù)中判斷是否有回車的輸入,以回車直接結(jié)束字符串的輸入,不必再輸入字符個數(shù),從而操作起

12、來更加方便。我還在主函數(shù)中添加了一個循環(huán),以輸入0或 1判斷是否繼續(xù)程序的運行,使之更加人性化,但是在此也遇到一個問題。當(dāng)輸入1時,表示不結(jié)束,但是輸入1之后以回車表示輸入的結(jié)束,因為回車表示字符串輸入的結(jié)束,所以導(dǎo)致之后的操作不能正常進行,為解決這一問題,我在主函數(shù)中重新定義了一個字符型數(shù)據(jù),以吸收回車。最終程序得以正常運行。本次實驗, 我很感謝老師和同學(xué)對我的指點。通過本次實驗, 對鏈表結(jié)構(gòu)有了更深層次的認(rèn)識,對一些細(xì)節(jié)更加理解,收獲了很多。教師評語:實驗成績:指導(dǎo)教師簽名:批閱日期:代碼:# include# include/* 定義單鏈表結(jié)點類型*/typedef struct LNo

13、dechar data;/每個結(jié)點中存儲的數(shù)據(jù)為字符型struct LNode *next; LinkList;/指向后繼結(jié)點/* 建立單鏈表并輸入數(shù)據(jù)的函數(shù) void Create(LinkList *&L) */LinkList *s,*r;L=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建頭結(jié)點L-next=NULL;/頭結(jié)點的next域置空r=L;/r 始終指向終端結(jié)點,開始時指向頭結(jié)點printf( 輸入鏈表中的各元素:n);/用于提示字符串的輸入while(1)s=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建新結(jié)點s

14、canf(%c,&s-data);/輸入新節(jié)點的數(shù)據(jù)r-next=s;r=s;/將 *s 插入*r 之后if(s-data=n) break;/若輸入回車,則字符串的輸入結(jié)束r-next=NULL;/終端結(jié)點next域置NULL/* 輸出鏈表中的所有元素的函數(shù) void Printf(LinkList *L) */LinkList *p=L-next;while (p!=NULL)printf(%c,p-data);/當(dāng)指針p 所指結(jié)點next 域不為NULL 時,將該結(jié)點的數(shù)據(jù)輸出p=p-next;/p指針向后移動/* 拆分鏈表的函數(shù) */void Fun(LinkList *hd,Link

15、List *ha,LinkList *hb,LinkList *hc)LinkList *p=hd-next,*ra,*rb,*rc;/定義三個指向鏈表結(jié)點的指針ra=ha;/ra 始終指向ha 的末尾結(jié)點rb=hb;/ra 始終指向ha 的末尾結(jié)點rc=hc;/ra始終指向ha 的末尾結(jié)點while(p!=NULL)/當(dāng)指針p 所指結(jié)點的指針域不為NULL 時,執(zhí)行以下循環(huán)過程if(p-data=A&p-datadata=a&p-datanext=p;ra=p;/將 *p 鏈接到ha 單鏈表末尾p=p-next;/p指針后移elseif(p-data=0&p-datanext=p;rb=p;

16、/將*p 鏈接到ha 單鏈表末尾p=p-next;/p 指針后移else/數(shù)據(jù)為其它類型的情況rc-next=p;rc=p;/將*p 鏈接到ha 單鏈表末尾p=p-next;/p 指針后移ra-next=NULL;rb-next=NULL;rc-next=NULL;/將三個新鏈表尾結(jié)點的next 域置空/* int main() 主函數(shù) */LinkList *hd,*ha,*hb,*hc;/定義四個頭結(jié)點指針,*hd代表待拆分鏈表,*ha,*hb和 *hc 分別代表字母,數(shù)字和其它類型的鏈表ha=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建 ha 頭結(jié)點hb

17、=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建 hb 頭結(jié)點hc=(LinkList *)malloc(sizeof(LinkList);/創(chuàng)建 hc 頭結(jié)點int i;/定義整型數(shù)據(jù)i,用于判斷是否終止本程序的運行char m;/定義字符型數(shù)據(jù)m, 存放輸入i 的值之后的 nwhile(1)Create(hd);/調(diào)用建立單鏈表并輸入數(shù)據(jù)的函數(shù)Fun(hd,ha,hb,hc);/調(diào)用拆分鏈表的函數(shù)printf(n字母 :);/提示輸出的鏈表中數(shù)據(jù)為字母類型Printf(ha);/調(diào)用輸出鏈表元素的函數(shù),輸出ha 鏈表中的數(shù)據(jù)( 字母類型)printf(n數(shù)字 :);/提示輸出的鏈表中數(shù)據(jù)為數(shù)字類型Printf(hb);/調(diào)用

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論