示例代码如下:
#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
版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!!
原文:http://blog.csdn.net/tennysonsky/article/details/49685199