版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 《數(shù)據(jù)結(jié)構(gòu)》</b></p><p><b> 課</b></p><p><b> 程</b></p><p><b> 設(shè)</b></p><p><b> 計(jì)</b></p>
2、<p><b> 報(bào)</b></p><p><b> 告</b></p><p> 題 目: _________鏈表操作__________</p><p> 專業(yè)班級(jí): _______ ________</p><p> 姓 名: __
3、______ _________</p><p> 學(xué) 號(hào): ______ ______</p><p> 設(shè)計(jì)時(shí)間: _______ _______</p><p> 指導(dǎo)教師: _________ _________</p><p><b>
4、 一、設(shè)計(jì)題目</b></p><p><b> 鏈表操作 </b></p><p><b> 一、 設(shè)計(jì)目的 </b></p><p> 1.掌握線性鏈表的建立。 </p><p> 2.掌握線性鏈表的基本操作。 </p><p> 二、設(shè)計(jì)內(nèi)容和要
5、求 </p><p> 利用鏈表的插入運(yùn)算建立線性鏈表,然后實(shí)現(xiàn)鏈表的查找、刪除、計(jì)數(shù)、輸出、排序、逆置等運(yùn)算,插入、刪除、查找、計(jì)數(shù)、輸出、排序、逆置要單獨(dú)寫成函數(shù),并能在屏幕上輸出操作前后的結(jié)果。</p><p> 二、運(yùn)行環(huán)境(軟、硬件環(huán)境)</p><p><b> 硬件環(huán)境:</b></p><p>&l
6、t;b> 軟件環(huán)境:</b></p><p> Microsoft Visual C++ 6.0</p><p><b> 三、算法設(shè)計(jì)思想</b></p><p> 插入:先創(chuàng)建一個(gè)結(jié)點(diǎn)用來存儲(chǔ)要插入的元素,然后,通過單鏈表的指針功能,修改指針的指向來將新創(chuàng)建的結(jié)點(diǎn)插入該單鏈表中。</p><p&
7、gt; 刪除:通過循環(huán)找到要?jiǎng)h除的位置,然后也是通過修改指針來將該位置的元素刪除。</p><p> 查找:聲明三個(gè)變量和一個(gè)數(shù)組,其中兩變量分別表示查找元素的個(gè)數(shù)和在鏈表中出現(xiàn)的位置,一數(shù)組儲(chǔ)存該元素在鏈表之中的位置,另外一變量作數(shù)組下標(biāo)的遞增之用。通過循環(huán)和if語句的條件比較來確定元素的位置和在鏈表之中的出現(xiàn)次數(shù),保存于數(shù)組中,最后可將該元素在鏈表中的位置通過數(shù)組輸出。</p><p&
8、gt; 計(jì)數(shù):用一結(jié)構(gòu)體數(shù)組儲(chǔ)存鏈表中各元素和其出現(xiàn)的次數(shù)然后通過雙重循環(huán)來確定各元素的個(gè)數(shù)。</p><p> 排序:可將簡(jiǎn)單的選擇排序?qū)⒀h(huán)條件變作指針表示得到。</p><p> 逆置:用循環(huán)找到單鏈表的倒數(shù)第二個(gè)結(jié)點(diǎn)和最后一個(gè)結(jié)點(diǎn),再聲明一個(gè)新的結(jié)點(diǎn)將其指向最后一個(gè)結(jié)點(diǎn),然后令鏈表的倒數(shù)第二個(gè)結(jié)點(diǎn)空(由此作為循環(huán)的截止條件),在用外層循環(huán)一步步將鏈表結(jié)點(diǎn)倒序接到以新增結(jié)點(diǎn)為頭
9、結(jié)點(diǎn)的鏈表上。</p><p><b> 四、流程圖</b></p><p><b> 五、算法設(shè)計(jì)與分析</b></p><p> 插入:先創(chuàng)建一個(gè)結(jié)點(diǎn)用來存儲(chǔ)要插入的元素,然后,通過單鏈表的指針功能,修改指針的指向來將新創(chuàng)建的結(jié)點(diǎn)插入該單鏈表中。</p><p><b> 該算
10、法簡(jiǎn)單易行。</b></p><p> 刪除:通過循環(huán)找到要?jiǎng)h除的位置,然后也是通過修改指針來將該位置的元素刪除。</p><p> 查找:聲明三個(gè)變量和一個(gè)數(shù)組,其中兩變量分別表示查找元素的個(gè)數(shù)和在鏈表中出現(xiàn)的位置,一數(shù)組儲(chǔ)存該元素在鏈表之中的位置,另外一變量作數(shù)組下標(biāo)的遞增之用。通過循環(huán)和if語句的條件比較來確定元素的位置和在鏈表之中的出現(xiàn)次數(shù),保存于數(shù)組中,最后可將該
11、元素在鏈表中的位置通過數(shù)組輸出。</p><p> 計(jì)數(shù):用一結(jié)構(gòu)體數(shù)組儲(chǔ)存鏈表中各元素和其出現(xiàn)的次數(shù)然后通過雙重循環(huán)來確定各元素的個(gè)數(shù)。</p><p> 此算法不足之處是會(huì)刪除重復(fù)的結(jié)點(diǎn),導(dǎo)致計(jì)數(shù)前后鏈表變化。</p><p> 排序:可將簡(jiǎn)單的選擇排序?qū)⒀h(huán)條件變作指針表示得到。</p><p> 逆置:用循環(huán)找到單鏈表的倒數(shù)第
12、二個(gè)結(jié)點(diǎn)和最后一個(gè)結(jié)點(diǎn),再聲明一個(gè)新的結(jié)點(diǎn)將其指向最后一個(gè)結(jié)點(diǎn),然后令鏈表的倒數(shù)第二個(gè)結(jié)點(diǎn)空(由此作為循環(huán)的截止條件),在用外層循環(huán)一步步將鏈表結(jié)點(diǎn)倒序接到以新增結(jié)點(diǎn)為頭結(jié)點(diǎn)的鏈表上。</p><p><b> 六、源代碼</b></p><p> #include <stdio.h></p><p> #include &l
13、t;malloc.h></p><p> #include <stdlib.h></p><p> typedef struct node</p><p><b> {</b></p><p><b> int data;</b></p><p>
14、 struct node *next;</p><p> }node,*linklist;</p><p><b> //創(chuàng)建鏈表</b></p><p> void creatlist(linklist &l) </p><p><b> {</b></p>&l
15、t;p> linklist p,r;</p><p> l=(linklist)malloc(sizeof(node));</p><p> l->next=NULL;</p><p><b> r=l;</b></p><p> printf("輸入鏈表以0結(jié)束\n");<
16、;/p><p><b> for(;;)</b></p><p><b> {</b></p><p> p=(linklist)malloc(sizeof(node));</p><p> scanf("%d",&p->data);</p>&l
17、t;p> r->next=p;</p><p> if (p->data!=0)</p><p><b> r=p;</b></p><p><b> else</b></p><p><b> {</b></p><p>&
18、lt;b> free(p);</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> r->next=NULL;</p><p&g
19、t;<b> }</b></p><p><b> //將e插到第i位</b></p><p> void insertlist(linklist &l,int i,int e) </p><p><b> {</b></p><p><b> in
20、t j;</b></p><p> linklist s,f;</p><p> s=(linklist)malloc(sizeof(node));</p><p> f=(linklist)malloc(sizeof(node));</p><p> f->data=e;</p><p>&
21、lt;b> s=l;</b></p><p> for (j=1;j<i;j++)</p><p><b> {</b></p><p> s=s->next;</p><p><b> }</b></p><p> f->ne
22、xt=s->next;</p><p> s->next=f;</p><p><b> }</b></p><p><b> //查找元素e</b></p><p> void Searchelem(linklist l,int e)</p><p>&
23、lt;b> {</b></p><p> int counti=0,counte=0,s=0;</p><p> int a[100];</p><p> while (l->next)</p><p><b> {</b></p><p><b>
24、counti++;</b></p><p> if (l->next->data==e)</p><p><b> {</b></p><p><b> counte++;</b></p><p> a[s++]=counti;</p><p>
25、;<b> }</b></p><p> l=l->next;</p><p><b> }</b></p><p> if(counte==0)</p><p><b> {</b></p><p> printf("該鏈表
26、中無此數(shù)!\n");</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("該鏈表中此元素出現(xiàn)了%d次,在第 ",counte);</
27、p><p> for(int i = 0 ;i<s;i++)</p><p><b> {</b></p><p> printf("%d ",a[i]);</p><p><b> }</b></p><p> printf("次出
28、現(xiàn)!\n");</p><p><b> }</b></p><p><b> }</b></p><p><b> //刪除第i位</b></p><p> void deletelist(linklist &l,int i)</p>
29、<p><b> {</b></p><p><b> int j;</b></p><p> linklist p,q;</p><p> p=(linklist)malloc(sizeof(node));</p><p> q=(linklist)malloc(sizeof(
30、node));</p><p><b> p=l;</b></p><p> for(j=1;j<i;j++)</p><p><b> {</b></p><p> p=p->next;</p><p><b> }</b><
31、;/p><p> q=p->next;</p><p> p->next=q->next;</p><p><b> free(q);</b></p><p><b> }</b></p><p><b> //計(jì)數(shù)</b><
32、;/p><p> void listcount(linklist l)</p><p><b> {</b></p><p><b> struct a</b></p><p><b> {</b></p><p><b> int x;
33、</b></p><p><b> int y;</b></p><p><b> }a[100];</b></p><p><b> int m=0;</b></p><p> linklist p,q;</p><p> p=(
34、linklist)malloc(sizeof(node));</p><p> q=(linklist)malloc(sizeof(node));</p><p> while (l->next)</p><p><b> { </b></p><p> a[m].x = l->next->da
35、ta;</p><p> a[m].y = 1;</p><p> p=l->next;</p><p> while (p->next)</p><p><b> {</b></p><p> if (l->next->data==p->next->
36、data)</p><p><b> {</b></p><p> p->next=p->next->next;</p><p><b> a[m].y++;</b></p><p><b> }</b></p><p><
37、;b> else</b></p><p><b> {</b></p><p> p=p->next;</p><p><b> }</b></p><p><b> }</b></p><p><b>
38、m++;</b></p><p> l=l->next;</p><p><b> }</b></p><p> printf("此鏈表中:\n");</p><p> for (int i=0;i<m;i++)</p><p><b>
39、; {</b></p><p> printf(" %d出現(xiàn)%d次\n",a[i].x,a[i].y);</p><p><b> }</b></p><p><b> }</b></p><p><b> //排序</b></
40、p><p> void listsort(linklist &l)</p><p><b> { </b></p><p> linklist p,q;</p><p><b> int m;</b></p><p><b> p=l;</b&g
41、t;</p><p> while(p->next)</p><p><b> {</b></p><p> q=p->next;</p><p> while(q->next)</p><p><b> {</b></p><
42、p> if(p->next->data>q->next->data)</p><p><b> {</b></p><p> m=p->next->data;</p><p> p->next->data=q->next->data;</p><
43、p> q->next->data=m;</p><p><b> }</b></p><p><b> else</b></p><p> q=q->next;</p><p><b> }</b></p><p>
44、p=p->next;</p><p><b> }</b></p><p><b> }</b></p><p><b> //逆置</b></p><p> void inverse(linklist &l)</p><p>&l
45、t;b> {</b></p><p> linklist p,q,r;</p><p> p=(linklist)malloc(sizeof(node));</p><p> q=(linklist)malloc(sizeof(node));</p><p> r=(linklist)malloc(sizeof(n
46、ode));</p><p><b> p=l;</b></p><p> q->next=NULL;</p><p><b> r=q;</b></p><p> while (p->next)</p><p><b> {</b>
47、;</p><p> while(p->next->next)</p><p><b> {</b></p><p> p=p->next;</p><p><b> }</b></p><p> q->next=p->next;<
48、;/p><p> q=q->next;</p><p> p->next=NULL;</p><p><b> p=l;</b></p><p><b> }</b></p><p><b> l=r;</b></p>&
49、lt;p><b> }</b></p><p><b> //輸出</b></p><p> void printlist(linklist l)</p><p><b> {</b></p><p> while(l->next)</p>
50、<p><b> {</b></p><p> printf("%d ",l->next->data);</p><p> l=l->next;</p><p><b> }</b></p><p> printf("\n"
51、;);</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p><b> int e,n;</b></p><p> linklist l;</p>&
52、lt;p> l=(linklist)malloc(sizeof(node));</p><p> l->next=NULL;</p><p> creatlist(l);</p><p> system("cls");</p><p><b> int x;</b></p&
53、gt;<p><b> do{</b></p><p> printf("初始化:");</p><p> printlist(l);</p><p> printf ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");</p>
54、<p> printf ("|* 1.插入 *|\n");</p><p> printf ("|* 2.刪除 *|\n");</p><p> printf ("|* 3.查
55、找 *|\n");</p><p> printf ("|* 4.計(jì)數(shù) *|\n");</p><p> printf ("|* 5.排序 *|\n");</p><p>
56、; printf ("|* 6.逆置 *|\n");</p><p> printf ("|* 7.退出 *|\n");</p><p> printf ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
57、~~~~~~~~~~\n");</p><p> printf ("輸入選擇:");</p><p> scanf("%d",&x);</p><p> switch (x)</p><p><b> {</b></p><p>&
58、lt;b> case 1:</b></p><p> printf("前:");</p><p> printlist(l);</p><p> printf("依次輸入插入元素和插入位置:");</p><p> scanf("%d %d",&e
59、,&n);</p><p> insertlist(l,n,e);</p><p> printf("后:");</p><p> printlist(l);</p><p><b> break;</b></p><p><b> case 2:&
60、lt;/b></p><p> printf("前:");</p><p> printlist(l);</p><p> printf("請(qǐng)輸入要?jiǎng)h除元素的位置:");</p><p> scanf("%d",&n);</p><p>
61、 deletelist(l,n);</p><p> printf("后:");</p><p> printlist(l);</p><p><b> break;</b></p><p><b> case 3: </b></p><p>
62、 printf("前:");</p><p> printlist(l);</p><p> printf("請(qǐng)輸入要查找的數(shù):");</p><p> scanf("%d",&e);</p><p> Searchelem(l,e);</p><
63、;p> printf("后:");</p><p> printlist(l);</p><p><b> break;</b></p><p><b> case 4:</b></p><p> listcount(l);</p><p>
64、;<b> break;</b></p><p><b> case 5:</b></p><p> printf("前:");</p><p> printlist(l);</p><p> listsort(l);</p><p> pri
65、ntf("后:");</p><p> printlist(l);</p><p><b> break;</b></p><p><b> case 6:</b></p><p> printf("前:");</p><p>
66、 printlist(l);</p><p> inverse(l);</p><p> printf("后:");</p><p> printlist(l);</p><p><b> break;</b></p><p><b> case 7:&l
67、t;/b></p><p><b> exit(0);</b></p><p><b> }</b></p><p> getchar();</p><p> if (getchar())</p><p><b> {</b></p
68、><p> system("cls");</p><p><b> }</b></p><p> }while(x>0&&x<7);</p><p><b> }</b></p><p><b> 七、運(yùn)行結(jié)果分
69、析</b></p><p><b> 輸入:</b></p><p><b> 插入:</b></p><p><b> 逆置:</b></p><p><b> 排序:</b></p><p><b>
70、; 計(jì)數(shù):</b></p><p><b> 刪除:</b></p><p><b> 查找:</b></p><p><b> 八、收獲及體會(huì)</b></p><p> 對(duì)于數(shù)據(jù)結(jié)構(gòu)里單鏈表部分的內(nèi)容還是非常熟悉的,在學(xué)數(shù)據(jù)結(jié)構(gòu)這門課的時(shí)候,由于一開始沒
71、聽懂,老師講到后面我還在看前面,而且老參不透,以至于前面的單鏈表的部分花了大量時(shí)間,但這也是有好處的,鉆研的時(shí)間多了到后來就非常的熟了,在對(duì)而后的課程中理解的速度就加快了不少。另外也不容易遺忘,數(shù)據(jù)結(jié)構(gòu)其他部分的內(nèi)容忘得比較多,而唯獨(dú)此部分的內(nèi)容忘得較少,所以就導(dǎo)致了我一開完課設(shè)的選題后就立馬選了這個(gè),其他的忘了較多感覺難以上手。其實(shí)課設(shè)的目的其實(shí)是鞏固已學(xué)的知識(shí),忘了的就更應(yīng)該去搞搞,把遺忘的知識(shí)撿起來。但是我的性格決定了我要選這個(gè),
72、我追求的是一種輕快簡(jiǎn)單,想更輕松更容易的做完它。其實(shí)為此我也非常慚愧,在下面一定會(huì)抽時(shí)間把其他忘了的不起來!</p><p> 單鏈表的插入、創(chuàng)建、刪除和輸出以前作過很多次了,而且書本上基本上都有,大體上還是非常的熟的,基本上一上手就可以寫,像其他的查找、計(jì)數(shù)、排序、逆置這些平時(shí)編的比較的少,這這些拿到手上就需要花時(shí)間去思考去琢磨了查找、逆置寫的時(shí)候都還好,而且調(diào)試的時(shí)候也十分的順利。但是排序的時(shí)候被堵到了,本
73、來的想法是用指針來進(jìn)行結(jié)點(diǎn)的“互換”,想了一陣子,不知道用那種排序方法好,最后選用了自己腦海中熟悉的一種排序方法,這種方法叫什么排序我也不知道,反正是搞出來了,我覺的應(yīng)該沒問題,但調(diào)試時(shí)總有問題,我花了很長(zhǎng)時(shí)間都沒解決,但由于時(shí)間緊迫,所以就放棄了,改用了直接對(duì)結(jié)點(diǎn)的數(shù)據(jù)進(jìn)行交換,這種方法就容易多了,一下就解決了。還有就是計(jì)數(shù)的時(shí)候,我編寫的算法要?jiǎng)h除一部分結(jié)點(diǎn),導(dǎo)致計(jì)數(shù)前后鏈表該變了,這一問題也沒能解決!</p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---鏈表操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---雙向鏈表
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-- 循環(huán)單鏈表
- 單鏈表的基本操作迷宮問題數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-雙鏈表創(chuàng)建與演示設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--雙向循環(huán)鏈表的創(chuàng)建及相關(guān)操作的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--雙向循環(huán)鏈表的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---skiplist基本操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---城市鏈表的設(shè)計(jì)與實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---鏈表的創(chuàng)建、插入、刪除、修改
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---鏈表的維護(hù)與文件形式的保存
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論