单链表的C++实现

来源:互联网 发布:sql是一种什么语言 编辑:程序博客网 时间:2024/06/16 10:03

简单用C++实现了单链表及其基本操作。

自身水平有限,如有错误,请大家指教。

/*/  内容:单链表C++实现/  作者:phlixce/  时间:2017.5.25*/#include<iostream>#include<stdio.h>#include<time.h>using namespace std;typedef int ElemType;class LNode{public:ElemType data;LNode *next;LNode(){next=NULL;}};class slist{public:bool InitSlist();                            //初始化带头结点的单链表bool DestroySlist(); //销毁单链表bool Head_CreateSlist(); //头插法建立链表bool Rear_CreateSlist(); //尾插法建立链表bool SlistEmpty(); //判断链表是否为空ElemType SlistLength(); //计算链表的长度ElemType GetElem(ElemType i);                //找寻链表中第i个节点的元素,返回其数据ElemType LocateElem(ElemType data); //找寻data是否是链表中的数据,如果是返回其所在位置下标,否则返回0bool SlistInsert(ElemType i, ElemType data); //在链表的第i个位置插入数据databool SlistDelete(ElemType i); //删除链表中第i个数据void SlistReverse();                         //对链表进行反序void DisSlist(); //输出链表private:LNode *head;};bool slist::InitSlist(){head=new LNode();head->next=NULL;return true;}bool slist::DestroySlist(){LNode *p;while(head){p=head->next;delete head;head=p;}return true;}bool slist::Head_CreateSlist(){ LNode *p,*q; p=head;  cin.clear(); cin.sync();  // 清除缓存区的数据流 cout<<"请输入链表(头插法)中的数据(ctrl+z结束):"<<endl; q=new LNode(); while(cin>>q->data) { q->next=p->next; p->next=q; q=new LNode(); } return true;}bool slist::Rear_CreateSlist(){LNode *p,*q;p=head;cin.clear();cin.sync();  // 清除缓存区的数据流cout<<"请输入链表(尾插法)中的数据(ctrl+z结束):"<<endl;q=new LNode();while(cin>>q->data){p->next=q;p=q;q=new LNode();}return true;}ElemType slist::SlistLength(){int length=0;LNode *p=head->next;while(p){length++;p=p->next;}return length;}bool slist::SlistEmpty(){if(SlistLength())return true;elsereturn false;}ElemType slist::GetElem(ElemType i){if(i<0||i>SlistLength()){cout<<"Invalid input find location parameter!"<<endl;return -1;}LNode *p=head;while(p&&i){p=p->next;i--;}return p->data;}ElemType slist::LocateElem(ElemType data){LNode *p=head->next;int n=0;while(p){n++;if(p->data==data)return n;p=p->next;}return false;}bool slist::SlistInsert(ElemType i, ElemType data){LNode *p=head;int index=1;while(p && index<i){p=p->next;index++;}if(!p || index>i)return false;LNode *tmp=new LNode();tmp->data=data;tmp->next=p->next;p->next=tmp;return true;}bool slist::SlistDelete(ElemType i){LNode *p=head;int index=1;while(p && index<i){p=p->next;index++;}if(!p || index>i)return false;LNode *q;q=p->next;p->next=q->next;delete q;return true;}void slist::SlistReverse(){LNode *p,*q;int length=SlistLength();int m=1;int n=length;while(m<n){int i,j;p=head;q=head;i=m;j=n;while(p && i){p=p->next;i--;}int tmp=p->data;while(q && j){q=q->next;j--;}p->data=q->data;q->data=tmp;m++;n--;}}void slist::DisSlist(){LNode *p;p=head->next;cout<<"链表的数据为:"<<endl;while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;}void main(){slist link1,link2;link1.InitSlist();link2.InitSlist();link1.Head_CreateSlist();link1.DisSlist();cout<<endl;link2.Rear_CreateSlist();link2.DisSlist();cout<<endl;cout<<"查询link1的第二个数"<<endl;cout<<"link1第二个数为:"<<link1.GetElem(2)<<endl;cout<<endl;cout<<"link1数据5的位置是:"<<link1.LocateElem(5)<<endl;cout<<"link1数据7的位置是(若没有则返回0):"<<link1.LocateElem(7)<<endl;cout<<endl;cout<<"在link1的第二个位置插入数据7"<<endl;link1.SlistInsert(2,7);link1.DisSlist();cout<<endl;cout<<"删除link1中的第四个数据"<<endl;link1.SlistDelete(4);link1.DisSlist();cout<<endl;cout<<"将link1反序"<<endl;link1.SlistReverse();link1.DisSlist();cout<<endl;system("pause");}



参考链接:

http://blog.csdn.net/piaopiaopiaopiaopiao/article/details/25651001

原创粉丝点击