數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---鏈表操作_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論