一步一步寫算法(之循環單向鏈表) (轉)

 前面的博客中,咱們曾經有一篇專門講到單向鏈表的內容。那麼今天討論的鏈表和上次討論的鏈表有什麼不一樣呢?重點就在這個"循環"上面。有了循環,意味着咱們能夠從任何一個鏈表節點開始工做,能夠把root定在任何鏈表節點上面,能夠從任意一個鏈表節點訪問數據,這就是循環的優點。node

    那麼在實現過程當中,循環單向鏈表有什麼不一樣?函數

    1)打印鏈表數據spa

  1. void print_data(const LINK_NODE* pLinkNode)  
  2. {  
  3.     LINK_NODE* pIndex = NULL;  
  4.     if(NULL == pLinkNode)  
  5.         return;  
  6.   
  7.     printf("%d\n", pLinkNode->data);  
  8.     pIndex = pLinkNode->next;  
  9.     while(pLinkNode != pIndex){  
  10.         printf("%d\n", pIndex->data);  
  11.         pIndex = pIndex ->next;  
  12.     }  
  13. }  

    以往,咱們發現打印數據的結束都是判斷指針是否爲NULL,這裏由於是循環鏈表因此發生了變化。原來的條件(NULL != pLinkNode)也修改爲了這裏的(pLinkNode != pIndex)。一樣須要修改的函數還有find函數、count統計函數。.net

 

 

    2)插入數據指針

  1. STATUS insert_data(LINK_NODE** ppLinkNode, int data)  
  2. {  
  3.     LINK_NODE* pNode;  
  4.     if(NULL == ppLinkNode)  
  5.         return FALSE;  
  6.   
  7.     if(NULL == *ppLinkNode){  
  8.         pNode = create_link_node(data);  
  9.         assert(NULL != pNode);  
  10.   
  11.         pNode->next = pNode;  
  12.         *ppLinkNode = pNode;  
  13.         return TRUE;  
  14.     }  
  15.   
  16.     if(NULL != find_data(*ppLinkNode, data))  
  17.         return FALSE;  
  18.   
  19.     pNode = create_link_node(data);  
  20.     assert(NULL != pNode);  
  21.   
  22.     pNode->next = (*ppLinkNode)->next;  
  23.     (*ppLinkNode)->next = pNode;  
  24.     return TRUE;  
  25. }  

這裏的insert函數在兩個地方發生了變化:blog

 

    a)若是原來鏈表中沒有節點,那麼鏈表節點須要本身指向本身get

    b)若是鏈表節點原來存在,那麼只須要在當前的鏈表節點後面添加一個數據,同時修改兩個方向的指針便可博客

 

    3) 刪除數據string

  1. STATUS delete_data(LINK_NODE** ppLinkNode, int data)  
  2. {  
  3.     LINK_NODE* pIndex = NULL;  
  4.     LINK_NODE* prev = NULL;  
  5.     if(NULL == ppLinkNode || NULL == *ppLinkNode)  
  6.         return FALSE;  
  7.   
  8.     pIndex = find_data(*ppLinkNode, data);  
  9.     if(NULL == pIndex)  
  10.         return FALSE;  
  11.   
  12.     if(pIndex == *ppLinkNode){  
  13.         if(pIndex == pIndex->next){  
  14.             *ppLinkNode = NULL;  
  15.         }else{  
  16.             prev = pIndex->next;  
  17.             while(pIndex != prev->next)  
  18.                 prev = prev->next;  
  19.   
  20.             prev->next = pIndex->next;  
  21.             *ppLinkNode = pIndex->next;  
  22.         }  
  23.     }else{  
  24.         prev = pIndex->next;  
  25.         while(pIndex != prev->next)  
  26.             prev = prev->next;  
  27.         prev->next = pIndex->next;  
  28.     }  
  29.   
  30.     free(pIndex);  
  31.     return TRUE;  
  32. }  

和添加數據同樣,刪除數據也要在兩個方面作出改變:class

 

    a)若是當前鏈表節點中只剩下一個數據的時候,刪除後須要設置爲NULL

    b)刪除數據的時候首先須要當前數據的前一個數據,這個時候就能夠從當前刪除的數據開始進行遍歷

    c) 刪除的時候須要重點判斷刪除的數據是否是鏈表的頭結點數據

轉自:http://blog.csdn.net/feixiaoxing/article/details/6853455

相關文章
相關標籤/搜索