課程設計鏈表的交叉合并課程設計_第1頁
已閱讀1頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  《兩個鏈表的交叉合并》</p><p><b>  課程設計論文</b></p><p>  學生姓名 </p><p>  學 號 </p><p>  所屬學院 信息工程學院 </p><p>  專

2、 業(yè) 計算機科學與技術 </p><p>  班 級 計算機 </p><p>  指導教師 </p><p>  教師職稱 講師 </p><p><b>  目 錄</b></p><p><

3、b>  前言1</b></p><p><b>  1.1設計背景1</b></p><p>  1.1.1數(shù)據(jù)結構簡介1</p><p>  1.1.2算法選擇的原因1</p><p>  1.2設計的原理和內容1</p><p><b>  正文2<

4、;/b></p><p>  2.1課程設計目的2</p><p>  2.2課程設計題目2</p><p>  2.2.1問題定義2</p><p>  2.2.2需求分析2</p><p><b>  2.3總體方案2</b></p><p><b

5、>  2.4運行環(huán)境3</b></p><p>  2.5設計流程圖3</p><p><b>  2.6設計思路3</b></p><p>  2.6.1.1線性表的單鏈表結構4</p><p>  2.6.1.2實現(xiàn)兩個鏈表的簡單合并算法4</p><p>  2.

6、6.1.3把元素插入到鏈表當中4</p><p>  2.6.1.4將元素從鏈表中刪除5</p><p>  2.6.2鏈表的合并5</p><p>  2.6.3鏈表的排序6</p><p>  2.6.4算法模塊設計7</p><p>  2.7程序運行分析10</p><p>

7、<b>  參考文獻11</b></p><p><b>  附錄11</b></p><p><b>  前言</b></p><p><b>  1.1設計背景</b></p><p>  1.1.1數(shù)據(jù)結構簡介</p><p&

8、gt;  數(shù)據(jù)結構是計算機程序設計的重要理論設計基礎, 它不僅是計算機學科的核心課程, 而 且成為其他理工專業(yè)的熱門選修課。 數(shù)據(jù)結構是計算機存儲、 組織數(shù)據(jù)的方式。 通常情況下, 精心選擇的數(shù)據(jù)結構可以帶來更高的運行或者存儲效率的算法。 比如在計算機中央處理器中,CPU接到一個中斷請求便會停下當前正在執(zhí)行的指令去 處理這個中斷請求完成中斷操作,&

9、#160;首先要做的就是保護現(xiàn)場。 保護現(xiàn)場需要將下一條指令的 地址指針和當前指令返回地址等重要的數(shù)據(jù)進行存儲。 在眾多的數(shù)據(jù)結構中, 這些重要的數(shù) 據(jù)被存儲到棧這個數(shù)據(jù)結構中。</p><p>  1.1.2算法選擇的原因</p><p>  在許多類型的程序的設計中, 數(shù)據(jù)結構的選擇是一個基本的設計考慮因素。 許多大

10、型系 統(tǒng)的構造經(jīng)驗表明, 系統(tǒng)實現(xiàn)的困難程度和系統(tǒng)構造的質量都嚴重的依賴于是否選擇了最優(yōu) 的數(shù)據(jù)結構。 許多時候, 確定了數(shù)據(jù)結構后, 算法就容易得到了。 有些時候事情也會反過來, 我們根據(jù)特定算法來選擇數(shù)據(jù)結構與之適應。 不論哪種情況, 選擇合適的數(shù)據(jù)結構都是非常 重要的。</p><p>  1.2設

11、計的原理和內容</p><p>  本次程序設計采用C語作為描述和實現(xiàn)算法的程序語言,主要的設計思路就是完成對 鏈表的操作,如鏈表的插入、刪除、取鏈表頂?shù)鹊龋@些操作都是通過C語言程序來實現(xiàn)的。最 后的結果就是運行程序時能夠完成對以上設計的操作。</p><p><b>  正文</b></p><p>  鏈表是一種物理存

12、儲單元上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序實現(xiàn)的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態(tài)生成。每個結點包括兩個部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結點地址的指針域。 相比于線性表順序結構,鏈表比較方便插入和刪除操作。</p><p><b>  2.1課程設計目的</b></p><p&g

13、t;  課程設計為學生提供了一個既動手又動腦,獨立實踐的機會將課本上的理論知識和實際有機的結合起來,鍛煉學生的分析解決實際問題的能力。提高學生適應實際,實踐編程的能力。</p><p><b>  2.2課程設計題目</b></p><p>  實現(xiàn)兩個鏈表的交叉合并。</p><p>  要求:(1)輸入兩個鏈表。</p>&l

14、t;p> ?。?)輸出兩個鏈表合并后的鏈表。</p><p><b>  2.2.1問題定義</b></p><p>  實現(xiàn)對兩個的鏈表的交叉合并,輸出線形表C用直接插入排序法對C進行升序排序,生成鏈表D,并輸出鏈表D。</p><p><b>  2.2.2需求分析</b></p><p>

15、;  鏈表是線性表的鏈式表示,由于它不要求邏輯上相鄰的元素在物理上相鄰,所以它沒有不需要像順序存儲結構在插入,刪除元素時移動大量的元素,只修改指針節(jié)點,并修改這些節(jié)點的指針域,查找過程中需平均一定指針域為表長的一半,而采用順序結構存儲線性表,插入和刪除元素操作需要平均移動表彰的一半元素。移動指針域操作比一動元素操作花費的時間少得多。</p><p><b>  2.3總體方案</b><

16、/p><p>  鏈表是一種特殊的線性表,具體表現(xiàn)在它的刪除,插入不用移動大量的元素,而且所用時間較少。這次設計的目的在于將它的快速,便捷體現(xiàn)出來。將程序分為了兩個部分程序設計和程序調試。首先查閱與鏈表合并有關的資料和文獻;其次設計項目的整體構架和算法;然后先用一個門程序設計語言進行算法的描述;最后調試程序。</p><p><b>  2.4運行環(huán)境</b></p

17、><p>  Win7 32位操作系統(tǒng)</p><p>  Microsoft Visual C++編譯器</p><p><b>  2.5設計流程圖</b></p><p><b>  2.6設計思路</b></p><p>  本課程設計將對鏈表的交叉合并和直接插入排

18、序的實現(xiàn)。首先將兩個鏈表進行交叉合并,合并的要求如下: </p><p>  建立兩個鏈表A和B,鏈表元素個數(shù)分別為m和n個。假設元素分別為(x1,x2,…xm),和(y1,y2, …yn)。把它們合并成一個線形表C,使得: </p><p>  當m>=n時,C=x1,y1,x2,y2,…xn,yn,…,xm </p><p>  當n>m時,C=y1

19、,x1,y2,x2,…ym,xm,…,yn</p><p><b>  輸出線形表C。 </b></p><p>  對合并的鏈表C進行直接插入排序,輸出鏈表D。</p><p><b>  2.6.1鏈表</b></p><p>  2.6.1.1線性表的單鏈表結構</p><

20、p>  ElemType data; </p><p>  struct Node *next; </p><p><b>  } Node; </b></p><p>  typedef struct Node *Linklist;</p><p>  2.6.1.2實現(xiàn)兩個鏈表的簡單合并算法</p&g

