本文实例为大家分享了C++实现单链表的构造代码,供大家参考,具体内容如下
单链表的构造,包括最常用函数,setData(),Insert(),Remove(),getData(),Search()。
代码如下:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
#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;
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/xiaoming1430026911/article/details/77506109








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。