线性表(顺序表)有两种存储方式:链式存储和顺式存储,顺式存储如数组,其内存连续分配,且是静态分配。链式存储,内存是不连续的,且是动态分配。前一个元素存储数据,后一个元素存储指向下一个节点的指针。
如图所示为单向链表。
链表结构:
typedef LinkNode
{int m_nValue; //节点中存储的值LinkNode* m_pNext; //节点存储的指针,指向链表的下一个节点
};
在链表的结尾处加入一个节点(注意第一个参数,定义了一个指向指针的指针,因为当我们建立一个新的链表时,首节点的第一个元素就是头指针)。
void AddToTail(ListNode**pHead,int value)
{//首先创建这个要插入的节点,节点需要包括数据和指向空的指针(在节点末尾处指针为nullptr)LinkNode* pNew;pNew->m_nValue=value;pNew->m_pNext=nullptr;//然后判断该链表的首节点是否为空if(*pHead->m_pNext==nullptr) //若首节点没有下一个指向,则表示首节点即为尾节点,将首节点的下 //一个指针指向新建的节点。*pHead=pNew;else{LinkNode* pNode=*pHead; //如果首节点不为空,则往下找到尾节点,尾节点的指while(pNode->m_pNext!=nullptr) //针为nullptr,将尾结点的指针指向pNext。{pNode=pNode->m_pNext;} pNode->m_pNext=pNext; }}
删除链表中存储某个值的节点
void RemoveNode(LinkNode**pHead,int value)
{//首先判断首节点是否为空if(*pHead=nullptr||pHead=nullptr)return;LinkNode*pToBeDelete=nullptr;//判断首节点是否为要删除的元素if((*pHead)->m_nValue==value){pToBeDelete=*pHead; *pHead=(*pHead)->m_pNext;}else{LinkNode *pNode=*pHead;while(pNode->m_pNext!=nullptr&&pNode->m_nValue!=value)pNode->m_Next=pNode->m_pNext-> ;if(pNode->m_pNext!=nullptr&&pNode->m_nValue==value){pToBeDeleted=pNode->m_pNext;pNode->m_Next=pNode->m_pNext->m_pNext;}}if(pToBeDeleted!=nullptr){delete pToBeDeleted;pToBeDeleted=nullptr;}}