21、t;<p>  Void Mergelist_L(Linklist &La,Linklist &Lb,Linklist &Lc){</p><p>  //已知單線性鏈表La和Lb的元素按值非遞減排列。 </p><p>  //歸并La和Lb得到新的線性表Lc,Lc的數(shù)據(jù)元素也按非遞減排列。 </p><p>  InitLi

22、st(Lc); </p><p>  i=j=1;k=0; </p><p>  La_len=Listlength(La);Lb_len=ListLength(Lb); </p><p>  While((i<=La_len)&&(j<=Lb_len)){//La和Lb均非空 </p><p>  Getelem

23、(La, i, ai);Getelem(Lb, j, bj); </p><p>  If(ai<=bj){Listinsert(Lc, ++k ai);++i;} </p><p>  Else {Listinsert(Lc, ++k bj);++j;} </p><p>  } While(i<=La_len){</p><p&g

24、t;  Getelem(La, i++, ai);Listinsert(Lc, ++k, ai); </p><p><b>  } </b></p><p>  While(j<=Lb_len){</p><p>  Getelem(Lb, j++, bj);Listinsert(Lc, ++k, bj); </p>&l

25、t;p>  }}//Mergelist</p><p>  2.6.1.3把元素插入到鏈表當中</p><p>  在鏈表的合并中常用的操作是插入,要在線性表的兩個元素之間出入一個新的元素x。為了插入元素x,首先要生成一個數(shù)據(jù)域為x的結點,然后插入數(shù)據(jù)元素x。根據(jù)插入操作的邏輯定義,還要修改結點a中的指針域,令其指向結點x,而結點x中的指針域應指向結點b,從而實現(xiàn)3個元素a,b和x之

26、間的邏輯變化。上述指針修改語句描述為,</p><p>  s—>next=p—>next;p—>next=s;</p><p>  單鏈表中插入結點時的指針變化情況如圖所示: p </p><p>  圖圖圖圖1 1 1 1</p><p>  單鏈表中插入結點時的指針變化情

