数据结构与算法系列(1)-单链表类的实现(C++)

通过定义一个C++类封装单链表这种数据结构,

封装的方法有:

1.通过输入创建单链表;

2.获取单链表的数据元素个数;

3.打印输出单链表中各个元素;

4.搜索某个元素在单链表中的位置;

5.在某个位置之后插入一个结点;

6.在某个位置删除一个节点;

7.单链表逆置;

8.单链表是否存在回环的判定;

9.单链表的升序排序;

10.两个单链表的升序合并;

11.两个单链表的降序合并。

注:单链表的排序采用的是快速排序的方法。

下面是C++写的程序代码,附运行截图。

#include <iostream>
#include <malloc.h>
#include <math.h>

using namespace std;

typedef struct node //结点类型
{
	int data;//数据域
	node* next;//指针域
}node;

class LinkList//单链表类的定义
{

public:
	LinkList(int N=0)//但参数构造函数,生成含N个元素的链表(不包括头结点)
	{
		CreateList(N);
		len=GetLength();
	}
	node* head;//头结点指针
	int len;//元素个数
public:
	void CreateList(int n);//根据输入创建单链表
	int GetLength();//获取单链表的长度(元素个数)
	void PrintList();//打印单链表的各个元素
	int  SearchNode(int data);//查找某个元素在单链表中的位置,不过不存在,返回0。
	bool InsertNode(int pos,int data);//在pos位置后插入值为data的节点
	bool DeleteNode(int pos);//删除pos位置后的第一个元素,删除成功返回true.
	void Reverse();//将单链表逆置
	bool IsLoop();//判断单链表中是否存在会换,存在返回真,不存在返回false
	void SelfASOrder();//将链表中元素升序排列
	void ASCMerge(LinkList& L);//与另一个链表升序合并
	void DESCMerge(LinkList& L);//与L链表降序合并

private:
	void QuikSort(node* start,node* end);
	
};

void LinkList::CreateList(int n)//根据输入创建单链表
{
	head = new node;
	head->data=0;
	head->next=NULL;
	node *p,*q;
	int temp;
	q=head;
	while(n--)
	{
		cin>>temp;
		p=new node;
		p->data=temp;
		p->next=NULL;
		q->next=p;
		q=p;
		p=NULL;
		
	}
	q=NULL;
	delete q;
	
}

void LinkList::PrintList()//打印单链表的每一个元素
{
	len=GetLength();
	int l=len;
	
	node* p=head->next;
	while(l--)
	{
		cout<<p->data<<"  ";
		p=p->next;
	}
	p=NULL;
	delete p;
	cout<<endl;
}

int LinkList::GetLength()//获取单链表的长度
{
	int l=0;
	node* p=head;
	while((p->next)!=NULL)
	{
		l++;
		p=p->next;
	}
	return l;
}

int LinkList::SearchNode(int data)//查找某个元素在单链表中的位置,如果不存在这个元素,返回0
{
	int locate=0;
	node *p=head->next;
	while(len--)
	{
		if(p->data==data)
		{  locate=10-len;
			break;
		}
		p=p->next;
	}
	return locate;
}

bool LinkList::InsertNode(int pos,int data)//插入节点
{
	len=GetLength();
	if(pos>len)//插入位置超出范围
		return false;
	
	node* p=head->next;
	if(0==pos)
	{ 
		p=head;
		node* q = new node;
		q->data=data;
		q->next=p->next;
		p->next=q;
		p=NULL;
		q=NULL;
		delete p;
		delete q;
		len++;
		return true;
	}
	else
	{

	
	pos=pos-1;
	while(pos--)
	{
		p=p->next;
	}
	node* q = new node;
	q->data=data;
	q->next=p->next;
	p->next=q;
	p=NULL;
	q=NULL;
	delete p;
	delete q;
	len++;
	return true;
	}
}

bool LinkList::DeleteNode(int pos)
{
	len=GetLength();
	if(pos>=len)
		return false;
	node* p=head;
	pos=pos-1;
	while(pos--)
	{
		p=p->next;
	}
	node* q=p->next;
	p->next=p->next->next;
	delete q;
	q=NULL;
	len++;
	return true;


}

