這篇文章主要講解了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++如何實現單鏈表的構造有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。