单链表的手动实现

来源:互联网 发布:永久域名多少钱 编辑:程序博客网 时间:2024/06/10 20:22

写程序这么多,第一次手写链表

 

#include "stdio.h"

#include "string.h"
#include "assert.h"
#include "stdlib.h"
#include "windows.h"

typedef struct PATCH_NODE
{
    ULONG OldFuncAddr;
    ULONG FakeFuncAddr;
    ULONG PatchCodeLen;
    PATCH_NODE* pNextNode;
} PATCH_NODE, *PPATCH_NODE;

class CSDList
{
    public:
        PATCH_NODE *InsertNode(PATCH_NODE *nodebefore, PATCH_NODE *node);
        void DeleteNode(PATCH_NODE *node);
        void DeleteList();
        PATCH_NODE *SearchNode(DWORD len);
        void PrintList(PATCH_NODE *node);

        CSDList(){m_pNodeHead = NULL; m_pNodeLast = NULL;}
        ~CSDList(){}

    private:
        PATCH_NODE *m_pNodeHead;
        PATCH_NODE *m_pNodeLast;

};

 

 

 

#include "StdAfx.h"
#include "SDlist.h"

PATCH_NODE *CSDList::InsertNode(PATCH_NODE *nodebefore, PATCH_NODE *node)
{
    assert(node != NULL);

    PATCH_NODE *newnode = NULL;
    newnode = new PATCH_NODE;
    memcpy(newnode, node, sizeof(PATCH_NODE));

    if(nodebefore != NULL)
    {
        PATCH_NODE *temp = NULL;
        if (nodebefore->pNextNode != NULL)
        {
            newnode->pNextNode = nodebefore->pNextNode;
        }else{
            newnode->pNextNode = NULL;
        }
        nodebefore->pNextNode = newnode;
    }else{
        if (m_pNodeHead != NULL)
        {
            //为首个节点时
            if (m_pNodeHead->pNextNode != NULL)
            {                
                newnode->pNextNode = m_pNodeHead;
                m_pNodeHead = newnode;        
            }else{
                newnode->pNextNode = m_pNodeHead;
                m_pNodeHead = newnode;    
            }
        }else{
            m_pNodeHead = newnode;
            m_pNodeHead->pNextNode = NULL;
        }


    }

    return newnode;

}
void CSDList::DeleteNode(PATCH_NODE *node)
{
    assert(node != NULL);

    PATCH_NODE *nodetmp = m_pNodeHead;
    while (nodetmp != NULL)
    {
        if (nodetmp->pNextNode->PatchCodeLen == node->PatchCodeLen)
        {
            nodetmp->pNextNode = node->pNextNode;
            delete node;
            break;
        }
        nodetmp = nodetmp->pNextNode;
    }    
}

void CSDList::DeleteList()
{
    if (m_pNodeHead != NULL)
    {
        PATCH_NODE *node;
        node = m_pNodeHead;
        while(node != NULL)
        {    
            PATCH_NODE *node_next;
            node_next = node->pNextNode;
            delete node;
            node = node_next;
        }
    }
}

PATCH_NODE *CSDList::SearchNode(PATCH_NODE *target_node)
{
    if (m_pNodeHead == NULL)
    {
        return NULL;
    }

    PATCH_NODE *node;
    node = m_pNodeHead;

    while (node != NULL)
    {
        if (node->PatchCodeLen == target_node->PatchCodeLen)
        {
            break;
        }
        node = node->pNextNode;
    }

    return node;
}

void CSDList::PrintList(PATCH_NODE *node)
{
    if (node == NULL)
    {
        node = m_pNodeHead;
    }

    while (node != NULL)
    {
        printf("-%d-", node->PatchCodeLen);
        node = node->pNextNode;
    }    
}

原创粉丝点击