频道栏目
首页 > 资讯 > C语言 > 正文

一步一步写算法(之单向链表)

11-10-23        来源:[db:作者]  
收藏   我要投稿

 

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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);

}

相关TAG标签
上一篇:一步一步写算法(之双向链表)
下一篇:一步一步写算法(之线性堆栈)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站