void LinkList::Reverse()
{
	node *p,*q,*r;
	if(head->next==NULL)
	{
		return;
	}
	p=head->next;
	q=p->next;
	p->next=NULL;
	while(q!=NULL)
	{
		r=q->next;
		q->next=p;
		p=q;
		q=r;
	}
	head->next=p;
}

bool LinkList::IsLoop()
{
	node *p=head->next;
	node* q=head->next->next;
	while((q!=NULL)&&(p!=q))
	{
		p=p->next;
		q=q->next->next;

	}
	if(p==q)
		return true;
	else
		return false;
}

void LinkList::SelfASOrder()//升序排列,采用快速排序的方法
{
	node* start,*end;
	int len=GetLength();
	start=head->next;
	end=start;
	while((end->next)!=NULL)
		end=end->next;
	QuikSort(start,end);

	

}

void LinkList::QuikSort(node* start,node*end)
{
	
	if(start==end)
		return;
	int Len=0;
	node* st=start;
	node* en=end;
	while(st!=en)
	{
		st=st->next;
		Len++;
	}
	double x=Len/2.0;
	double xL=floor(x);
	double xU=ceil(x);
	double HalfLen=x;
	int L=xL;
	int U=xU;
	node* mid=start;
	node* midl=start;

	while(U--)
	{
		mid=mid->next;
	}

	while(L--)
	{
		midl=midl->next;
	}
	node* s=start;
	node* m=mid;
	int flag=0;
	for(int i=0;i<xL+1;++i)
	{
		flag=midl-start+1;
		if((s->data)>(m->data))
		{
			s->data^=m->data;//交换
			m->data^=(s->data);
			s->data^=(m->data);
		}
		s=s->next;
		m=m->next;

	}
	QuikSort(start,midl);
	QuikSort(mid,end);
}

void LinkList::ASCMerge(LinkList& L)
{
	this->SelfASOrder();
	L.SelfASOrder();
	node* q=(L.head)->next;
	node* p=head->next;
	int position=0;
	while((p!=NULL)&&(q!=NULL))
	{
		if(q->data<p->data)
		{
			InsertNode(position,q->data);
			q=q->next;
			position++;
		}
		else
		{
			p=p->next;
			position++;
		}
	}
	position=GetLength();
	while(q!=NULL)
	{
		InsertNode(position,q->data);
		q=q->next;
		position++;
	}

}

void LinkList::DESCMerge(LinkList& L)
{
	ASCMerge(L);
	Reverse();
}

int main()
{
	LinkList L(10);
	cout<<"Input the L1 List:"<<endl;
	LinkList L1(15);
	L.PrintList();

	cout<<endl<<"Input the data to search:"<<endl;
	int DataSearch=0;
	cin>>DataSearch;
	cout<<L.SearchNode(DataSearch)<<endl;


	cout<<"Input the data to insert:"<<endl;
	int DataInsert=0;
	cin>>DataInsert;
	cout<<"Input the position to insert:"<<endl;
	int PosInsert=0;
	cin>>PosInsert;
	if(L.InsertNode(PosInsert,DataInsert))
	{
	cout<<"Insert successfully! The new list is:";
	L.PrintList();

	}
	else
	cout<<"Insert Failed!"<<endl;

	cout<<"Input the position to delete:"<<endl;
	int PosDel=0;
	cin>>PosDel;
	if(L.DeleteNode(PosDel))
	{
	cout<<"Delete successfully! The new list is:";
	L.PrintList();
	}
	else
	{
	cout<<"Delete Failed!"<<endl;
	}

	L.Reverse();
	cout<<"The new list after reversed is:";
	L.PrintList();

	/*if(L.IsLoop())
		cout<<"There is a Loop in the List"<<endl;
	else
		cout<<"There is No Loop in the List"<<endl;
*/
	L.SelfASOrder();
	cout<<"List after ASCSorted:";
	L.PrintList();

	LinkList L2;
	L2=L;
	L2.ASCMerge(L1);
	cout<<"L and L1 ASCMerge is:"<<endl;
	L2.PrintList();

	LinkList L3;
	L3=L;
	L3.DESCMerge(L1);
	cout<<"L and L1 DESCMerge is:"<<endl;
	L3.PrintList();
	
	return 0;
}
运行截图

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。