27、單鏈表中插入結點時的指針變化情單鏈表中插入結點時的指針變化情單鏈表中插入結點時的指針變化情 </p><p>  插入元素的代碼如下: </p><p>  status ListInsert_L(LinkList &L, int i,ElemType e){ </p><p>  //在帶頭結點的單鏈線性表L中第i個位置之前插入元素e</p>

28、<p><b>  p=l;j=0;</b></p><p>  while(p&&j<i-1){p=p->next;++j;}//尋找第i-1個結點</p><p>  if(!P||j>i-1)return ERROR; //i小于1或者大于表長+1</p><p>  s=(LinkList)

29、malloc(sizeof(LNode)); //生成新結點 </p><p>  s->date=e; s->next=p->next; //插入L中 </p><p>  p->next=s; </p><p>  return OK;</p><p>  }//ListInsert_L</p>&

30、lt;p>  2.6.1.4將元素從鏈表中刪除</p><p>  在線性表中刪除元素b時,為了在單鏈表中實現(xiàn)元素a、b和c之間邏輯關系的變化,僅需改動節(jié)點a中的指針域即可。假設p為指向節(jié)點a的指針,則修改指針的語句為</p><p>  p->next=p->next->next; </p><p>  在已知單鏈表中元素插入或插入或刪除的

31、確切位置的情況下,在單鏈表中插入 刪除一個結點時,僅需修改指針而不需要移動元素。刪除元素代碼如下:</p><p>  Status ListInsert_L(LinkList&L,int I,ElemType e){</p><p>  //在帶頭結點的單鏈表線性表L中,刪除第i個元素,并由e返回其值 </p><p><b>  p=L;j=0

32、;</b></p><p>  while (p&&j<i-1){//尋找第i-1個結點,并令p指向其前驅 </p><p>  p=p—>next;+j:</p><p><b>  }</b></p><p>  If(!(p—>next)||j>i-1)retur

33、n ERROR;//刪除位置不合理 </p><p>  q=p—>next;p—>next=q—>next;//刪除并釋放結點 </p><p>  e=q—>data; free(q);//釋放函數(shù) </p><p>  retrun OK; </p><p>  }//ListDelete_L</p>

34、<p>  2.6.2鏈表的合并</p><p>  鏈表的合并是將兩個鏈表合并成一個鏈表。假設兩個鏈表LA和LB頭指針為La,Lb,要歸并La和Lb得到鏈表Lc,pa和pb分別指向La和Lb表中當前待比較插入的結點, 而pc指向Lc當前最后一個結點,若pa—>data<pb—>data,則將pa所指結點鏈接到pc所指結點之后,,否則將pb所指結點鏈接到pc所指結點之后。當LA和L

35、B為非空表時,pa和pb分別指向La和Lb表中第一個結點,否則為空;pc指向空表Lc中的頭結點。由于鏈表的長度為隱含的,則第一個循環(huán)執(zhí)行的條件pa和pb皆非空,當其中一個為空時,說明有一個表的元素已歸并完,則是要將另一個表的剩余段鏈接在pc所指結點之在內部排序中,如果按照排序過程中依據(jù)的不同原則進行分類,則大致可以分為插入排序、交換排序、選擇排序、歸并排序、和計數(shù)排序5類。通常在排序過程中需進行一下兩種基本操作:</p>

36、<p> ?。?)比較兩個關鍵字的大??; </p><p> ?。?)將記錄從一個位置轉移到另一個位置。前一個基本操作是對于任何排序方法來說都是必要的,而后者可以通過改變記錄的儲存方式來來予以避免。且為了研究方便起見,設關鍵字均為整數(shù)。待排序、記錄的數(shù)</p><p>  typedef struct{ </p><p>  KeyType key;

37、 //關鍵字項</p><p>  InfoType otherinfo; //其他數(shù)據(jù)項 </p><p>  Typedef struct{ </p><p>  RedType r[MSXSIZE+1]; //r[0]閑置或用作哨兵單元 </p><p>  Int length;

38、 //順序表長度 </p><p>  }SqList //順序表類型</p><p>  本課程設計主要是應用直接插入排序將合并的鏈表進行排序。直接插入排序是一種最簡單的排序方法,他的基本操作是將一個記錄插入已排好序的有序表中,從而得到一個新的、數(shù)據(jù)記錄增一得有序表。一般情況下,第i趟直接插入排序的操作為:在含有i-1個記錄的有序子序列r[1

39、.i-1]中插入一個記錄r[i]后,變成含有i個記錄的有序子序列r1.i[];并且和順序表查找類似,在r[0]處設置監(jiān)視哨。在自i-1起往前收索的過程中,可以同時后已記錄。整個排序過程為進行n-1趟插入,即:先將序列中的第一個記錄看做一個有序的子序列,然后從第二個記錄起逐個插入,直至整個序列變成按關鍵字有序序列為止。</p><p>  void InsertSort (SqList&L){

40、 //對順序表L作直接插入排序。 </p><p>  For(i=2;i<=L.length;++i) </p><p>  If (LT(L.r[i].Key,L.r[i-1].Key)){ //“(”,需要將L.r[i]插入有序子表 </p><p>  L.r[0]=L.r[i] </p><

41、;p>  L.r[i]=L.r[i-1]; </p><p>  For (j=i-2;LT(L.r[0].Key,L.r[j].Key);--j) </p><p>  L.r[j+1]=L.r[j]; //記錄后移 </p><p>  L.r[j+1]=L.r[0]; //插入到

42、正確位</p><p><b>  }</b></p><p>  }//InsertSort</p><p>  2.6.3鏈表的排序</p><p>  排序是計算機程序設計中的一個重要操作,他的功能是將一個數(shù)據(jù)元素(或記錄)的任意序列,重新排列成一個按關鍵字有序的序列。由于待排序的記錄數(shù)量不同,使得排序過程中的存儲

43、器不同,可將排序方法分為兩大類;一類是內部排序,指的是待排序記錄存放在計算機隨機存儲器中進行的排序過程。另一類是外部排序,指的是待排序記錄的數(shù)量很大,,以至內存一次不能容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程。 在鏈表的操作中常用到兩個標準函數(shù)malloc和free。通常,在設有“指針”數(shù)據(jù)類型的高級語言中均存在與其相應的過程與函數(shù)。假設p和q是LinkList型的結點,則執(zhí)行p=(LinkList)malloc(size

44、of(LNode))的作用是由系統(tǒng)生成一個Lnode型的結點,同時將該結點的起始位置賦給指針變量p;反之執(zhí)行free的作用是由系統(tǒng)回收一個LNode型的結點,,回收后的空間可以備做再次生成結點時用。因此,單鏈表和順序存儲不同,它是一種動態(tài)結構。整個可用存儲空間可為多個鏈表共同享用,每個鏈表占用的空間不需要預先分配劃定,而是可以由系統(tǒng)即使生成。因此建立線性表的鏈式存儲結構的過程就是動態(tài)生成鏈表的</p><p> 

