含头结点的单链表C++实现(包含创建,查找,插入,追加,删除,反转,排序,合并,打印,清空,销毁等基本操作)
温馨提示:下面代码默认链表数据为字符型,本代码仅供参考,希望能对找到本随笔的人有所帮助!
1 #include<iostream> 2 using namespace std; 3 typedef struct Lnode 4 { 5 char data; 6 struct Lnode *next; 7 }LN; 8 LN *CreateLinkList() 9 { 10 LN *head,*p,*pre; 11 char ch; 12 int i=1; 13 head=(LN *)malloc(sizeof(LN)); 14 head->next=NULL; 15 pre=head; 16 while(1) 17 { 18 cout<<"输入第"<<i<<"个节点数据:"; 19 while((ch=cin.get())!='\n') 20 { 21 cin.get(); 22 p=(LN *)malloc(sizeof(LN)); 23 pre->next=p; 24 p->next=NULL; 25 p->data=ch; 26 pre=p; 27 i++; 28 break; 29 } 30 if(ch=='\n') 31 break; 32 } 33 pre->next=NULL; 34 return head; 35 } 36 int LinkListLength(LN *head) 37 { 38 int count=1; 39 LN *p; 40 p=head->next; 41 if(p==NULL) 42 { 43 return 0; 44 } 45 else 46 { 47 while(p->next) 48 { 49 p=p->next; 50 count++; 51 } 52 return count; 53 } 54 } 55 void SearchData(int i,LN *head) 56 { 57 LN *p; 58 int j=0; 59 p=head->next; 60 cout<<"输入要查找的节点:"; 61 cin>>i; 62 while(p&&j<i-1) 63 { 64 p=p->next; 65 j++; 66 } 67 if(!p) 68 { 69 cout<<"该节点不存在!"<<endl; 70 } 71 else 72 { 73 cout<<"该节点数据为:"<<p->data<<endl; 74 } 75 } 76 77 LN *SearchSpecificData(char ch,LN * head) 78 { 79 LN *p; 80 int count=1; 81 p=head->next; 82 while(p) 83 { 84 if(p->data==ch) 85 { 86 cout<<"该数据是链表中第"<<count<<"个数据!"<<endl; 87 return p; 88 break; 89 } 90 else 91 { 92 p=p->next; 93 count++; 94 } 95 } 96 if(p==NULL) 97 { 98 cout<<"链表中不存在该数据!"<<endl; 99 return NULL; 100 } 101 } 102 LN *InsertData(int i,LN *head) 103 { 104 LN *p,*insert; 105 int j=1; 106 char ch; 107 cout<<"输入要插入的数据:"; 108 cin>>ch; 109 cout<<"输入元素插入的位置:"; 110 cin>>i; 111 if(i>LinkListLength(head)+1) 112 { 113 cout<<"插入错误!"<<endl; 114 return NULL; 115 } 116 else if(i==1) 117 { 118 insert=(LN *)malloc(sizeof(LN)); 119 insert->next=head->next; 120 head->next=insert; 121 insert->data=ch; 122 return head; 123 } 124 else 125 { 126 p=head->next; 127 while(p&&j<i-1) 128 { 129 p=p->next; 130 j++; 131 } 132 insert=(LN *)malloc(sizeof(LN)); 133 insert->data=ch; 134 insert->next=p->next; 135 p->next=insert; 136 return head; 137 } 138 } 139 LN *DeleteData(int i,LN *head) 140 { 141 LN *p,*q; 142 int j=0; 143 cout<<"输入要删除的节点位置:"; 144 cin>>i; 145 if(i>LinkListLength(head)) 146 { 147 cout<<"该节点不存在,删除失败!"<<endl; 148 return NULL; 149 } 150 151 else 152 { 153 q=head; 154 while(q&&j<i) 155 { 156 p=q; 157 q=q->next; 158 j++; 159 } 160 161 p->next=q->next; 162 free(q); 163 return head; 164 } 165 } 166 LN * AddDataToTail(char ch,LN *head) 167 { 168 LN *p,*add; 169 p=head; 170 while(p->next) 171 { 172 p=p->next; 173 } 174 add=(LN *)malloc(sizeof(LN)); 175 add->data=ch; 176 p->next=add; 177 add->next=NULL; 178 return head; 179 } 180 LN * PrintLinkList(LN *head) 181 { 182 LN *p; 183 p=head->next; 184 if(p==NULL) 185 { 186 cout<<"空链表无法打印!"<<endl; 187 return NULL; 188 } 189 else 190 { 191 while(p->next) 192 { 193 cout<<p->data<<"-->"; 194 p=p->next; 195 } 196 cout<<p->data<<endl; 197 return head; 198 } 199 } 200 LN * FindMin(LN * head) 201 { 202 LN *p,*minptr; 203 char min; 204 p=head->next; 205 minptr=p; 206 min=minptr->data; 207 while(p!=NULL) 208 { 209 if(p->data<min) 210 { 211 minptr=p; 212 min=p->data; 213 } 214 p=p->next; 215 } 216 return minptr; 217 } 218 LN * DeleteSpecificData(char ch,LN * head) 219 { 220 LN *p,*q; 221 int j=0; 222 q=head->next; 223 p=head; 224 while(q&&q->data!=ch) 225 { 226 p=q; 227 q=q->next; 228 } 229 if(q==NULL) 230 { 231 cout<<"数据不存在,删除失败!"<<endl; 232 return NULL; 233 } 234 else 235 { 236 p->next=q->next; 237 free(q); 238 return head; 239 } 240 } 241 LN * ReverseLinkList(LN * head) 242 { 243 LN *p,*q,*pr; 244 p=head->next; 245 q=NULL; 246 head->next=NULL; 247 while(p) 248 { 249 pr=p->next; 250 p->next=q; 251 q=p; 252 p=pr; 253 } 254 head->next=q; 255 return head; 256 } 257 /* 258 LN *OrderLinkList(LN *head)//链表排序法1 259 { 260 LN *ptn,*p,*minptr,*head1; 261 ptn=(LN *)malloc(sizeof(LN)); 262 ptn->next=NULL; 263 head1=ptn; 264 p=head1; 265 while(LinkListLength(head)!=0) 266 { 267 minptr=FindMin(head); 268 ptn=(LN *)malloc(sizeof(LN)); 269 ptn->data=minptr->data; 270 ptn->next=NULL; 271 if(LinkListLength(head)==1) 272 { 273 p->next=ptn; 274 DeleteSpecificData(minptr->data,head); 275 p=p->next; 276 free(head); 277 break; 278 } 279 p->next=ptn; 280 DeleteSpecificData(minptr->data,head); 281 p=p->next; 282 } 283 return head1; 284 } 285 */ 286 LN * OrderLinkList(LN *head)//链表排序法2(冒泡法排序) 287 { 288 LN *p,*pr; 289 char temp; 290 p=head->next; 291 while(p->next) 292 { 293 pr=p->next; 294 while(pr) 295 { 296 if(pr->data<p->data) 297 { 298 temp=p->data; 299 p->data=pr->data; 300 pr->data=temp; 301 } 302 pr=pr->next; 303 } 304 p=p->next; 305 } 306 return head; 307 } 308 LN *Clear(LN * head)//清除重复数据 309 { 310 LN *q,*p,*ptn; 311 q=head->next; 312 if(q->next==NULL)//链表只有1个数据则直接返回头结点 313 { 314 return head; 315 } 316 else//链表含有2个或以上数据则进行以下操作 317 { 318 p=q->next; 319 320 while(p) 321 { 322 if(q->data!=p->data) 323 { 324 q=q->next; 325 q->data=p->data; 326 } 327 p=p->next; 328 } 329 ptn=q->next; 330 while(ptn) 331 { 332 p=ptn; 333 ptn=ptn->next; 334 free(p); 335 } 336 q->next=NULL; 337 return head; 338 } 339 } 340 LN *EmptyLinkList(LN * head)//(清空)释放除头节点外的所有节点,释放后仍可以进行链表的各种操作 341 { 342 LN *p,*q; 343 p=head->next; 344 head->next=NULL; 345 while(p) 346 { 347 q=p; 348 p=p->next; 349 free(q); 350 } 351 return head; 352 } 353 void DestroyLinkList(LN *head)//(销毁)链表不再存在,释放了所有节点 354 { 355 EmptyLinkList(head); 356 free(head); 357 } 358 359 LN *GetTogether(LN *head,LN *head1)//将一个链表中数据全部追加到另一个链表尾部 360 { 361 LN *p1; 362 p1=head1->next; 363 while(p1) 364 { 365 AddDataToTail(p1->data,head); 366 p1=p1->next; 367 } 368 DestroyLinkList(head1); 369 return head; 370 } 371 372 int main() 373 { 374 int n=0; 375 int choice; 376 char ch; 377 LN *head,*head1,*result; 378 head=CreateLinkList(); 379 if(head->next!=NULL) 380 { 381 cout<<"单链表head创建成功!"<<endl; 382 } 383 else 384 { 385 cout<<"创建了空链表head!"<<endl; 386 } 387 while(1) 388 { 389 system("pause"); 390 system("cls"); 391 cout<<"1.查找指定节点数据"<<endl; 392 cout<<"2.查找指定数据"<<endl; 393 cout<<"3.查找最小数据"<<endl; 394 cout<<"4.插入数据"<<endl; 395 cout<<"5.追加数据"<<endl; 396 cout<<"6.删除指定节点数据"<<endl; 397 cout<<"7.删除指定数据"<<endl; 398 cout<<"8.链表反转"<<endl; 399 cout<<"9.链表排序(非递减)"<<endl; 400 cout<<"10.合并两个链表(非递减)"<<endl; 401 cout<<"11.链表长度"<<endl; 402 cout<<"12.打印链表"<<endl; 403 cout<<"13.清空链表"<<endl; 404 cout<<"14.清除重复数据"<<endl; 405 cout<<"0.退出程序"<<endl; 406 cout<<"请选择操作:"; 407 cin>>choice; 408 switch(choice) 409 { 410 case 1: SearchData(n,head);break; 411 case 2:cout<<"输入待查找数据:";cin>>ch;SearchSpecificData(ch,head);break; 412 case 3:result=FindMin(head);cout<<"最小数据:"<<result->data<<endl;break; 413 case 4: result=InsertData(n,head); 414 if(result) 415 { 416 cout<<"数据插入成功!"<<endl; 417 }break; 418 case 5: cout<<"输入要追加的数据:"<<endl;cin>>ch;AddDataToTail(ch,head);cout<<"数据追加成功!"<<endl;break; 419 case 6: result=DeleteData(n,head); 420 if(result) 421 { 422 cout<<"数据删除成功!"<<endl; 423 }break; 424 case 7:cout<<"输入要删除的数据:"<<endl;cin>>ch;result=DeleteSpecificData(ch,head); 425 if(result) 426 { 427 cout<<"该数据删除成功!"<<endl; 428 }break; 429 case 8:cout<<"反转后链表为:";result=ReverseLinkList(head);PrintLinkList(result);break; 430 case 9:cout<<"链表按非递减排列:";result=OrderLinkList(head);PrintLinkList(result);break; 431 case 10:cin.get();head1=CreateLinkList(); 432 if(head1->next!=NULL) 433 { 434 cout<<"单链表head1创建成功!"<<endl; 435 } 436 else 437 { 438 cout<<"创建了空链表head1!"<<endl; 439 } 440 head=GetTogether(head,head1); 441 head=OrderLinkList(head);if(head->next){cout<<"合并后链表为:";} 442 PrintLinkList(head);break; 443 case 11: cout<<"链表长度为:"<<LinkListLength(head)<<endl;break; 444 case 12:if(head->next){cout<<"链表为:";}PrintLinkList(head);break; 445 case 13:head=EmptyLinkList(head);cout<<"链表已清空!"<<endl;break; 446 case 14:head=Clear(head);cout<<"重复数据已清除!"<<endl;break; 447 case 0:DestroyLinkList(head);exit(0); 448 default:cout<<"输入错误!"<<endl;break; 449 } 450 } 451 return 0; 452 }
欢迎加qq群:882177851