程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一步一步寫算法(之單向鏈表)

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

編輯:關於C語言

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱:feixiaoxing @163.com】

 

 

 

 

    有的時候,處於內存中的數據並不是連續的。那麼這時候,我們就需要在數據結構中添加一個屬性,這個屬性會記錄下面一個數據的地址。有了這個地址之後,所有的數據就像一條鏈子一樣串起來了,那麼這個地址屬性就起到了穿線連結的作用。

 

    相比較普通的線性結構,鏈表結構的優勢是什麼呢?我們可以總結一下:

 

    (1)單個節點創建非常方便,普通的線性內存通常在創建的時候就需要設定數據的大小

 

    (2)節點的刪除非常方便,不需要像線性結構那樣移動剩下的數據

 

    (3)節點的訪問方便,可以通過循環或者遞歸的方法訪問到任意數據,但是平均的訪問效率低於線性表

 

    那麼在實際應用中,鏈表是怎麼設計的呢?我們可以以int數據類型作為基礎,設計一個簡單的int鏈表:

 

    (1)設計鏈表的數據結構

 

 

typedef struct _LINK_NODE 

    int data; 

    struct _LINK_NODE* next; 

}LINK_NODE; 

typedef struct _LINK_NODE

{

    int data;

       struct _LINK_NODE* next;

}LINK_NODE;

 

    (2)創建鏈表

 

 

LINK_NODE* alloca_node(int value) 

    LINK_NODE* pLinkNode = NULL; 

    pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE)); 

     

    pLinkNode->data = value; 

    pLinkNode->next = NULL; 

    return pLinkNode; 

LINK_NODE* alloca_node(int value)

{

    LINK_NODE* pLinkNode = NULL;

       pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));

      

       pLinkNode->data = value;

       pLinkNode->next = NULL;

       return pLinkNode;

}

 

    (3)刪除鏈表

 

 

void delete_node(LINK_NODE** pNode) 

    LINK_NODE** pNext; 

    if(NULL == pNode || NULL == *pNode) 

        return ; 

         

    pNext = &(*pNode)->next; 

    free(*pNode); 

    delete_node(pNext);  

void delete_node(LINK_NODE** pNode)

{

    LINK_NODE** pNext;

    if(NULL == pNode || NULL == *pNode)

           return ;

             

       pNext = &(*pNode)->next;

       free(*pNode);

       delete_node(pNext);      

}    (4)鏈表插入數據

 

 

STATUS _add_data(LINK_NODE** pNode, LINK_NODE* pDataNode) 

    if(NULL == *pNode){ 

        *pNode = pDataNode; 

        return TRUE; 

    } 

     

    return _add_data(&(*pNode)->next, pDataNode); 

 

STATUS add_data(const LINK_NODE** pNode, int value) 

    LINK_NODE* pDataNode; 

    if(NULL == *pNode) 

        return FALSE; 

         

    pDataNode = alloca_node(value); 

    assert(NULL != pDataNode); 

    return _add_data((LINK_NODE**)pNode, pDataNode); 

STATUS _add_data(LINK_NODE** pNode, LINK_NODE* pDataNode)

{

    if(NULL == *pNode){

           *pNode = pDataNode;

              return TRUE;

       }

      

       return _add_data(&(*pNode)->next, pDataNode);

}

 

STATUS add_data(const LINK_NODE** pNode, int value)

{

    LINK_NODE* pDataNode;

    if(NULL == *pNode)

           return FALSE;

             

       pDataNode = alloca_node(value);

       assert(NULL != pDataNode);

       return _add_data((LINK_NODE**)pNode, pDataNode);

}    (5)刪除數據

 

STATUS _delete_data(LINK_NODE** pNode, int value) 

    LINK_NODE* pLinkNode; 

    if(NULL == (*pNode)->next) 

        return FALSE; 

     

    pLinkNode = (*pNode)->next; 

    if(value == pLinkNode->data){ 

        (*pNode)->next = pLinkNode->next; 

        free(pLinkNode); 

        return TRUE; 

    }else{ 

        return _delete_data(&(*pNode)->next, value); 

    }  

 

STATUS delete_data(LINK_NODE** pNode, int value) 

    LINK_NODE* pLinkNode; 

    if(NULL == pNode || NULL == *pNode) 

        return FALSE; 

 

    if(value == (*pNode)->data){ 

        pLinkNode = *pNode; 

        *pNode = pLinkNode->next; 

        free(pLinkNode); 

        return TRUE; 

    }        

     

    return _delete_data(pNode, value); 

STATUS _delete_data(LINK_NODE** pNode, int value)

{

    LINK_NODE* pLinkNode;

    if(NULL == (*pNode)->next)

           return FALSE;

      

       pLinkNode = (*pNode)->next;

       if(value == pLinkNode->data){

           (*pNode)->next = pLinkNode->next;

              free(pLinkNode);

              return TRUE;

       }else{

           return _delete_data(&(*pNode)->next, value);

       }

}

 

STATUS delete_data(LINK_NODE** pNode, int value)

{

    LINK_NODE* pLinkNode;

    if(NULL == pNode || NULL == *pNode)

           return FALSE;

 

    if(value == (*pNode)->data){

           pLinkNode = *pNode;

              *pNode = pLinkNode->next;

              free(pLinkNode);

              return TRUE;

       }           

      

       return _delete_data(pNode, value);

}

 

    (6)查找數據

 

 

LINK_NODE* find_data(const LINK_NODE* pLinkNode, int value) 

    if(NULL == pLinkNode) 

        return NULL; 

     

    if(value == pLinkNode->data) 

        return (LINK_NODE*)pLinkNode; 

      

    return find_data(pLinkNode->next, value); 

LINK_NODE* find_data(const LINK_NODE* pLinkNode, int value)

{

    if(NULL == pLinkNode)

           return NULL;

      

       if(value == pLinkNode->data)

           return (LINK_NODE*)pLinkNode;

      

       return find_data(pLinkNode->next, value);

}    (7)打印數據

 

 

void print_node(const LINK_NODE* pLinkNode) 

    if(pLinkNode){ 

        printf("%d\n", pLinkNode->data); 

        print_node(pLinkNode->next); 

    } 

void print_node(const LINK_NODE* pLinkNode)

{

    if(pLinkNode){

           printf("%d\n", pLinkNode->data);

              print_node(pLinkNode->next);

       }

}    (8)統計數據

 

 

int count_node(const LINK_NODE* pLinkNode) 

    if(NULL == pLinkNode) 

        return 0; 

         

    return 1 + count_node(pLinkNode->next); 

int count_node(const LINK_NODE* pLinkNode)

{

    if(NULL == pLinkNode)

           return 0;

             

       return 1 + count_node(pLinkNode->next);

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved