这里主要记录单向列表添加和删除一个指定位置节点的书写方法。
首先先创建链表节点数据的基本类型:
#ifndef NODE_H
#define NODE_H
#include "Person.h"
class Node
{
public:
Person data; //数据域
Node *next; //指向下一个节点
void printNode();
};
#endif // !NODE_H
接下来创建节点的节本类型:
class List
{
public:
List();
~List();
void clearList();
bool listEmpty();
int listLength();
bool getElement(int i, Node *pNode);
int locateElement(Node *pNode);
bool priorElement(Node *pCurrentNode, Node *pPreNode);
bool nextElement(Node *pCurrentNode, Node *pNextNode);
void listTraverse();
bool listInsert(int i, Node *pNode);
bool listDelete(int i, Node *pNode);
bool listInsertHead(Node *pNode);
bool listInsertTail(Node *pNode);
private:
Node *m_pList;
int m_iSize;
int m_iLength;
};
#endif
往指定节点添加函数如下所示:
bool List::listInsert(int i, Node *pNode)
{
if (i<0 || i>m_iLength)
{
return false;
}
Node *currentNode = m_pList;
for (int k = 0; k < i; k++)
{
currentNode = currentNode->next;
}
Node *newNode = new Node;
if (newNode == NULL)
{
return false;
}
newNode->data = pNode->data;
newNode->next = currentNode->next; //原本currentNode的下一节点变为了newNode的下一个节点
currentNode->next = newNode; //newNode成为了currentNode的下一节点
m_iLength++;
return true;
}
删除指定节点函数:
bool List::listDelete(int i, Node *pNode)
{
if (i < 0 || i >= m_iLength)
{
return false;
}
Node *currentNode = m_pList;
Node *currentNodeBefore = NULL;
for (int k = 0; k <= i; k++)
{
currentNodeBefore = currentNode;
currentNode = currentNode->next;
}
currentNodeBefore->next = currentNode->next;
pNode->data = currentNode->data; //取出currentNode的值
delete currentNode;
currentNode = NULL;
m_iLength--;
return true;
}