带头结点单链表的各种各种运算(C++模板类实现)
2011-10-26 22:53
796 查看
一切尽在代码中……
#include <iostream> using namespace std; template <typename T>//注意先声明 class SingleChain; template <typename T> class Node{ private: Node *next; T _data; friend class SingleChain<T>; //singleChain类可以自由访问Node类的所有成员,包括私有成员 }; template <class T> class SingleChain{ public: SingleChain(){ head = new Node<T>[sizeof(Node<T>)];//可以写成head = new Node<T>; head->next = NULL; } bool IsEmpty() const; int Length() const; int CreateNode(int n); int Insert(T data,int pos); int FindElemPos(T data) const; int DeleteSub(T data); int DeleteSub(int pos,T &data); void DestroyAll(); void DisplayAll(ostream&) const; ~SingleChain(){ delete head; head = NULL; //删除后记得将head 置为NULL或0,不然成了野指针(wild pointer) cout << "program is over,now delete all pointers..." << endl; } private: Node<T> *head; }; //疑问:在那些成员函数里定义的指针变量申请的动态内存空间是程序结束后自动释放系统回收。还是? template <typename T> bool SingleChain<T>::IsEmpty() const{ //判空运算 return head->next == NULL; } template <typename T> int SingleChain<T>::Length() const{ //返回链表长度 Node<T> *p; p = head->next; int len = 0; while(p){ p = p->next; len++; } return len; } template <typename T> int SingleChain<T>::CreateNode(int n){ //创建n个结点 Node<T> *p,*q; T tmp; p = NULL; q = head; int i; for(i = 1; i <= n; ++i){ p = new Node<T>[sizeof(Node<T>)]; if(p == NULL) return -1; cout << "node" << i << ":"; cin >> tmp; p->_data = tmp; p->next = NULL; q->next = p; q = p; } return 0; } template <typename T> int SingleChain<T>::Insert(T data,int pos){ //在指定位置插入 Node<T> *p,*q; p = head; int cnt = 0; while(cnt < pos - 1 && p != NULL){ p = p->next; cnt++; } if(cnt < pos - 1 || p == NULL) return -1; q = new Node<T>[sizeof(Node<T>)]; if(q == NULL) return -2; q->_data = data; q->next = p->next; p->next = q; return 0; } template <typename T> int SingleChain<T>::FindElemPos(T data) const{ //查找元素返回其所在位置 int len = 1; Node<T> *p = head->next; while(p && p->_data != data){ p = p->next; len++; } if(p == NULL) return 0; return len; } template <typename T> void SingleChain<T>::DisplayAll(ostream& out) const{ //显示所有数据 Node<T> *p; p = head->next; while(p){ out << p->_data << " "; p = p->next; } out << endl; } template <typename T> int SingleChain<T>::DeleteSub(T data){ //删除指定值(如果有相同,则删掉最靠前的) Node<T> *p,*q; p= head->next; q = head; while(p && p->_data != data){ p = p->next; q = q->next; } if(p == NULL) return false; q->next = p->next; delete p; // free(p); return true; } template <typename T> int SingleChain<T>::DeleteSub(int pos,T &data){ //删除指定位置的结点,并通过引用方式返回数据元素 Node<T> *p,*q; p = head->next; q = head; int cnt = 0; while(cnt < pos - 1 && p != NULL){ p = p->next; q = q->next; cnt++; } if(cnt > pos - 1 || p == NULL) //如果指定位置不存在 return -1; data = p->_data; q->next = p->next; delete p; return 0; } template <typename T> void SingleChain<T>::DestroyAll(){ //清空整个链表(表头还在) Node<T> *p; while(head->next){ p = head->next; head->next = p->next; delete p; } cout << "Ok,all nodes are deleted..." << endl; } int main(){ SingleChain<char> snode; int num,pos; char elem; cout << "Is Empty?:" << snode.IsEmpty() << endl; cout << "how many elements you want to create:"; cin >> num; snode.CreateNode(num); cout << "now Length:" << snode.Length() << endl; cout << "all elements are:"; snode.DisplayAll(cout); cout << "insert elem and pos:"; cin >> elem >> pos; if(!snode.Insert(elem,pos)){ cout << "Ok,insert successfully!" << endl; } else{ cout << "Insert failed." << endl; } cout << "what elem you want to find?:"; cin >> elem; pos = snode.FindElemPos(elem); if(!pos) cout << "not exist..." << endl; else cout << "pos:" << pos << endl; snode.DisplayAll(cout); cout << "delete elem:"; cin >> elem; snode.DeleteSub(elem); snode.DisplayAll(cout); cout << "delete pos:"; cin >> pos; if(!snode.DeleteSub(pos,elem)){ snode.DisplayAll(cout); cout << "pos" << pos << ":" << elem << endl; } else{ cout << "not exist..." << endl; } snode.DestroyAll(); cout << "Now Lenth:" << snode.Length() << endl; return 0; } int CreateNodeFromFront(Node *head,int n){//头插法 Node *p; DATA tmp; int i; for(i = n; i > 0; i--){ p = new Node[sizeof(Node)]; if(p == NULL) return -1; cout << "input data" << n - i << ":"; cin >> tmp; p->data = tmp; p->next = head->next; head->next= p; } } int Insert(Node *head,DATA data,int pos){ //插入的第二种方式 if(head->next== NULL) return -1; Node *p,*q; p = head; q = new Node[sizeof(Node)]; int len = Length(head); if(pos > len || pos < 0) return -1; while(p && pos--){ p = p->next; } q->data = data; q->next = p->next; p->next = q; return 0; }
相关文章推荐
- 带头结点的链表头插法C++实现
- 用C++实现数据结构二 带头结点的单链表
- C++模板实现双向循环链表(有带头结点)
- 数据结构 带头结点的单链表 操作大全 最全的链表操作(c++实现)
- C++实现带头结点单链表
- 数据结构实验-用C++实现带头结点的循环链表
- 链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。 用C语言编写 用以存放输入的二进制数 建立 一个带头结点的线性链表
- 经典算法与数据结构的c++实现——带头结点的单链表
- 带头结点的链表尾插法C++实现
- 数据结构(5)线性表之链表C++实现带头结点的单链表合并
- C++实现带头结点的单链表(友元类)
- 不带头结点的链表头插法C++实现
- 不带头结点的链表实现
- 单链表的C++实现(采用模板类)
- C++中的链表节点用模板类和用普通类来实现的区别
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- C++利用链表模板类实现一个简易队列
- 线性表的链式存储结构_单向链表[带头结点]_C#实现
- c++模板类实现基础二叉树的各种操作
- 【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)