45、 Viod CreateList_L(LinkList&L,int n){</p><p>  //逆位序輸入n個元素的值,建立帶表頭結點的單鏈線性表L。 </p><p>  L=(LinkList)malloc(sizef(LNode)); </p><p>  L—>next=NULL;//先建立一個帶頭節(jié)點的單鏈表 </p>&l

46、t;p>  For(i=n;i>n;--i){ </p><p>  p=(LinkList)malloc(sizeof(LNode)), //生成新結點 </p><p>  scanf(&p—>data); </p><p>  p—>next=L—>next;L—>next=p; </p><p

47、><b>  } </b></p><p>  }//CrateList_L</p><p>  2.6.4算法模塊設計</p><p>  2.6.4.1創(chuàng)建鏈表模塊</p><p>  創(chuàng)建鏈表,首先由主函數(shù)輸入要創(chuàng)建的鏈表長度n,在由主函數(shù)將參數(shù)傳遞到創(chuàng)建鏈表函數(shù)creat,由For循環(huán)控制表節(jié)點的創(chuàng)建,由m

48、alloc函數(shù)開辟新的結點空間,創(chuàng)建鏈表結束后,由print函數(shù)將鏈表元素輸出。</p><p>  創(chuàng)建鏈表函數(shù)的實現(xiàn)代碼如下:</p><p>  #include<stdlib.h></p><p>  #include<stdio.h></p><p>  #include<conio.h><

49、/p><p>  #include<malloc.h></p><p>  #define L sizeof(struct Node)</p><p>  struct Node //結構體</p><p><b>  {</b></p><p>  long int number;<

50、;/p><p>  struct Node *next;</p><p><b>  };</b></p><p>  struct Node *create(int a)//鏈表創(chuàng)建函數(shù)</p><p><b>  { int n;</b></p><p>  struct

51、Node *p1, *p2, *head;</p><p>  head = NULL;</p><p><b>  n = 0;</b></p><p>  p2 = p1 = (struct Node *) malloc(L); //分配內存</p><p>  scanf("%ld", &

52、;p1->number);</p><p>  while (a)//錄入鏈表信息</p><p><b>  {</b></p><p>  n = n + 1;</p><p>  if (n == 1)</p><p>  head = p1;</p><p>

53、<b>  else</b></p><p>  p2->next = p1;</p><p><b>  p2 = p1;</b></p><p>  p1 = (struct Node *) malloc(L);</p><p>  if (a != 1)//分配內存</p>

54、<p>  scanf("%ld", &p1->number);</p><p>  a--; //控制輸入的個數(shù)</p><p><b>  }</b></p><p>  p2->next = NULL;</p><p>  return (head);</p

55、><p>  }//鏈表創(chuàng)建函數(shù)結束</p><p>  2.6.4.2輸出函數(shù)模塊</p><p>  待鏈表輸入完成后,定義單鏈表的頭結點*p,通過運用一個循環(huán)語句,將鏈表內的元素一一輸出在執(zhí)行程序界面上。</p><p>  void print(struct Node *head)//輸出函數(shù)</p><p>&l

56、t;b>  {</b></p><p>  struct Node *p;</p><p><b>  p = head;</b></p><p>  printf("數(shù)字:\n");</p><p>  if (head != NULL)</p><p> 

57、 do //循環(huán)實現(xiàn)輸出</p><p><b>  {</b></p><p>  printf("%ld", p->number);</p><p>  printf(" ");</p><p>  p

58、= p->next;</p><p>  } while (p != NULL);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  2.6.4.3鏈表交叉合并模塊</p><p>  struct Node *

59、inter_link(struct Node * chain1, int a, struct Node * chain2, int b) {</p><p><b>  int temp;</b></p><p>  struct Node *head, *p1, *p2, *pos;</p><p>  /*判斷a,b大小并合并 */<

60、/p><p>  if (a >= b) {</p><p>  head = p1 = chain1;</p><p>  p2 = chain2;</p><p>  } else/*b>a*/ {</p><p>  head = p1 = chain2;</p><p>  p2

61、 = chain1;</p><p>  temp = a, a = b, b = temp; /*交換a和b*/</p><p><b>  }</b></p><p>  /*下面把p1的每個元素插在p2相應元素之前,p1長a,p2長b*/</p><p>  pos = head; /*此時pos指向p1中的第一個

62、元素*/</p><p>  while (p2 != NULL) {//漂亮,蛇形插入</p><p>  p1 = p1->next;</p><p>  pos->next = p2;</p><p><b>  pos = p2;</b></p><p>  p2 = p2-&

63、gt;next;</p><p>  pos->next = p1;</p><p><b>  pos = p1;</b></p><p><b>  }</b></p><p>  return head;</p><p><b>  }</b>

64、;</p><p>  2.6.4.4鏈表排序模塊</p><p>  void InsertSort(struct Node *p, int m)//排序函數(shù)</p><p><b>  {</b></p><p>  int i, j, t;</p><p>  struct Node *k;

65、</p><p><b>  k = p;</b></p><p>  for (i = 0; i < m - 1; i++) {</p><p>  for (j = 0; j < m - i - 1; j++) {</p><p>  if (p->number > (p->next)-

66、>number) {</p><p>  t = p->number;</p><p>  p->number = (p->next)->number;</p><p>  (p->next)->number = t;</p><p><b>  }</b></p>

67、<p>  p = p->next;</p><p><b>  }</b></p><p><b>  p = k;</b></p><p><b>  }</b></p><p><b>  }</b></p><

68、p>  2.6.4.5主函數(shù)模塊</p><p>  int main()//main函數(shù)</p><p><b>  {</b></p><p>  struct Node *p1, *p2;</p><p><b>  int a;</b></p><p><

69、b>  int b;</b></p><p><b>  int h;</b></p><p>  printf("請輸入第一個鏈表:\n");</p><p>  printf("\n輸入鏈表的長度a:\n");</p><p>  scanf("%d

70、", &a);</p><p>  printf("請輸入鏈表數(shù)據(jù):");</p><p>  p1 = create(a);</p><p>  printf("\n你剛才輸入的第一個鏈表信息:\n ");</p><p>  print(p1);</p><p&

71、gt;  printf("\n 請輸入第二個鏈表:\n");</p><p>  printf("\n輸入鏈表的長度b:\n");</p><p>  scanf("%d", &b);</p><p>  printf("請輸入鏈表數(shù)據(jù):");</p><p&

72、gt;  p2 = create(b);</p><p>  printf("\n你剛才輸入的第二個鏈表的信息:\n");</p><p>  print(p2);</p><p>  p1 = inter_link(p1, a, p2, b);</p><p>  h = a + b;</p><p&

73、gt;  printf("\n合并后的鏈表\n:");</p><p>  print(p1);</p><p>  InsertSort(p1, h);</p><p>  printf("\n排序后的鏈表:\n");</p><p>  print(p1);</p><p>

74、<b>  return 0;</b></p><p><b>  }</b></p><p><b>  2.7程序運行分析</b></p><p>  打開軟件,根據(jù)提示先輸入鏈表a的長度,再輸入鏈表a的元素,然后輸出鏈表a。</p><p>  重復上述步驟輸出鏈表b。&

75、lt;/p><p>  之后程序完成對鏈表a、b合并,然后輸出鏈表c最后輸出排序后的鏈表.</p><p>  當輸入的元素長度超過鏈表的長度是只讀入并輸出與鏈表的長度相同的元素個數(shù)。</p><p><b>  總結</b></p><p>  這幾天的課程設計,讓我對以往課堂上學習到的理論知識得到了更深刻的理解,通過自己

