示例代码如下:
#include <iostream>
using namespace std;
class Node //节点类
{
public:
//普通构造函数:无参数,带1个参数,带2个参数
Node(){}
Node(int n){ num = n; next = NULL; }
Node(int n, Node *p){ num = n; next = p; }
void setNum(int n = 0) { num = n; }
int getNum() const { return num; }
void setNext(Node *p = NULL){ next = p; } //设置指针域
Node *getNext() const { return next; }//获取指针域
private:
int num; //数据域
Node *next; //指针域
};
class Linklist //链表类
{
public:
//构造函数和析构函数
Linklist(){ head = NULL; }
Linklist(int n){ head = new Node(n); }
~Linklist() { clear(); }
void addAtEnd(int n);//往链表尾添加节点
void addAtHead(int n);//往链表头添加节点
void addByNum(int n);//升序插入节点
void visitAllNode() const;//遍历所有的节点
Node *searchByNum(int n) const; //查找值为num的节点
void deleteByNum(int n);//删除值为n的节点
void clear();//删除链表所有节点
private:
Node *head;
};
//往链表尾添加节点
void Linklist::addAtEnd(int n)
{
if(NULL == head)
{
head = new Node(n);
}
else
{
Node *temp=head;
while( temp->getNext() != NULL)
{
temp = temp->getNext(); //用temp来指向下一个节点
}
//执行到这时,说明temp是最后一个节点,temp的下一个节点为NULL
temp->setNext( new Node(n) );//插入节点
}
}
//往链表头添加节点
void Linklist::addAtHead(int n)
{
if(NULL == head)
{
head = new Node(n);
}
else
{
Node *temp = new Node(n);//待插入的节点
temp->setNext(head);//temp的下一个节点执行头
head = temp; //新节点当做头结点
}
}
//升序插入节点
void Linklist::addByNum(int n)
{
if(NULL == head)//头结点为NULL
{
head = new Node(n);
}
else
{
Node *pf, *pb; //pf前一个结点, pb为后一个节点
pf = pb = head;
while(NULL != pb)
{
if(pb->getNum() >= n)//>=升序,<降序
{
break;
}
pf = pb; //pf保存当前节点
pb = pb->getNext(); //pb指向下一个节点
}
if(NULL == pb)//尾结点
{
pf->setNext( new Node(n) );//插入节点
}
else
{
Node *temp = new Node(n);//待插入的节点
if(pb == head) //头节点
{
temp->setNext(head);//temp的下一个节点执行头
head = temp; //新节点当做头结点
}
else //中间
{
pf->setNext(temp);
temp->setNext(pb);
}
}
}
}
//遍历所有的节点
void Linklist::visitAllNode() const
{
if(NULL == head)
{
cout<<"空链表!"<<endl;
}
else
{
Node *temp=head;
while( temp != NULL)
{
cout<< temp->getNum()<<" --> ";
temp=temp->getNext();
}
cout << "NULL" << endl;
}
}
//查找值为num的节点
Node * Linklist::searchByNum(int n) const
{
Node *temp = head;
while(temp != NULL)
{
if(temp->getNum() == n)
{
return temp;
}
temp = temp->getNext();
}
return NULL;
}
//删除节点
void Linklist::deleteByNum(int n)
{
Node *pf, *pb;
pf = pb = head;
while(NULL != pb)
{
if(pb->getNum() == n)
{
break;
}
pf = pb;
pb = pb->getNext();
}
if(NULL == pb)
{
cout << n << ":此值不存在" << endl;
}
else
{
//头结点
if(pb == head)
{
pf = head->getNext();
delete head;
head = pf;
}
else
{
pf->setNext( pb->getNext() );
delete pb;
}
}
}
//删除链表所有节点
void Linklist::clear()
{
Node *temp = NULL;
temp = head; //用一个临时节点保存头结点
//遍历链表,每次先保存头结点的next结点,然后删除头结点
while (NULL != temp)
{
temp = head->getNext();//先保存头结点的next结点
delete head;//删除头结点
head = temp;//之前头结点的next节点重新作为head
}
cout << "链表已经清空\n";
}
int main()
{
Linklist myList(1); //创建链表对象
myList.visitAllNode(); //遍历所有的节点
cout << endl;
myList.addAtEnd(2); //尾部插入
myList.addAtHead(0);//头部插入
myList.visitAllNode(); //遍历所有的节点
cout << endl;
for(int i = 3; i < 10; i++)
{
myList.addByNum(i); //升序插入节点
}
myList.visitAllNode(); //遍历所有的节点
cout << endl;
Node *temp = myList.searchByNum(5); //查找值为5的节点
if(NULL != temp)
{
cout << "此节点的值为:" << temp->getNum() << endl;
}
else
{
cout << "值为5的节点不存在" << endl;
}
temp = myList.searchByNum(100); //查找值为100的节点
if(NULL != temp)
{
cout << "此节点的值为:" << temp->getNum() << endl;
}
else
{
cout << "值为100的节点不存在" << endl;
}
cout << endl;
myList.deleteByNum(5);//删除值为5的节点
cout << "删除值为5的节点:";
myList.visitAllNode(); //遍历所有的节点
cout << endl;
myList.deleteByNum(100);//删除值为100的节点
cout << endl;
return 0;
}
编译运行结果如下:
本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky