<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > C語(yǔ)言的那些小秘密之鏈表(一)

C語(yǔ)言的那些小秘密之鏈表(一)

作者: 時(shí)間:2015-04-11 來(lái)源:網(wǎng)絡(luò ) 收藏

  ,一個(gè)對于學(xué)習過(guò)的人都是再熟悉不過(guò)的概念了,可能很多學(xué)習過(guò)的人都覺(jué)得沒(méi)什么值得太在意的地方,可是如果你走進(jìn)linux內核,去看看linux內核里面鏈表的實(shí)現方式,你不得不為之驚嘆??赡苡腥藭?huì )覺(jué)得linux內核鏈表實(shí)現方式僅此而已,但是你要知道,如果你沒(méi)有見(jiàn)到這樣的實(shí)現方式之前,能寫(xiě)出那樣的鏈表嘛?所以在寫(xiě)鏈表的文章時(shí),我深知自己不可能用一篇文章來(lái)講解完鏈表的知識點(diǎn),所以我特地分為三個(gè)部分(單鏈表、雙鏈表、linux內核鏈表,而其中linux內核鏈表單獨拿出來(lái)講是因為它的特殊性,在后面的博客中我們再來(lái)細談它)來(lái)進(jìn)行講解,盡可能用簡(jiǎn)短的文字描述加上簡(jiǎn)單易懂的代碼來(lái)向讀者講解我所理解的鏈表,希望我所講的鏈表能都對你有所幫助。接下來(lái)言歸正傳,開(kāi)始我們的鏈表之旅。

本文引用地址:http://dyxdggzs.com/article/272381.htm

  那么什么是鏈表呢?鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序實(shí)現的。鏈表由一系列結點(diǎn)組成,即鏈表中的每個(gè)元素,結點(diǎn)可以在運行時(shí)動(dòng)態(tài)生成。每個(gè)結點(diǎn)均由兩個(gè)部分所組成:一個(gè)是存儲數據元素的數據域,另一個(gè)是存儲相鄰結點(diǎn)地址的指針域。相比于線(xiàn)性表順序結構,鏈表比較方便插入和刪除操作。

  對于鏈表我們可以將其分為單鏈表、雙向鏈表和循環(huán)鏈表等。首先我們先講講單鏈表。

  所謂單鏈表,是指數據結點(diǎn)是單向排列的。一個(gè)單鏈表結點(diǎn),其結構類(lèi)型分為兩部分:

  1、數據域:用來(lái)存儲本身數據

  2、指針域:用來(lái)存儲下一個(gè)結點(diǎn)地址或者說(shuō)指向其直接后繼的指針。

  如下圖所示:



  注意:如果有圖中的紅色箭頭部分,則變?yōu)榱藛蜗蜓h(huán)鏈表。

  那什么又是雙鏈表呢?雙向鏈表其實(shí)是單鏈表的改進(jìn)。當我們對單鏈表進(jìn)行操作時(shí),有時(shí)你要對某個(gè)結點(diǎn)的直接前驅進(jìn)行操作時(shí),又必須從表頭開(kāi)始查找。這是由單鏈表結點(diǎn)的結構所限制的。因為單鏈表每個(gè)結點(diǎn)只有一個(gè)存儲直接后繼結點(diǎn)地址的鏈域,那么能不能定義一個(gè)既有存儲直接后繼結點(diǎn)地址的鏈域,又有存儲直接前驅結點(diǎn)地址的鏈域的這樣一個(gè)雙鏈域結點(diǎn)結構呢?這就是雙向鏈表。

  在雙向鏈表中,結點(diǎn)除含有數據域外,還有兩個(gè)鏈域,一個(gè)存儲直接后繼結點(diǎn)地址,一般稱(chēng)之為右鏈域;一個(gè)存儲直接前驅結點(diǎn)地址,一般稱(chēng)之為左鏈域。

  如下圖所示:



  注意:如果有圖中的紅色箭頭部分,則變?yōu)榱穗p向循環(huán)鏈表。

  看完了上面的介紹之后,我想讀者對于鏈表算是有了一個(gè)大致的了解。那么接下來(lái)我們的任務(wù)就是學(xué)習如何使用鏈表,我們從最簡(jiǎn)單的代碼開(kāi)始,教會(huì )讀者來(lái)學(xué)習使用鏈表,首先我們來(lái)看一個(gè)單鏈表的創(chuàng )建。為了便于講解,我在此就把所有的代碼放到一個(gè)源文件中來(lái)執行了,當然讀者在實(shí)際編寫(xiě)代碼的過(guò)程中不管是為了維護還是閱讀都應該使用頭文件,而不要在一個(gè)源文件中一條龍似地寫(xiě)到底。

  #include

  #include

  #include

  #include

  #define N 3

  #undef _EXAM_ASSERT_TEST_ //禁用

  //#define _EXAM_ASSERT_TEST_ //啟用

  #ifdef _EXAM_ASSERT_TEST_ //啟用斷言測試

  void assert_report( const char * file_name, const char * function_name, unsigned int line_no )

  {

  printf( "n[EXAM]Error Report file_name: %s, function_name: %s, line %un",

  file_name, function_name, line_no );

  abort();

  }

  #define ASSERT_REPORT( condition )

  do{

  if ( condition )

  NULL;

  else

  assert_report( __FILE__, __func__, __LINE__ );

  }while(0)

  #else // 禁用斷言測試

  #define ASSERT_REPORT( condition ) NULL

  #endif /* end of ASSERT */

  typedef enum _SListReturn

  {

  SLIST_RETURN_OK

  }SListReturn;

  typedef struct node

  {

  char name[10];

  int score;

  struct node *link;

  }stud;

  stud * creat(int n)

  {

  stud *p,*h,*s;

  int i;

  if((h=(stud *)malloc(sizeof(stud)))==NULL)

  {

  printf("分配內存空間失敗!");

  exit(0);

  }

  h->name[0]='国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放

<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>