76、設計算法,調試程序一系列操作,最后才能使程序正確無誤的運行,這一系列操作雖然對于我來說很復雜困難,但是通過查閱資料,以及同學的幫忙最終還是完成了本次課程設計。 以往對于鏈表的問題有些一知半解,有些東西也不是特別的明白清楚,有了這次課設感覺自己把以往認為很抽象的問題變得更具體,自己親手來做這次課程設計,感覺有些明白了《數(shù)據(jù)結構》這門課程其中的奧妙。我做兩個鏈表的合并,想象起來并不是特別的困難,用語言很容易的就可以表達出來,對于這次課設就是

77、編寫代碼來完成這一系列的操作,編寫代碼需要相當?shù)募有⌒?,一個字母的錯誤就能導致整個程序的錯誤,所以編寫代碼需要心細不能馬虎任何一個小的字母。我經(jīng)過查閱資料,詢問同學,多次的修改程序才使得程序最后的成功運行。有了這次課設,不僅讓我對這門課程有了新的認識和對知識的更深刻的理解,同時也磨練了自己的耐心和毅力。以后學習中還需要繼續(xù)努力學好這門課程。</p><p><b>  參考文獻</b><

78、;/p><p>  [1] 葉乃文,鄭曉紅. 數(shù)據(jù)結構[M]. 北京:人民郵電出版社,2001.5:75-90 </p><p>  [2] 趙國玲. C語言與數(shù)據(jù)結構[M]. 北京:電子工業(yè)出版社,1999.11:120-146 </p><p>  [3] 嚴蔚敏,吳偉民. 數(shù)據(jù)結構(C語言版)[M]. 北京:清華大學出版社,2006.10:44-52 <

79、/p><p>  [4] 蔡子經(jīng),施伯樂. 數(shù)據(jù)結構教程[M]. 上海:復旦大學出版社,2006.4:168-207</p><p>  [5]李春褒.數(shù)據(jù)結構教程(第二版)[M].北京:清華大學出版社,2007.3:22-46 </p><p>  [6] 嚴蔚敏.數(shù)據(jù)結構 C語言[M].北京: 清華大學出版社,2006.10: 110-135 </p>

80、<p>  [7] 嚴蔚敏,陳文博.數(shù)據(jù)結構及應用算法教程[M].北京:清華大學出版社,2003.6: 121-156 </p><p>  [8] 嚴蔚敏.數(shù)據(jù)結構習題[M].北京:清華大學出版社,2002.3: 67-98 </p><p><b>  附錄</b></p><p>  #include<stdlib.h

81、></p><p>  #include<stdio.h></p><p>  #include<conio.h></p><p>  #include<malloc.h></p><p>  #define L sizeof(struct Node)</p><p>  st

82、ruct Node //結構體</p><p><b>  {</b></p><p>  long int number;</p><p>  struct Node *next;</p><p><b>  };</b></p><p>  struct Node *cr

83、eate(int a)//鏈表創(chuàng)建函數(shù)</p><p><b>  {</b></p><p><b>  int n;</b></p><p>  struct Node *p1, *p2, *head;</p><p>  head = NULL;</p><p><

84、;b>  n = 0;</b></p><p>  p2 = p1 = (struct Node *) malloc(L); //分配內存</p><p>  scanf("%ld", &p1->number);</p><p>  while (a)//錄入鏈表信息</p><p><

85、;b>  {</b></p><p>  n = n + 1;</p><p>  if (n == 1)</p><p>  head = p1;</p><p><b>  else</b></p><p>  p2->next = p1;</p><

86、;p><b>  p2 = p1;</b></p><p>  p1 = (struct Node *) malloc(L);</p><p>  if (a != 1)//分配內存</p><p>  scanf("%ld", &p1->number);</p><p>  a-

87、-; //控制輸入的個數(shù)</p><p><b>  }</b></p><p>  p2->next = NULL;</p><p>  return (head);</p><p>  }//鏈表創(chuàng)建函數(shù)結束</p><p>  void print(struct Node *head)

88、//輸出函數(shù)</p><p><b>  {</b></p><p>  struct Node *p;</p><p><b>  p = head;</b></p><p>  printf("數(shù)字:\n");</p><p>  if (head !

89、= NULL)</p><p>  do//循環(huán)實現(xiàn)輸出</p><p><b>  {</b></p><p>  printf("%ld", p->number);</p><p>  printf(" ");</p><p>  p =

