狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

雙向鏈表排序?qū)嶒?yàn)報(bào)告

| 瀏覽次數(shù):

 陳祎智

  實(shí)驗(yàn)報(bào)告<2> 1. 問題描述: 雙向鏈表的排序。

 要求:

 輸入一個(gè)雙向鏈表,顯示些雙向鏈表并對(duì)此雙向鏈表排序

 2.課題分析(結(jié)構(gòu)圖):

  3.數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì): typedef struct node { int info;

  struct node *llink,*rlink;

 }NODE; 雙向鏈表的排序 雙向鏈表存儲(chǔ)結(jié)構(gòu) 快速排序定義 輸入數(shù)據(jù)結(jié)點(diǎn)

 4.流程圖

 5.源程序:

 #include<iostream.h> #include<stdlib.h> #include <stdio.h> 開始 創(chuàng)建鏈表 初始化鏈表 從中間分成兩部 排序鏈表 插入 10 個(gè)值 輸出排序鏈表 終止

 typedef struct Link/*雙向鏈表結(jié)構(gòu)體*/ {

 int data;

 struct Link *lift;

 struct Link *right; }linkx,*linky; linky Init();/*建立雙向鏈表*/ void PrLink(linky p);/*輸出雙向鏈表*/ linky Sort(linky head);/*對(duì)雙向鏈表排序*/ linky S head,linky one,linky two);/*任意交換雙向鏈表兩個(gè)結(jié)點(diǎn)的地址*/ void main(void) {

 linky head;

 head=Init();

 head=Sort(head);

 PrLink(head); } linky (Init())/*建立鏈表*/ {

 linky p,q,head;

 int n=0;

 head=p=q=(linky)malloc(sizeof(linkx));

  printf("排序前的鏈表: ");

 scanf("%d",&p->data);/*輸入數(shù)據(jù)*/

 head->lift=NULL;

 n++;

 while(n!=10)/*一直輸入到規(guī)定的數(shù)字個(gè)數(shù)停止*/ {

  q=p;

  p=(linky)malloc(sizeof(linkx));

  scanf("%d",&p->data);/*輸入數(shù)據(jù)*/

  q->right=p;

  p->lift=q;

  n++; }

 p->right=NULL;

 return(head); } linky S head,linky one,linky two)/*任意交換兩個(gè)結(jié)點(diǎn)*/ {linky temp;

 if(one->lift==NULL&&two->right==NULL)/*首和尾巴的交換*/

 {

  if(one->right==two)/*只有兩個(gè)結(jié)點(diǎn)的情況下*/

 {

 two->right=one;

 two->lift=NULL;

 one->lift=two;

 one->right=NULL;

 head=two;

  }

  else/*有間隔的首尾交換*/

  {

  one->right->lift=two;

  two->lift->right=one;

  two->right=one->right;

  one->lift=two->lift;

  two->lift=one->right=NULL;

  head=two;/*尾結(jié)點(diǎn)成為頭結(jié)點(diǎn)*/

  }

 }

 else if(two->right==NULL)/*尾和任意一個(gè)交換*/

  {

 if(one->right==two)/*交換最后兩個(gè)結(jié)點(diǎn)*/

 {

 one->lift->right=two;

  two->lift=one->lift;

 two->right=one;

 one->lift=two;

 one->right=NULL;

 }

 else/*和前面其他結(jié)點(diǎn)交換*/

 {

 temp=two->lift;

 temp->right=one;

 one->lift->right=two;

 one->right->lift=two;

 two->lift=one->lift;

 two->right=one->right;

 one->lift=temp;

 one->right=NULL;

 }

  }

 else if(one->lift==NULL)/*頭和任意一個(gè)交換*/

 {

 if(one->right==two)/*交換頭兩個(gè)結(jié)點(diǎn)*/

  {

  two->right->lift=one;

 one->right=two->right;

  one->lift=two;

  two->right=one;

  two->lift=NULL;

  head=two;

  }

 else/*頭結(jié)點(diǎn)和后面其他結(jié)點(diǎn)交換*/

  {

 temp=one->right;

 temp->lift=two;

 one->lift=two->lift;

 one->right=two->right;

 two->lift->right=one;

 two->right->lift=one;

 two->right=temp;

 two->lift=NULL;

  head=two;/*交換的結(jié)點(diǎn)成為頭結(jié)點(diǎn)*/

  }

 }

 else/*當(dāng)中的任意兩個(gè)交換*/

  {

  if(one->right==two)/*交換連在一起的兩個(gè)結(jié)點(diǎn)*/

 {

  temp=one->lift;

  one->lift->right=two;

  one->right->lift=two;

  one->lift=two;

  one->right=two->right;

  two->right->lift=one;

  two->right=one;

  two->lift=temp;

  }

  else/*交換隔開的兩個(gè)結(jié)點(diǎn)*/

  {

  one->lift->right=two;

  one->right->lift=two;

  one->lift=two->lift;

  temp=one->right;

  one->right=two->right;

  two->lift->right=one;

  two->right->lift=one;

  two->right=temp;

  two->lift=one->lift;

  }

  }

 return(head); } linky Sort(linky head)/*對(duì)鏈表排序*/ {

 linky i,j,t,p;

 int max;

 p=head;

 for(i=p;i->right!=NULL;i=i->right)/*用選擇法的思想對(duì)這些結(jié)點(diǎn)排序*/

  {

 max=i->data;

 for(j=i->right;j!=NULL;j=j->right)

  if(j->data<max)

  {

  max=j->data;

  t=j;

  }

 if(max!=i->data)/*假如沒有找到比 i 小的結(jié)點(diǎn)*/

 {

 head=S);/*因?yàn)樽罱K返回的是頭結(jié)點(diǎn),而頭結(jié)點(diǎn)又有可能變化,所以每次頭結(jié)點(diǎn)返回*/

 i=t;

  }

  }

 return(head); } void PrLink(linky p)/*輸出鏈表*/ {

 linky q;

 printf("排序后: ");

 do

 {

  q=p;

  printf("%d ",p->data);

  p=p->right;

  free(q);/*釋放輸出結(jié)點(diǎn)*/

 }

 while(p!=NULL);

 }

 6.調(diào)試記錄:

  第一次輸入 136 134 158 123 197 124 156 170 103 101 實(shí)現(xiàn)排序

  第二次調(diào)試 輸入 12367 15842 12564 13729 49875 1546 15423 15794 54612 1543

  7.軟件說明

 程序調(diào)試運(yùn)行成功后,排序前隨機(jī)輸入十個(gè)不同的數(shù)值,快速排序后將由小到大輸出這十個(gè)數(shù)值的排序。如上圖說明

 . 8. 設(shè)計(jì)總結(jié)

 一周的上機(jī)實(shí)踐課程結(jié)束了,我們也按要求完成了實(shí)踐內(nèi)容,這次上機(jī)實(shí)踐,使我鞏固了所學(xué)的計(jì)算機(jī)知識(shí),對(duì) C 語言知識(shí)有了更進(jìn)一步的了解。但是知識(shí)是學(xué)無止境的,我相信,這次的課程設(shè)計(jì)對(duì)我以后在計(jì)算機(jī)編程這方面有很好的指導(dǎo)意義,讓我通過這次實(shí)踐了解到計(jì)算機(jī)編程的冰山一角。我此次設(shè)計(jì)的雙向鏈表的排序程序雖然比較典型,對(duì)我們認(rèn)識(shí)數(shù)據(jù)結(jié)構(gòu)和 C 程序設(shè)計(jì)卻有很好的幫助。

 在設(shè)計(jì)中我遇到了很多編程方面的難點(diǎn),在老師的辛勤指導(dǎo)和同學(xué)們的熱心幫助下,我慢慢的找到了解決問題的方法。在老師的指導(dǎo)下我學(xué)到很多實(shí)用的知識(shí),在此表示感謝!感謝老師和同學(xué)們的幫助和支持。

推薦訪問: 雙向 排序 鏈表

【雙向鏈表排序?qū)嶒?yàn)報(bào)告】相關(guān)推薦

工作總結(jié)最新推薦

NEW