您的位置:首页 > 其它

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

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

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 AddToTai
4000
l(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;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: