当前位置:编程学习 > 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)

         &nbs

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,