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