简单用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是否是链表中的数据,如果是返回其所在位置下标,否则返回0
bool SlistInsert(ElemType i, ElemType data); //在链表的第i个位置插入数据data
bool 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;
else
return 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