链表基本操作的函数实现。(1)

来源:互联网 发布:朝鲜留学生在中国 知乎 编辑:程序博客网 时间:2024/06/09 16:35

如下是一个模拟的链表的基本操作,主要有创建链表,连接链表,打印链表,删除链表等,后面有关链表的算法都依赖这个文件中函数实现。

ListCommon.h

//链表的结构

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

//通用的操作函数

ListNode* CreateListNode(int value);
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);
void PrintListNode(ListNode* pNode);
void PrintList(ListNode* pHead);
void DestoryList(ListNode* pHead);
//其中的参数是指向指针的指针,
void AddToTail(ListNode** pHead, int value);
void RemoveNode(ListNode** pHead, int value);


ListCommon.cpp

#include <iostream>
#include <stdlib.h>
#include "ListCommon.h"
using namespace std;

//链表的结构
//struct ListNode{
//    int m_nValue;
//    ListNode* m_pNext;
//};

//通用的操作函数

//创建链表节点
ListNode* CreateListNode(int value){
    ListNode* pNode = new ListNode();
    pNode->m_nValue = value;
    pNode->m_pNext = NULL;
}

//连接两个链表节点
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext){
    if(pCurrent == NULL){
        cout << "can not to connect two nodes ! " <<endl;
        exit(1);
    }

    pCurrent->m_pNext = pNext;
}


//打印一个链表节点
void PrintListNode(ListNode* pNode){
    if(pNode == NULL){
        cout << "The node is NULL !" <<endl;
    }else{
        cout << "The value of node is " << pNode->m_nValue <<endl;
    }
}

//打印整个链表,不要用pHead节点直接操作,否则操作结束这个链表就无法获取了。
void PrintList(ListNode* pHead){
    cout << "print list begin ---" <<endl;
    ListNode * pNode = pHead;
    while(pNode != NULL){
        cout << pNode->m_nValue<< endl;
        pNode = pNode->m_pNext;

        if(pNode == pHead){
            break;
        }

    }
    cout << "print list end " <<endl;
}

//销毁链表
void DestoryList(ListNode* pHead){
    ListNode* pNode = pHead;

    while(pNode != NULL){
        pHead = pHead->m_pNext;
        delete pNode;
        pNode = pHead;
    }
}

//从尾部添加节点,其中的参数是指向指针的指针,因为这里的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 != 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;
    }
}

原创粉丝点击