首页 > 代码库 > 作业1 线性表 链表 的定义和实现
作业1 线性表 链表 的定义和实现
1 #include <iostream> 2 using namespace std; 3 4 5 template<class T> 6 struct SLNode 7 { 8 T data; 9 SLNode<T>* next; 10 SLNode(SLNode<T>*nextNode=NULL){next=nextNode;} 11 SLNode(const T&item,SLNode<T>*nextNode=NULL) 12 { 13 data=http://www.mamicode.com/item; 14 next=nextNode; 15 } 16 }; 17 18 template<class T> 19 class SLList 20 { 21 public: 22 //构造函数 构造一个只有哨位结点的空表 23 SLList():length(0){head=tail=new SLNode<T>(); } 24 SLList(const T&item); //构造函数 25 ~SLList(); //析构函数 26 27 bool IsEmpty()const{return head->next==NULL;}//判断表是否为空 28 int Length()const{return length;}; //返回表的长度 29 30 //存取 将链表中第k个结点的字段值赋给item 31 bool Findk(int k,T&item)const; 32 //存取 当前结点的字段值赋给item 33 bool Findc(T&item)const; 34 35 //查找 在链表中查找字段值为x的结点并返回其在表中的位置 36 int Search(const T&item)const; 37 38 bool Delete(T& ITEM); //删除:删除当前结点并将其字段值赋给item 39 bool DeleteFromHead(T& ITEM); //删除:删除表头结点并将其字段值赋给item 40 bool DeleteFromTail(T& ITEM); //删除:删除表尾结点并将其字段值赋给item 41 42 void Insert(const T& item); //插入:在当前结点后插入字段值为item的结点 43 void InsertFromTail(const T&item); //插入:在表尾插入字段值为item的结点 44 void InsertFromHead(const T&item); //插入:在哨位结点后插入字段值为item的结点 45 46 void output(); 47 48 void SetCH(){currptr=head;} //设置当前指针为表头结点 49 50 bool SetCK(int k); //设置当前指针为第k个结点 51 52 private: 53 int length; 54 SLNode<T>*head,*tail;//表头和表尾 55 SLNode<T>*currptr; 56 }; 57 58 //============================================================= 59 template<class T> 60 SLList<T>::SLList( const T&item) //构造函数 61 { 62 tail=currptr=new SLNode<T>(item); 63 head=new SLNode<T>(currptr); 64 length=1; 65 } 66 67 68 template<class T> 69 SLList<T>::~SLList() //析构函数 70 { 71 while(head->next) 72 { 73 currptr=head->next; 74 head->next=currptr->next; 75 delete currptr; 76 } 77 delete head; 78 length=0; 79 } 80 81 //========================================================== 82 83 84 template<class T> 85 void SLList<T>::Insert(const T&item) //插入:在当前结点后插入字段值为item的结点 86 { 87 if(currptr==head) 88 { 89 InsertFromHead(item); 90 } 91 if(currptr!=NULL) 92 { 93 currptr=new SLNode<T>(item,currptr->next); 94 if(tail==currptr) 95 tail=tail->next; 96 length++; 97 } 98 else cout<<"未指定当前结点!"<<endl; 99 }100 101 template<class T>102 void SLList<T>::InsertFromTail(const T&item)//插入:在表尾插入字段值为item的结点103 {104 tail->next=new SLNode<T>(item,NULL);105 tail=tail->next;106 length++;107 }108 109 template<class T>110 void SLList<T>::InsertFromHead(const T&item)//插入:在哨位结点后插入字段值为item的结点 111 {112 if(!length)113 {114 tail=head->next=new SLNode<T>(item,NULL);115 116 }117 else118 head->next=new SLNode<T>(item,head->next);119 length++;120 }121 122 //==========================================================123 124 template<class T>125 bool SLList<T>::Delete(T&ITEM)//删除:删除当前结点的后继节点并并将其字段值赋给item126 {127 if(currptr==tail||IsEmpty())128 {129 cout<<"没有后继节点 或者 是空表!\n";130 return 0; 131 }132 SLNode<T>*temp=currptr->next;133 currptr->next=temp->next;134 length--;135 ITEM=temp->data;136 delete temp;137 return 1;138 } 139 140 template<class T>141 bool SLList<T>::DeleteFromHead(T&ITEM)//删除:删除表头结点的后继节点并将其字段值赋给item142 {143 if(!length)144 {145 cout<<"空表!\n";146 return 0; 147 }148 SLNode<T>*temp=head->next;149 head->next=temp->next;150 length--;151 ITEM=temp->data;152 if(temp==tail) tail=head;153 delete temp;154 return 1;155 }156 157 template<class T>158 bool SLList<T>::DeleteFromTail(T& ITEM)//删除:删除表尾结点并将其字段值赋给item159 {160 if(IsEmpty())161 {162 cout<<"空表!\n";163 return 0; 164 }165 currptr=head;166 while(currptr->next!=tail)167 {168 currptr=currptr->next;169 }170 ITEM=currptr->data;171 delete tail;172 length--;173 tail=currptr;174 return 1;175 176 } 177 178 179 //===============================================================180 181 //存取 将链表中第k个结点的字段值赋给item 182 183 template<class T>184 bool SLList<T>::Findk(int k,T&item)const185 { 186 if(k>length) 187 {188 cout<<"表中没有第k个元素!"<<endl; 189 return 0;190 }191 SLNode<T>*temp=head;192 int i=0;193 while(k!=i)194 {195 temp=temp->next;196 i++;197 } 198 item=temp->data;199 return 1;200 } 201 202 203 //存取 当前结点的字段值赋给item 204 205 template<class T>206 bool SLList<T>::Findc(T&item)const207 {208 if(currptr!=NULL&&currptr!=head)209 {210 item=currptr->data;211 return 1;212 }213 cout<<"存取失败"<<endl; 214 return 0;215 }216 217 218 //========================================================= 219 template<class T> 220 void SLList<T>::output()221 {222 if(!IsEmpty()) 223 {224 currptr=head->next;225 while(currptr!=tail)226 {227 cout<<"["<<currptr->data<<"]"<<"->";228 currptr=currptr->next;229 }230 cout<<"["<<tail->data<<"]"<<endl;231 }232 else cout<<"空表!"<<endl; 233 }234 235 //======================================================236 template<class T>237 int SLList<T>::Search(const T&item)const238 { 239 SLNode<T>*temp=head;240 int i=0;241 while(temp->next!=NULL)242 {243 temp=temp->next;244 i++;245 if(temp->data=http://www.mamicode.com/=item)246 return i;247 } 248 cout<<"表中没有该元素"<<endl; 249 } 250 251 252 //=======================================================253 template<class T>254 bool SLList<T>::SetCK(int k) //设置当前指针为第k个结点 255 {256 if(k>length) 257 {258 cout<<"表中没有第k个元素!"<<endl; 259 return 0;260 }261 SLNode<T>*temp=head;262 int i=0;263 while(k!=i)264 {265 temp=temp->next;266 i++;267 } 268 currptr=temp; 269 return 1;270 }271 272 //==========================================================273 int main()274 {275 SLList<int> A(5);276 A.InsertFromTail(6);277 A.InsertFromHead(2);278 A.SetCH();279 A.Insert(9);280 A.Insert(10);281 A.Insert(11);282 A.SetCK(2);283 int tmp;284 A.Findc(tmp);285 cout<<tmp<<endl;286 A.Findk(2,tmp);287 cout<<tmp<<endl;288 cout<<"6在第"<<A.Search(6)<<"个结点"<<endl; 289 A.output();290 A.SetCK(2);291 A.Delete(tmp);292 A.DeleteFromHead(tmp);293 cout<<tmp<<endl;294 A.DeleteFromTail(tmp);295 cout<<tmp<<endl;296 A.output();297 }
作业1 线性表 链表 的定义和实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。