link.h
#pragma once
#ifndef _LINK_H
#define _LINK_H
#include "node.h"
class Link
{
public:
Link();
~Link();
void ClearLink();
bool LinkEmpty()const;
int LinkLength()const;
bool GetElem(int i,Node *pNode)const;
int LocateElem(Node *pNode)const;
bool PriorElem(Node *pCurrentNode, Node *pPreNode)const;
bool NextElem(Node *pCurrentNode, Node *pNextNode)const;
void LinkTraverse()const;
bool EnLink(int i, Node *pNode);
bool DeLink(int i, Node *pNode);
bool LinkInHead(Node *pNode);
bool LinkInTail(Node *pNode);
private:
Node *m_pLink;
int m_iLength;
};
#endif
link.cpp
using namespace std;
Link::Link()
{
m_pLink = new Node;
m_pLink->data = 0;
m_pLink->next = NULL;
m_iLength = 0;//头节点
}
Link::~Link()
{
ClearLink();
delete m_pLink;
m_pLink = NULL;
}
void Link::ClearLink()
{
Node *currentNode = m_pLink->next;
while (currentNode != NULL)
{
Node *temp = currentNode->next;
delete currentNode;
currentNode = temp;
}
m_pLink->data = NULL;
}
bool Link::LinkEmpty()const
{
return m_iLength == 0 ? true : false;
}
int Link::LinkLength()const
{
return m_iLength;
}
bool Link::GetElem(int i, Node *pNode)const
{
if (i < 0 || i >= m_iLength)
{
return false;
}
Node *currentNode = m_pLink;
for (int k = 0; k <= i; k++)
{
currentNode = currentNode->next;
}
pNode->data = currentNode->data;
return true;
}
int Link::LocateElem(Node *pNode)const
{
Node *currentNode = m_pLink;
int count = 0;
while (currentNode->next != NULL)
{
currentNode = currentNode->next;
if (currentNode->data == pNode->data)return count;
count++;
}
return -1;
}
bool Link::PriorElem(Node *pCurrentNode, Node *pPreNode)const
{
Node *currentNode = m_pLink;
Node *tempNode = NULL;
while (currentNode->next != NULL)
{
tempNode = currentNode;
currentNode = currentNode->next;
if (currentNode->data == pCurrentNode->data)
{
if (tempNode == m_pLink) return false;
pPreNode->data = tempNode->data;
return true;
}
}
return false;
}
bool Link::NextElem(Node *pCurrentNode, Node *pNextNode)const
{
Node *currentNode = m_pLink;
while (currentNode->next != NULL)
{
currentNode = currentNode->next;
if (currentNode->data == pCurrentNode->data)
{
if (currentNode->next == NULL) return false;
pNextNode->data = currentNode->next->data;
return true;
}
}
return false;
}
void Link::LinkTraverse()const
{
Node *currentNode = m_pLink;
while (currentNode->next != NULL)
{
currentNode = currentNode->next;
currentNode->printNode();
}
}
bool Link::EnLink(int i, Node *pNode)
{
if (i < 0 || i > m_iLength)
{
return false;
}
Node *currentNode = m_pLink;
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->next = newNode;
m_iLength++;
return true;
}
bool Link::DeLink(int i, Node *pNode)
{
if (i < 0 || i >= m_iLength)
{
return false;
}
Node *currentNode = m_pLink;
Node *currentNodeBefore = NULL;
for (int k = 0; k <= i; k++)
{
currentNodeBefore = currentNode;
currentNode = currentNode->next;
}
currentNodeBefore->next = currentNode->next;
pNode->data = currentNode->data;
delete currentNode;
currentNode = NULL;
m_iLength--;
return true;
}
bool Link::LinkInHead(Node *pNode)
{
Node *temp = m_pLink->next;
Node *newNode = new Node;
if (newNode == NULL) return false;
newNode->data = pNode->data;
m_pLink->next = newNode;
newNode->next = temp;
m_iLength++;
return true;
}
bool Link::LinkInTail(Node *pNode)
{
Node *currentNode = m_pLink;
while (currentNode->next != NULL)
{
currentNode = currentNode->next;
}
Node *newNode = new Node;
if (newNode == NULL)
{
return false;
}
newNode->data = pNode->data;
newNode->next = NULL;
currentNode->next = newNode;
m_iLength++;
return true;
}
node.h/cpp
#pragma once
#ifndef _NODE_H
#define _NODE_H
class Node
{
public:
int data;
Node *next;
void printNode();
};
#endif
#pragma once
#ifndef _NODE_H
#define _NODE_H
class Node
{
public:
int data;
Node *next;
void printNode();
};
#endif
main
#include <iostream>
#include <cstdlib>
#include "link.h"
using namespace std;
int main(void)
{
Link *p = new Link;
Node node1,node2;
node1.data = 8;
node2.data = 8;
p->LinkInHead(&node1);
p->LinkInHead(&node2);
p->LinkTraverse();
delete p;
p = NULL;
system("pause");
return 0;
}