数据结构学习系列二-链表的C++实现
2011-05-25 15:26
716 查看
1 先定义一个链表的结构体
(1)包括数据 int data
(2)下一个节点 Node*Next
2 定义一个链表类
(1)包括数据 int data
(2)下一个节点 Node*Next
2 定义一个链表类
#include<iostream> using namespace std; /*单向链表head为头节点,头结点不包含在链表中,所以在计数时不包含头结点*/ struct Node { Node*Next; int data; }; class NodeManager { private: Node*head; Node*tail; public: NodeManager() { this->head=NULL; this->tail=NULL; } ~NodeManager() { while(head) { Node*pTemp; pTemp=head; head=head->Next; delete pTemp; } } void AddNode(int data) //添加数 { if((head==NULL)&&(tail==NULL)) { head=tail=new Node(); Node*pNode=new Node(); head->Next=pNode; tail->Next=pNode; pNode->data=data; tail=pNode; tail->Next=NULL; } else { Node*pNode=new Node(); tail->Next=pNode; pNode->data=data; tail=pNode; tail->Next=NULL; } } void DeleteNode(int dtnum) //删除节点 { Node*node=head;//要删除的节点 Node*pre=head; //删除的节点的前一个节点 while(node!=NULL) { if(head==tail)//空链表 { return; } if(node->data!=dtnum) { pre=node; node=node->Next; } else { if(tail==node) { tail=pre; pre->Next=NULL; } else { pre->Next=node->Next; node=pre->Next;//执行下一步 } } } } void PrintNode() //打印节点 { if(head==NULL) { cout<<"此链表为空!"<<endl; return; } Node*node=head->Next; while(node!=NULL) { cout<<node->data<<endl; node=node->Next; } } int GetCount()//获取节点的数目 { Node*pCurrent=head->Next;//头结点不计 int count=0; while(pCurrent!=NULL) { count++; pCurrent=pCurrent->Next; } return count; } bool RemoveAt(int index) //删除特定位置的数据 { if(index<0||index>getCount()) { cout<<"the wrong position!"<<endl; return false; } Node*pre,*cur; pre=head; cur=head->Next; while(index-1) { pre=pre->Next; cur=cur->Next; --index; } if(tail==cur) { tail=pre; } pre->Next=cur->Next; if(cur!=NULL) { return true; } else { return false; } } bool InsertAt(int index,int value)//在索引前插入新节点 { if(index<=0||index>this->getCount()) { cout<<"the wrong position"<<endl; return false; } Node*current=head; while(index-1) { current=current->Next; --index; } Node*add=new Node(); add->data=value; add->Next=current->Next; current->Next=add; if(current->Next!=NULL) return true; else return false; } void ClearList() //清空链表 { Node*pCurrent1=head; Node*pCurrent2=head; while(pCurrent1->Next) { pCurrent2=pCurrent1->Next; delete pCurrent1; pCurrent1=pCurrent2; } head=NULL; } }; void main() { NodeManager*nm=new NodeManager(); int addnum=0; int dtnum=0; int index=0; int value=0; while(1) { char choice; cin>>choice; switch(choice) { case '0': return; case '1': cout<<"请输入要添加的数据"<<endl; cin>>addnum; nm->addNode(addnum); cout<<"****************"<<endl; break; case '2': cout<<"显示链表中的数据"<<endl; nm->printNode(); cout<<"****************"<<endl; break; case '3': cout<<"请输入要删除的链表中的数据"<<endl; cin>>dtnum; nm->deleteNode(dtnum); cout<<"*****************"<<endl; break; case '4': cout<<"获取链表的长度"<<endl; cout<<nm->getCount()<<endl; cout<<"***************"<<endl; break; case '5': cout<<"按索引删除数据,请输入索引值"<<endl; cin>>index; if(nm->RemoveAt(index)) { cout<<"删除数据成功"<<endl; } else { cout<<"删除数据失败"<<endl; } cout<<"****************"<<endl; break; case '6': cout<<"按索引插入值,请输入索引值及要插入的数据"<<endl; cin>>index; cin>>value; if(nm->InsertAt(index,value)) { cout<<"插入数据成功"<<endl; } else { cout<<"插入数据失败"<<endl; } cout<<"*******************"<<endl; break; case '7': cout<<"删除链表中的所有数据"<<endl; nm->ClearList(); cout<<"*********************"<<endl; break; } } }
相关文章推荐
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)
- 数据结构学习系列一--链表的建立(c语言实现)
- 【C++数据结构学习笔记---线性表】用单链表实现线性表
- 【C++数据结构学习笔记---栈】用链表实现栈
- 算法与数据结构课程中的c++实现的顺序表和链表
- 数据结构_串_用链表做存储结构实现KMP算法_C++实现
- [数据结构]链表的实现-C++
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
- C++算法与数据结构学习笔记------单链表实现多项式
- 数据结构学习第一篇--C++实现单链表模板
- c++实现数据结构链表的插入 删除 倒置 取值(vs测试可以运行)
- C++再学习系列:使用合理的引用参数实现接口的自说明
- 经典算法与数据结构的c++实现——带头结点的单链表
- 数据结构-链表逆置(c++模板类实现)
- 【C++数据结构】模版类实现双循环链表的基本操作
- c++实现数据结构3.双链表
- 数据结构学习系列四-顺序栈(c语言实现)
- python数据结构学习笔记-2016-10-28-02-使用链表实现稀疏矩阵
- 数据结构学习系类列十-链表集合(c++)
- 【Garry逆袭数据结构】之 链表 知识点学习--Android地基系列(一)