版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 單 位: 計算機051班 </p><p> 學 號: </p><p><b> 課程設(shè)計</b></p><p> ?。ㄓ嬎銠C科學與技術(shù)專業(yè))</p><p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</b></p><p> 姓
2、 名: </p><p> 專 業(yè): 計算機科學與技術(shù)</p><p><b> 指導教師: </b></p><p><b> 二○○八年六月</b></p><p><b> 一、課程設(shè)計</b></p><p>
3、設(shè)計題目:單鏈表兩個集合相加減的算法</p><p> 為了實現(xiàn)單鏈表的幾種運算功能,需要用到多張函數(shù)程序,例如:建表--readdata(pointer *head),單鏈表元素排序--sort(pointer *head),輸出單鏈表L --disp(pointer *head),求兩有序集合的并。兩個集合A和B,它們的并集為集合C--bing(pointer *head1,pointer *head2,
4、pointer *head3),求兩有序集合的交。兩個集合A和B,它們的交集為集合C-- jiao(pointer *head1,pointer *head2, pointer *head3),求兩有序集合的差。兩個集合A和B,它們的差集為集合C-- cha(pointer *head1,pointer *head2, pointer *head3),首先建立單鏈表,再調(diào)用函數(shù)sort()構(gòu)成有序單鏈表,最后求用有序單鏈表表示的兩個集合
5、的相關(guān)運算-- main()。首先設(shè)計一個含有多個菜單項的主控菜單程序,然后再為這些菜單項配上相應的功能。</p><p><b> 一、主控菜單設(shè)計</b></p><p><b> 1)菜單內(nèi)容</b></p><p> 程序運行后,給出7個菜單項的內(nèi)容和輸入提示:</p><p><
6、;b> 集合1為</b></p><p><b> 集合2為</b></p><p> 集合1與集合2的并為</p><p> 集合1與集合2的交為</p><p> 集合1與集合2的差為</p><p> 集合2與集合1的差為</p><p>
7、;<b> 退出管理系統(tǒng)</b></p><p><b> 二、鏈表介紹</b></p><p><b> 1)建立單向鏈表</b></p><p> 在函數(shù)中首先為Head申請了—個所指向的結(jié)點,該結(jié)點稱為鏈表的首結(jié)點。開始鏈表的頭指針和尾指針都指向頭結(jié)點,以后每輸入一個數(shù)則申請一個結(jié)點,將
8、輸入的數(shù)放到結(jié)點的信息域后。輸入結(jié)束后,置鏈表最后一個結(jié)點的指針域為空,返回鏈表頭指針。單向鏈表中插入結(jié)點在單向鏈表中插入一個結(jié)點要引起插入位置前面結(jié)點的指針的變化,在插入一個結(jié)點時首先要由(new pointer)向系統(tǒng)申請一個存儲pointer類型變量的空間,并將該空間的首地址賦給指向新結(jié)點的指針head,在為該新結(jié)點的信息域賦值后,先要將該結(jié)點插入位置后面一個結(jié)點的指針賦給該結(jié)點的指針域,然后才能將指向該結(jié)點的指針賦給其前一個結(jié)點
9、的指針域,這樣來完成插入過程。在單向鏈表中刪除個結(jié)點同樣要引起刪除結(jié)點的前面結(jié)點的指針的變化。</p><p><b> 2)編歷鏈表</b></p><p> 由于鏈表是一個動態(tài)的數(shù)據(jù)結(jié)構(gòu),鏈表的各個結(jié)點由指針鏈接在起,訪問鏈表元素時通過每個鏈表結(jié)點的指針逐個找到該結(jié)點的下一個結(jié)點,—直找到鏈表尾,鏈表的最后一個結(jié)點的指針為空。</p><p
10、><b> 3)雙向鏈表</b></p><p> 每個結(jié)點中只包括一個指向下個結(jié)點的指針域,這種鏈表稱為單向鏈表。如果要在單向鏈表一個指針所指的當前位置插入一個新結(jié)點,就必須從鏈表頭指針開始逐個遍歷直到當前指針所指結(jié)點的前一結(jié)點,修改這個結(jié)點的指針。雙向鏈表的每個結(jié)點中包括兩個指針域,分別指向該結(jié)點的前一個結(jié)點和后一個結(jié)點。在雙向鏈表中由任何一個結(jié)點都很容易找到其前面的結(jié)點和后面
11、的結(jié)點,而不需要在上述的插入(及刪除)操作中由頭結(jié)點開始尋找。</p><p> 4)本程序中包含如下函數(shù)</p><p> readdata(pointer *head):建表</p><p> sort(pointer *head) : 單鏈表元素排序</p><p> disp(pointer *head) :輸出單鏈表L<
12、;/p><p> bing(pointer *head1,pointer *head2, pointer *head3):求兩有序集合的并。兩個集合1和2,它們的并集為集合3</p><p> jiao(pointer *head1,pointer *head2, pointer *head3):求兩有序集合的交。兩個集合1和2,它們的交集為集合3</p><p>
13、 cha(pointer *head1,pointer *head2, pointer *head3):求兩有序集合的差。兩個集合1和2,它們的差集為集合3</p><p> main():首先建立單鏈表,再調(diào)用函數(shù)sort()構(gòu)成有序單鏈表,最后求用有序單鏈表表示的兩個集合的相關(guān)運算</p><p><b> 5)建立鏈表</b></p><
14、;p> 要求建立一個帶頭結(jié)點的單鏈表。我們知道建立單鏈表有兩種方法,一種稱之為頭插法,另一種稱為尾插法。頭插法是每次將新插入的結(jié)點插入在鏈表的表頭,而尾插法是將新插入的結(jié)點插入在鏈表的表尾。在這里只介紹用尾插法建立鏈表的算法設(shè)計思想及具體算法實現(xiàn),頭插法留給讀者自己去做。</p><p> 要建立鏈表,首先要生成結(jié)點,因此,尾插法建立鏈表的算法描述如下:</p><p> 使鏈
15、表的頭尾指針head, rear指向新生成的頭結(jié)點(也是尾結(jié)點);</p><p> 置結(jié)束標志0(假);</p><p> While (結(jié)束標志不為真)</p><p><b> {</b></p><p> P指向新生成的結(jié)點;</p><p> 讀入一個通訊者數(shù)據(jù)至新結(jié)點的數(shù)據(jù)域
16、;</p><p> 將新結(jié)點鏈到尾結(jié)點之后;</p><p> 使尾結(jié)點指向新結(jié)點;</p><p> 提示:是否結(jié)束建表,讀入一個結(jié)束標志;</p><p><b> }</b></p><p> 尾結(jié)點指針域置空值NULL。</p><p><b>
17、; 6)鏈表結(jié)點的插入</b></p><p> 鏈表結(jié)點的插入,是要求將一個通訊者數(shù)據(jù)結(jié)點按其編號的次序插入有序通訊錄表的相應位置,以保持通訊錄表的有序性。插入結(jié)點的基本思想是:使用兩個指針變量p1和p2分別指向當前剛訪問過的結(jié)點和下一個待訪問的結(jié)點,循環(huán)順序查找鏈表,尋找插入結(jié)點的位置,其中p1指向待插入位置的前一個結(jié)點。插入操作是非常簡單的。其實現(xiàn)算法描述如下:</p><
18、;p> (1)用p1指向原鏈表頭結(jié)點,p2指向鏈表的第一個結(jié)點;</p><p> (2) While (p2 != NULL && strcmp(p2->data.num, p->data.num) < 0)</p><p><b> {</b></p><p> P1 = p2;
19、 //p1指向剛訪問過的結(jié)點</p><p> P2 = p2->next; //p2指向表的下一個結(jié)點</p><p><b> }</b></p><p><b> 插入新結(jié)點</b></p><p><b> 7)鏈表的輸出</b></p&g
20、t;<p> 鏈表的輸出相對來說比較簡單,只要將表頭指針賦給一個指針變量p,然后p向后掃描,直至表尾,p為空為止</p><p> 三 程序代碼及功能實現(xiàn)</p><p><b> 程序代碼如下: </b></p><p><b> */</b></p><p> #incl
21、ude<stdio.h> </p><p> #include<stdlib.h> </p><p> typedef struct pointer{ </p><p> char dat; </p><p> struct pointer *link; </p><p> } poi
22、nter; </p><p> void readdata(pointer *head){ //讀集合 </p><p> pointer *p; </p><p> char tmp; </p><p> printf("請輸入任意字符串\n"); </p><p> scanf(&qu
23、ot;%c",&tmp); </p><p> while(tmp!='\n') </p><p><b> { </b></p><p> p=(pointer *)malloc(sizeof(struct pointer)); </p><p> p->dat=tmp;
24、 </p><p> p->link=head->link; </p><p> head->link=p; </p><p> scanf("%c",&tmp); </p><p><b> } </b></p><p><b>
25、 } </b></p><p> void sort(pointer *head)//單鏈表排序</p><p><b> {</b></p><p> pointer *p=head->link,*q,*r;</p><p> if(p!=NULL) </p
26、><p><b> {</b></p><p> r=p->link;</p><p> p->link=NULL;</p><p><b> p=r;</b></p><p> while(p!=NULL)</p><p><
27、b> {</b></p><p> r=p->link;</p><p><b> q=head;</b></p><p> while(q->link!=NULL&&q->link->dat<p->dat)</p><p> q=q->
28、;link; //在有序表中找插入*p的前驅(qū)結(jié)點*q</p><p> p->link=q->link; //將*p插到*q之后</p><p> q->link=p;</p><p><b> p=r;</b></p><p><b> }&
29、lt;/b></p><p><b> }</b></p><p><b> }</b></p><p> void disp(pointer *head){ //顯示集合數(shù)據(jù) </p><p> pointer *p; </p><p> p=head-&g
30、t;link; </p><p> while(p!=NULL) </p><p><b> { </b></p><p> printf("%c ",p->dat); </p><p> p=p->link; </p><p><b> } &
31、lt;/b></p><p> printf("\n"); </p><p><b> } </b></p><p> void bing(pointer *head1,pointer *head2, pointer *head3){ //計算集合1與集合2的并 </p><p> po
32、inter *p1,*p2,*p3; </p><p> p1=head1->link; </p><p> while(p1!=NULL) </p><p><b> { </b></p><p> p3=(pointer *)malloc(sizeof(struct pointer)); </p&
33、gt;<p> p3->dat=p1->dat; </p><p> p3->link=head3->link; </p><p> head3->link=p3; </p><p> p1=p1->link; </p><p><b> } </b></
34、p><p> p2=head2->link; </p><p> while(p2!=NULL) </p><p><b> { </b></p><p> p1=head1->link; </p><p> while((p1!=NULL)&&(p1->d
35、at!=p2->dat)) </p><p> p1=p1->link; </p><p> if(p1==NULL) </p><p><b> { </b></p><p> p3=(pointer *)malloc(sizeof(struct pointer)); </p><
36、;p> p3->dat=p2->dat; </p><p> p3->link=head3->link; </p><p> head3->link=p3; </p><p><b> } </b></p><p> p2=p2->link; </p>&
37、lt;p><b> } </b></p><p><b> } </b></p><p> void jiao(pointer *head1,pointer *head2, pointer *head3){ //計算集合1與集合2的交 </p><p> pointer *p1,*p2,*p3; </p
38、><p> p1=head1->link; </p><p> while(p1!=NULL) </p><p><b> { </b></p><p> p2=head2->link; </p><p> while((p2!=NULL)&&(p2->da
39、t!=p1->dat)) </p><p> p2=p2->link; </p><p> if((p2!=NULL)&&(p2->dat=p1->dat)) </p><p><b> { </b></p><p> p3=(pointer *)malloc(sizeof
40、(struct pointer)); </p><p> p3->dat=p1->dat; </p><p> p3->link=head3->link; </p><p> head3->link=p3; </p><p><b> } </b></p><p&
41、gt; p1=p1->link; </p><p><b> } </b></p><p><b> } </b></p><p> void cha(pointer *head1,pointer *head2, pointer *head3){ //計算集合1與集合2的差 </p><p
42、> pointer *p1,*p2,*p3; </p><p> p1=head1->link; </p><p> while(p1!=NULL) </p><p><b> { </b></p><p> p2=head2->link; </p><p> whi
43、le((p2!=NULL)&&(p2->dat!=p1->dat)) </p><p> p2=p2->link; </p><p> if(p2==NULL) </p><p><b> { </b></p><p> p3=(pointer *)malloc(sizeof(s
44、truct pointer)); </p><p> p3->dat=p1->dat; </p><p> p3->link=head3->link; </p><p> head3->link=p3; </p><p><b> } </b></p><p>
45、; p1=p1->link; </p><p><b> } </b></p><p><b> } </b></p><p> int menu_select( )</p><p><b> {</b></p><p><b>
46、; int sn;</b></p><p> printf(" 集合運算 \n");</p><p> printf("================================\n");</p><p> printf(" 1. 集合1為
47、 \n");</p><p> printf(" 2. 集合2為 \n");</p><p> printf(" 3. 集合1與集合2的并為 \n");</p><p> printf(" 4. 集合1與集合2的交
48、為 \n");</p><p> printf(" 5. 集合1與集合2的差為 \n");</p><p> printf(" 6. 集合2與集合1的差為 \n");</p><p> printf(
49、" 0. 退出管理系統(tǒng) \n");</p><p> printf("================================\n");</p><p> printf(" 請選擇 0-6 : \n");</p><p&
50、gt; for ( ; ;)</p><p><b> {</b></p><p> scanf( "%d", &sn);</p><p> if (sn < 0 || sn > 6)</p><p> printf("\n\t 輸入錯誤, 重選0-8 :
51、 ");</p><p><b> else</b></p><p><b> break;</b></p><p><b> }</b></p><p> return sn;</p><p><b> 界面如下:<
52、/b></p><p> void readdata(pointer *head);</p><p> void sort(pointer *head);</p><p> void disp(pointer *head);</p><p> void bing(pointer *head1,pointer *head2, po
53、inter *head3);</p><p> void jiao(pointer *head1,pointer *head2, pointer *head3);</p><p> void cha(pointer *head1,pointer *head2, pointer *head3);</p><p> int menu_select( );</
54、p><p> void main(){ </p><p> pointer *head1,*head2,*head3; </p><p> head1=(pointer *)malloc(sizeof(struct pointer)); </p><p> head1->link=NULL; </p><p>
55、; head2=(pointer *)malloc(sizeof(struct pointer)); </p><p> head2->link=NULL; </p><p> head3=(pointer *)malloc(sizeof(struct pointer)); </p><p> head3->link=NULL;</p>
56、;<p> printf("* 輸入集合1 *\n");</p><p> readdata(head1);</p><p> printf("************************************\n");</p><p> printf("輸
57、入集合2:\n"); </p><p> printf("************************************\n");</p><p> readdata(head2); </p><p> for ( ; ;) {</p><p> switch (menu_select( )
58、)</p><p><b> {</b></p><p><b> case 1:</b></p><p> printf("************************************\n");</p><p> printf("集合1為:\n&q
59、uot;); </p><p> printf("************************************\n");</p><p> sort(head1);</p><p> disp(head1); </p><p><b> break;</b></p>
60、<p><b> case 2:</b></p><p> printf("************************************\n");</p><p> printf("集合2為:\n"); </p><p> printf("*************
61、***********************\n");</p><p> sort(head2);</p><p> disp(head2); </p><p><b> break;</b></p><p><b> case 3:</b></p><p&g
62、t; printf("************************************\n");</p><p> printf("集合1與集合2的并為:\n"); </p><p> printf("************************************\n");</p><
63、p> bing(head1,head2,head3); </p><p> sort(head3);</p><p> disp(head3); </p><p> head3->link=NULL;</p><p><b> break;</b></p><p><b
64、> case 4:</b></p><p> printf("************************************\n");</p><p> printf("集合1與集合2的交為:\n"); </p><p> printf("*******************
65、*****************\n");</p><p> jiao(head1,head2,head3); </p><p> sort(head3);</p><p> disp(head3); </p><p> head3->link=NULL; </p><p><b>
66、 break;</b></p><p><b> case 5:</b></p><p> printf("************************************\n");</p><p> printf("集合1與集合2的差為:\n"); </p>
67、<p> printf("************************************\n");</p><p> cha(head1,head2,head3); </p><p> sort(head3);</p><p> disp(head3); </p><p> head3-&g
68、t;link=NULL; </p><p><b> break;</b></p><p><b> case 6:</b></p><p> printf("************************************\n");</p><p> print
69、f("集合2與集合1的差為:\n"); </p><p> printf("************************************\n");</p><p> cha(head2,head1,head3); </p><p> sort(head3);</p><p> d
70、isp(head3); </p><p> head3->link=NULL; </p><p><b> break;</b></p><p><b> case 0 :</b></p><p> printf("*\t 再見!*\n");</p>
71、<p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p><b> 四、界面實現(xiàn)</b></
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 實現(xiàn)兩個鏈表的合并數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---實現(xiàn)兩個鏈表的合并
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-- 循環(huán)單鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---雙向鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--鏈表
- 單鏈表的基本操作迷宮問題數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)(單鏈表)
- 《數(shù)據(jù)結(jié)構(gòu)與算法分析》課程設(shè)計順序表、單鏈表、順序棧、查找、排序算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--雙向循環(huán)鏈表的實現(xiàn)
- 雙向鏈表的建立插入刪除算法的實現(xiàn)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---城市鏈表的設(shè)計與實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---以鄰接鏈表的方式確定一個無向網(wǎng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---鏈表的創(chuàng)建、插入、刪除、修改
- 數(shù)據(jù)結(jié)構(gòu)鏈表的應用求兩個一元多項式之和
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---prim算法
評論
0/150
提交評論