现在的位置: 首页 > 综合 > 正文

给大家分享一个常用链表类Clist

2018年04月09日 ⁄ 综合 ⁄ 共 2028字 ⁄ 字号 评论关闭

头文件声明如下:

struct ListNode
{
    int       m_nValue;
    ListNode* m_pNext;
};

__declspec( dllexport ) ListNode* CreateListNode(int value);//创建链表函数
__declspec( dllexport ) void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);//连接链表节点函数
__declspec( dllexport ) void PrintListNode(ListNode* pNode);//打印链表节点函数
__declspec( dllexport ) void PrintList(ListNode* pHead);//打印链表函数
__declspec( dllexport ) void DestroyList(ListNode* pHead);//销毁链表函数
__declspec( dllexport ) void AddToTail(ListNode** pHead, int value);//在链表队尾插入节点函数
__declspec( dllexport ) void RemoveNode(ListNode** pHead, int value);//移除节点函数

实现文件如下:

#include "list.h"
#include <stdio.h>
#include <stdlib.h>
//创建链表函数  方便于新建链表
ListNode* CreateListNode(int value)
{
    ListNode* pNode = new ListNode();//每次新建一个链表节点并分配内存。
    pNode->m_nValue = value;
    pNode->m_pNext = NULL;

    return pNode;
}

void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
{
    if(pCurrent == NULL)
    {
        printf("Error to connect two nodes.\n");
        exit(1);
    }

    pCurrent->m_pNext = pNext;
}

void PrintListNode(ListNode* pNode)
{ 
    if(pNode == NULL)
    {
        printf("The node is NULL\n");
    }
    else
    {
        printf("The key in node is %d.\n", pNode->m_nValue);
    }
}

void PrintList(ListNode* pHead)
{
    printf("PrintList starts.\n");
    
    ListNode* pNode = pHead;
    while(pNode != NULL)
    {
        printf("%d\t", pNode->m_nValue);
        pNode = pNode->m_pNext;
    }

    printf("\nPrintList ends.\n");
}

void DestroyList(ListNode* pHead)
{
    ListNode* pNode = pHead;
    while(pNode != NULL)
    {
        pHead = pHead->m_pNext;
        delete pNode;
        pNode = pHead;
    }
}

void AddToTail(ListNode** pHead, int value)
{
    ListNode* pNew = new ListNode();
    pNew->m_nValue = value;
    pNew->m_pNext = NULL;

    if(*pHead == NULL)
    {
        *pHead = pNew;
    }
    else
    {
        ListNode* pNode = *pHead;
        while(pNode->m_pNext != NULL)
            pNode = pNode->m_pNext;

        pNode->m_pNext = pNew;
    }
}

void RemoveNode(ListNode** pHead, int value)
{
    if(pHead == NULL || *pHead == NULL)
        return;

    ListNode* pToBeDeleted = NULL;
    if((*pHead)->m_nValue == value)
    {
        pToBeDeleted = *pHead;
        *pHead = (*pHead)->m_pNext;
    }
    else
    {
        ListNode* pNode = *pHead;
        while(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
            pNode = pNode->m_pNext;

        if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value)
        {
            pToBeDeleted = pNode->m_pNext;
            pNode->m_pNext = pNode->m_pNext->m_pNext;
        }
    }

    if(pToBeDeleted != NULL)
    {
        delete pToBeDeleted;
        pToBeDeleted = NULL;
    }
}

抱歉!评论已关闭.