链表是顺序表的一种,而单链表是链表中最简单的一种,所以单链表的代码实现逻辑还是比较简单的。
#ifndef NODE_H
#define NODE_H
#include <iostream>
using namespace std;
class Node
{
public:
int date; //数据域这里定为int型
Node *next; // 这里的指针是指向下一个结点的,所以类型为Node
void printNode();
};
void Node::printNode()
{
cout << date << endl;
}
#endif
这个是链表元素的头文件
............................................................................
#ifndef MYQUEUE_H
#define MYQUEUE_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "Node.h"
using namespace std;
class List
{
public:
explicit List(); //链表与顺序表不同,不需要一开始就指定好大小,每增加一个结点都可以从堆里面临时 申请
//并将临时申请的内存赋值之后挂载在链表当中
~List();
void ClearList();
bool ListEmpty();
int ListLength();
bool GetElem(int i, Node *e);
int LocateElem(Node *e); // 定位指定元素的位置
bool ListInsert(int i, Node *e);
bool PriorElem(Node *currentNode, Node *preNode);
bool NextElem(Node *currentNode, Node *nextNode);
bool listDelete(int i, Node *tNode);
bool ListInsertHead(Node *pNode);
bool ListInsertTail(Node *pNode);
void ListTraverse();
private:
Node *m_plist;
int m_length;
};
List::List()
{
m_length = 0; // 虽然定义了一个结点,但是没有什么意义并不在当前的链表中,所以长度还是赋值为0
m_plist = new Node;
m_plist->date = 0;
m_plist->next = NULL;
}
List::~List()
{
ClearList();
delete m_plist;
m_plist = NULL;
}
void List::ClearList()
{
Node *currentNode = m_plist->next; //相当于审一个犯罪团伙,逼每一个上线交代下线,
while (currentNode != NULL)
{
Node *temp = currentNode->next;
delete currentNode;
currentNode = temp;
}
m_plist->next = NULL;
}
bool List::ListEmpty()
{
if (m_length == 0)
return true;
else
return false;
}
int List::ListLength()
{
return m_length;
}
bool List::GetElem(int i,Node *e)
{
if (i < 0 || i >= m_length)
return false;
else
{
Node *currentnode = m_plist;
for (int k(0); k <= i; ++k)
{
currentnode = currentnode->next;
}
e->date = currentnode->date;
return true;
}
}
int List::LocateElem(Node *e)
{
Node *currentnode = m_plist;
int count(0);
while (currentnode->next != NULL)
{
currentnode = currentnode->next;
if (currentnode->date==e->date)
{
return count;
}
count++;
}
return -1; //没有找到的时候要return -1
}
bool List::ListInsert(int i, Node *e)
{
if (i<0 || i>m_length)
{
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->date = e->date;
Newnode->next = currentnode->next;
currentnode->next = Newnode;
return true;
}
bool List::PriorElem(Node *currentNode,Node *preNode)
{
Node *currentnode = m_plist;
Node *tempNode = NULL;
while (currentnode->next != NULL)
{
tempNode = currentnode;
currentnode = currentnode->next;
if (currentnode->date == currentNode->date)
{
preNode->date = tempNode->date;
return true;
}
}
return false;
}
bool List::NextElem(Node *currentNode, Node *nextNode) //用currentNode 来定位要找到的那个数据,然后将它的下个数据存在nextNode中
{
Node *currentnode = m_plist;
while (currentnode->next != NULL)
{
currentnode = currentnode->next;
if (currentnode->date == currentNode->date)
{
if (currentnode->next == NULL)
{
return false;
}
currentnode = currentnode->next;
nextNode->date = currentnode->date;
return true;
}
}
return false;
}
bool List::listDelete(int i, Node *tNode) //删除的是第i个结点的下一个结点
{
if (i<0 || i>=m_length)
return false;
Node *currentnode = m_plist;
Node *previousnode = NULL;
for (int k(0); k <=i; k++)
{
previousnode = currentnode;
currentnode = currentnode->next;
}
previousnode->next = currentnode->next;
tNode->date = currentnode->date;
delete currentnode;
currentnode = NULL;
m_length--;
return true;
}
void List::ListTraverse()
{
Node *currentnode = m_plist;
while (currentnode->next != NULL)
{
currentnode = currentnode->next;
currentnode->printNode();
}
}
bool List::ListInsertHead(Node *pNode)
{
Node *temp = m_plist->next;
Node *NewNode = new Node;
if (NewNode == NULL)
{
return false;
}
NewNode->date = pNode->date;
m_plist->next = NewNode;
NewNode->next = temp;
m_length++;
return true;
}
bool List::ListInsertTail(Node *pNode)
{
Node *currentnode = m_plist;
while (currentnode->next != NULL)
{
currentnode = currentnode->next;
}
Node *Newnode = new Node;
if (Newnode == NULL)
{
return false;
}
Newnode->date = pNode->date;
Newnode->next = NULL;
currentnode->next = Newnode->next;
m_length++;
return true;
}
#endif