90、p->next;</p><p>  } while (p != NULL);</p><p>  printf("\n");</p><p><b>  }</b></p><p>  //鏈表的交叉合并算法</p><p>  struct Node * inter_

91、link(struct Node * chain1, int a, struct Node * chain2, int b) {</p><p><b>  int temp;</b></p><p>  struct Node *head, *p1, *p2, *pos;</p><p>  /*判斷a,b大小并合并 */</p>

92、<p>  if (a >= b) {</p><p>  head = p1 = chain1;</p><p>  p2 = chain2;</p><p>  } else/*b>a*/ {</p><p>  head = p1 = chain2;</p><p>  p2 = cha

93、in1;</p><p>  temp = a, a = b, b = temp; /*交換a和b*/</p><p><b>  }</b></p><p>  /*下面把p1的每個元素插在p2相應元素之前,p1長a,p2長b*/</p><p>  pos = head; /*此時pos指向p1中的第一個元素*/&l

94、t;/p><p>  while (p2 != NULL) {//漂亮,蛇形插入</p><p>  p1 = p1->next;</p><p>  pos->next = p2;</p><p><b>  pos = p2;</b></p><p>  p2 = p2->nex

95、t;</p><p>  pos->next = p1;</p><p><b>  pos = p1;</b></p><p><b>  }</b></p><p>  return head;</p><p><b>  }</b></

96、p><p>  //對合并好的鏈表進行排序</p><p>  void InsertSort(struct Node *p, int m)//排序函數(shù)</p><p><b>  {</b></p><p>  int i, j, t;</p><p>  struct Node *k;</p

97、><p><b>  k = p;</b></p><p>  for (i = 0; i < m - 1; i++) {</p><p>  for (j = 0; j < m - i - 1; j++) {</p><p>  if (p->number > (p->next)->nu

98、mber) {</p><p>  t = p->number;</p><p>  p->number = (p->next)->number;</p><p>  (p->next)->number = t;</p><p><b>  }</b></p><p

99、>  p = p->next;</p><p><b>  }</b></p><p><b>  p = k;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>&

100、lt;b>  //主函數(shù)</b></p><p>  int main()//main函數(shù)</p><p><b>  {</b></p><p>  struct Node *p1, *p2;</p><p><b>  int a;</b></p><p&g

101、t;<b>  int b;</b></p><p><b>  int h;</b></p><p>  printf("請輸入第一個鏈表:\n");</p><p>  printf("\n輸入鏈表的長度a:\n");</p><p>  scanf(&q

102、uot;%d", &a);</p><p>  printf("請輸入鏈表數(shù)據(jù):");</p><p>  p1 = create(a);</p><p>  printf("\n你剛才輸入的第一個鏈表信息:\n ");</p><p>  print(p1);</p>

103、<p>  printf("\n 請輸入第二個鏈表:\n");</p><p>  printf("\n輸入鏈表的長度b:\n");</p><p>  scanf("%d", &b);</p><p>  printf("請輸入鏈表數(shù)據(jù):");</p>

104、<p>  p2 = create(b);</p><p>  printf("\n你剛才輸入的第二個鏈表的信息:\n");</p><p>  print(p2);</p><p>  p1 = inter_link(p1, a, p2, b);</p><p>  h = a + b;</p>

105、<p>  printf("\n合并后的鏈表\n:");</p><p>  print(p1);</p><p>  InsertSort(p1, h);</p><p>  printf("\n排序后的鏈表:\n");</p><p>  print(p1);</p><

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論