数据结构书上例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//List.h #include<iostream> #include <fstream> using namespace std; template <class T> struct LinkNode{ T data; LinkNode<T> *link; LinkNode<T> (LinkNode<T> *ptr=NULL) {link=ptr;} LinkNode<T> (const T& item,LinkNode<T> *ptr=NULL) { data=item;link=ptr;} }; template <class T> class List{ public: List() //初始化 {first=new LinkNode<T>;} List(const T& x){first = new LinkNode<T>(x);} List(List<T> &L); ~List(){makeEmpty();} void makeEmpty(); //置空 LinkNode<T>* getHead() const {return first;} LinkNode<T> *Search(T x); //查找x LinkNode<T> *Locate(int i); //寻找第i个节点 bool getData(int i, T & x); //第i个节点的值赋给x bool Insert(int i, T& x); //第i个位置插入i bool IsEmpty()const {return first->link==NULL?true:false;} bool Sort(); //排序 bool input(); //输入数据 List<T> &operator=(List<T> &L); //重载= friend ostream& operator << <T> (ostream& out,List<T> &L); //重载<< friend istream&operator >> (istream&in,List<T> &L) { LinkNode<T> *p,*q; T a; L.makeEmpty(); p=L.getHead(); while(!in.eof()) { in>>a; q=new LinkNode<T>(a); p->link=q; p=q; } p->link=NULL; return in; } //重载>> protected: LinkNode<T> *first; }; template<class T> ostream& operator << (ostream& out,List<T> &L) { LinkNode<T> *q=L.first->link; while(q!=NULL) { out<<q->data<<endl; q=q->link; } return out; }; template <class T> List<T>::List(List<T> &L){ T value; LinkNode<T> *stcptr=L.getHead(); LinkNode<T> *destptr=first=new LinkNode<T>; while(stcptr->link!=NULL){ value=stcptr->link->data; destptr->link=new LinkNode<T>(value); destptr=destptr->link; stcptr=stcptr->link; } destptr->link=NULL; }; template<class T> void List<T>::makeEmpty(){ LinkNode<T> *q; while(first->link!=NULL){ q=first->link; first->link=q->link; delete q; } }; template<class T> LinkNode<T>* List<T>::Search(T x){ LinkNode<T> *current=first->link; while(current!=NULL){ if(current->data==x) break; else current=current->link; } return current; }; template<class T> LinkNode<T>* List<T>::Locate(int i){ if(i<0) return NULL; LinkNode<T>* current=first; int k=0; while(current!=NULL&&k<i) { current=current->link; k++; } return current; }; //取出链表第i个元素值 template<class T> bool List<T>::getData(int i, T&x) { if(i<=0) return false; LinkNode<T>*current=Locate(i); if(current==NULL) return false; else { x=current->data; return true; } }; template <class T> bool List<T>::Insert(int i,T&x) { LinkNode<T>*current=Locate(i); if(current==NULL) return false; LinkNode<T> *newnode=new LinkNode<T>(x); if (newnode==NULL) { cout<<"error"<<endl; return false; } newnode->link=current->link; current->link=newnode; return true; }; template<class T> List<T>& List<T>::operator=(List<T>& L){ T value; LinkNode<T> *srcptr =L.getHead(); LinkNode<T>*destptr=first=new LinkNode<T>; while(srcptr->link!=NULL) { value=srcptr->link->data; destptr->link=new LinkNode<T>(value); destptr=destptr->link; srcptr=srcptr->link; } destptr->link=NULL; return *this; }; template<class T> bool List<T>::Sort() { LinkNode<T> *q; LinkNode<T> *p=first; T x1,x2; int N=0; while(p->link!=NULL) { N++; p=p->link; } while (N==1) { cout<<"the list is kongde"<<endl; return false; } for(int i=1;i<N;i++) { for (int j=N;j>i;j--) { getData(j-1,x1); getData(j,x2); if(x1>x2) { p=Locate(j-1); q=Locate(j); p->data=x2; q->data=x1; } } } }; template<class T> bool List<T>::input() { T x; LinkNode<T >*current=getHead(); cout<<"输入数据(以0结束)"<<endl; cin>>x; while(x!=0){ LinkNode<T> *node=new LinkNode<T>(x); node->link=current->link; current->link=node; cin>>x; } return true; } //main.cpp #include<iostream> #include <fstream> #include"List.h" using namespace std; int main() { List<int> list; int x; int i; cout<<"测试输入"<<endl; list.input(); cout<<"链表如下"<<endl; cout<<list<<endl; cout << "======================= "; cout<<"输入插入的位置和数据"<<endl; cin>>i; cin>>x; if(!list.Insert(i,x)) cout<<"插入失败"<<endl; cout<<"链表如下:"<<endl; cout<<list<<endl; cout << "======================= "; cout<<"测试复制链表"<<endl; List<int> list1(list); cout<<"链表如下:"<<endl; cout<<list1; cout << "======================= "; cout<<"测试查找"<<endl; cout<<"search i"<<endl; cin>>i; LinkNode<int> *current=list.Search(i); if (!current) { cout<<"不存在"<<endl; } else { cout<<"输入要修改的值"<<endl; cin>>i; current->data=i; } cout<<"链表如下:"<<endl; cout<<list; cout << "======================= "; cout<<"测试从文本读取"<<endl; List<int> list2; ifstream sin("data.txt"); /* cout<<"输入文件名和路径"<<endl; char filename[60]; cin.getline(filename,60); ifstream sin; inFile.open(filename); if(!sin.is_open()) { cout<<"can not open the file"<<filename<<endl; return -1; } */ sin>>list2; cout<<"链表如下:"<<endl; cout<<list2<<endl; sin.close(); cout << "======================= "; list2.Sort(); cout<<"排序后的链表如下:"<<endl; cout<<list2<<endl; cout << "======================= "; return 0; } //main.cpp 测试代码 #include<iostream> #include <fstream> #include"List.h" using namespace std; int main() { cout<<"测试从文本读取"<<endl; List<int> list2; cout<<"输入文件名和路径"<<endl; char filename[60]; cin.getline(filename,60); ifstream sin; sin.open(filename); if(!sin.is_open()) { cout<<"文件无法打开"<<filename<<endl; return -1; } sin>>list2; cout<<"链表如下:"<<endl; cout<<list2<<endl; cout << "======================= "; list2.Sort(); cout<<"排序后的链表如下:"<<endl; cout<<list2<<endl; cout << "======================= "; sin.close(); List<int> list; int x; int i; cout<<"测试输入"<<endl; list.input(); cout<<"链表如下"<<endl; cout<<list<<endl; cout << "======================= "; cout<<"输入插入的位置和数据"<<endl; cin>>i; cin>>x; if(!list.Insert(i,x)) cout<<"插入失败"<<endl; cout<<"链表如下:"<<endl; cout<<list<<endl; cout << "======================= "; cout<<"测试复制链表"<<endl; List<int> list1(list); cout<<"链表如下:"<<endl; cout<<list1; cout << "======================= "; cout<<"测试查找"<<endl; cout<<"search i"<<endl; cin>>i; LinkNode<int> *current=list.Search(i); if (!current) { cout<<"不存在"<<endl; } else { cout<<"输入要修改的值"<<endl; cin>>i; current->data=i; } cout<<"链表如下:"<<endl; cout<<list; cout << "======================= "; return 0; }