C++实现单链表的构造

所属分类: 软件编程 / C 语言 阅读数: 95
收藏 0 赞 0 分享

本文实例为大家分享了C++实现单链表的构造代码,供大家参考,具体内容如下

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

代码如下:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

从汇编看c++中变量类型的深入分析

本篇文章是对c++中的变量类型进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

从汇编看c++的默认析构函数的使用详解

本篇文章是对c++中默认析构函数的使用进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

基于c++中的默认拷贝函数的使用详解

本篇文章对c++中默认拷贝函数的使用进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

解析c++中的默认operator=操作的详解

本篇文章是对c++中的默认operator=操作的应用进行了详细的分析介绍。需要的朋友参考下
收藏 0 赞 0 分享

解析c++中参数对象与局部对象的析构顺序的详解

本篇文章是对c++中参数对象与局部对象的析构顺序进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

深入c++中临时对象的析构时机的详解

本篇文章对c++中临时对象的析构时机进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

解析内存对齐 Data alignment: Straighten up and fly right的详解

对于所有直接操作内存的程序员来说,数据对齐都是很重要的问题.数据对齐对你的程序的表现甚至能否正常运行都会产生影响
收藏 0 赞 0 分享

深入内存对齐的详解

本篇文章是对内存对齐进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

深入C语言把文件读入字符串以及将字符串写入文件的解决方法

本篇文章是对C语言把文件读入字符串以及将字符串写入文件的方法进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享

深入Windows下的回车是回车换行(\r\n)还是换行回车(\n\r)的详解

本篇文章对Windows下的回车是回车换行(\r\n)还是换行回车(\n\r)进行了详细的分析介绍,需要的朋友参考下
收藏 0 赞 0 分享
查看更多