C++如何实现单链表的构造-创新互联

这篇文章主要讲解了C++如何实现单链表的构造,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

公司主营业务:网站制作、网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出株洲免费做网站回馈大家。

单链表的构造,包括最常用函数,setData(),Insert(),Remove(),getData(),Search()。

代码如下:

#include 
#include 
 
using namespace std;
 
template
struct LinkNode{
  T data;
  LinkNode *link;
  LinkNode(LinkNode *ptr=NULL){link=ptr;}
  LinkNode(const T& item, LinkNode *ptr=NULL){data=item; link=ptr;}
};
 
template
class List{
public:
  List(){first=new LinkNode;}
  List(const T& x){first=new LinkNode(x);}
  List(List &L);
  ~List(){makeEmpty();}
  void makeEmpty();
  int Length()const;
  LinkNode *getHead()const{return first;}
  LinkNode *Search(T x);
  LinkNode *Locate(int i);
  bool getData(int i, T &x)const;
  void setData(int i,T &x);
  bool Insert(int i,T &x);
  bool Remove(int i, T &x);
  bool IsEmpty()const{return (first->link==NULL)?true:false;}
  bool IsFull()const{ return false;}
  void Sort();
  void inputFront(T endTag);
  void inputRear(T endTag);
  void output();
  List& operator=(List &L);
private:
  LinkNode *first;
};
 
template
void List::makeEmpty(){
  //if(first->link==NULL)return;
  LinkNode *p=first->link;
  while(p!=NULL){
   first->link=p->link;
   delete p;
   p=first->link;
  }
}
 
template
LinkNode *List::Search(T x){
  LinkNode *p=first->link;
  while(p!=NULL){
   if(p->data==x)break;
   p=p->link;
  }
  return p;//无论是否找到都返回p,若找到则返回p,没有则返回空指针
}
 
template
LinkNode *List::Locate(int i){
  //这个定位函数的作用还是非常大的,方便后来的函数根据i定位到相应位置的节点
  if(i<0)return NULL;
  int sum=0;
  LinkNode *p=first;
  while(p!=NULL&&sumlink;
  }
  return p;//无论是否为空指针,返回的都是到达i位置的指针,如果没有到达就是已经到结尾了
}
 
template
bool List::getData(int i, T& x)const{
  if(i<0)return false;
  LinkNode *p=Locate(i);
  if(p==NULL)return false;
  else{
  x=p->data;
  return true;
  }
}
 
template
void List::setData(int i, T& x){
  if(i<0)return;
  LinkNode *p=Locate(i);
  if(p==NULL)return;
  else{
   p->data=x;
  }
}
 
template
bool List::Insert(int i, T &x){
   //LinkNode *pre=Locate(i-1);
   //这里是指插入到第i个元素之后的情况
   LinkNode *cur=Locate(i);
   if(cur==NULL)return false;
   LinkNode *p=new LinkNode(x);
   if(p==NULL){cerr<<"存储分配错误!"<link=cur->link;
     cur->link=p;
     return true;
   }
}
 
template
bool List::Remove(int i, T& x){
  //删除第i个位置的元素
  LinkNode *pre=Locate(i-1);
  if(pre==NULL)return false;
  LinkNode *current=pre->link;
  if(current==NULL)return false;
  x=current->data;
  pre->link=current->link;
  delete current;
  return true;
}
 
template
void List::output(){
  LinkNode *current=first->link;
  while(current!=NULL){
   cout<data<<" ";
   current=current->link;
  }
}
 
template
List& List::operator=(List& L){
  //这是赋值方法
  LinkNode *srcptr=L.getHead(), *p=srcptr->link;
  LinkNode *desptr=first=new LinkNode;
  T value;
  while(p!=NULL){
   value=p->data;
   desptr->link=new LinkNode(value);
   desptr=desptr->link;
   p=p->link;
  }
  return *this;
  //用上面这种方法可以更好地实现赋值
//  LinkNode *pre=L.getHead();
//  if(pre==NULL){
//   first=NULL;
//   return *this;
//  }
//  LinkNode *p=first=new LinkNode;
//  first->link=p;
//  int sum=L.Length();
//  T &x;
//  int i=1;
//  while(i<=sum){
//   L.getData(i++,x);
//   p=new LinkNode(x);
//   p=p->link;
//  }
//  return *this;
 
}
 
template
int List::Length()const{
  int sum=0;
  LinkNode *p=first->link;
  while(p!=NULL){
   sum++;
   first->link=p->link;
   delete p;
   p=first->link;
  }
  return sum;
}
 
 
//前插法建立单链表
template
void List::inputFront(T endTag){
  LinkNode *newNode;
  T value;
  makeEmpty();
  cin>>value;
  while(value!=endTag){
   newNode=new LinkNode(value);
   if(newNode==NULL){cerr<<"内存分配错误!"<link=first->link;
   first->link=newNode;
   cin>>value;
  }
}
 
//后插法建立单链表
template
void List::inputRear(T endTag){
  LinkNode *newNode=new LinkNode, *last;
  T value;
  last=first=new LinkNode;
  cin>>value;
  while(value!=endTag){
   newNode=new LinkNode(value);
   if(newNode==NULL){cerr<<""<link=newNode;
   last=newNode;
   cin>>value;
  }
}
 
//复制构造函数
template
List::List(List &L){
  //复制构造函数
  T value;
  LinkNode *srcptr=L.gethead(), p=srcptr->link;
  LinkNode *desptr=first->link=new LinkNode;
  while(p!=NULL){
   value=p->data;
   desptr=new LinkNode(value);
   desptr=desptr->link;
   p=p->link;
  }
}

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:C++如何实现单链表的构造-创新互联
文章地址:http://pwwzsj.com/article/dijcgp.html