单链表的C++实现

简单用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值