循环链表的C++实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zcawesome/article/details/79889834

今天在单链表的基础上实现了循环链表其实只需要加上一个从任意位置输出表再稍微改动一下其他位置把最后一个结点的指针指向头结点就可以了

//循环链表 
#include<iostream>
#include<cstdlib>
using namespace std;
struct node{
	int data1;
	node *next;
}; 
class singlelink{
	private:
		node data;
		int length;
	public:
		singlelink(){
			length=0;
			data.data1=0;
			data.next=&data;
		}
		~singlelink(){};
		bool isempty(){
			if(length==0)
				return true;
			else 
			 	return false;
		}
		int returnlength(){
			return length;
		}
		bool insert(int position, int num);
		bool deletenode(int position);
		int returnnum(int position);
		void returnallnum(int position);
		bool deleteall();
		void headinsert(int num);
		void rearinsert(int num);
		
};
	bool singlelink::insert(int position, int num){
		if(position>length+1)
			return false;
		else{
			node* probe=&data;
			for(int i=1;i<position;i++){
				probe=probe->next;
			}
			node* newnode=new node;
			newnode->data1=num;
			newnode->next=probe->next;
			probe->next=newnode;
			length++;
		}
		return true;
	}
	bool  singlelink::deletenode(int position){
		if(position>length)
			return false;
		else{
			node* probe=&data;
			node* temp=NULL;
			for(int i=1;i<position;i++){
				probe=probe->next;
			}
			temp=probe->next;
			probe->next=probe->next->next; 
			free(temp);
			length--;
			return true;
			
		}	
	}
	int singlelink::returnnum(int position){
		node* probe=&data;
		for(int i=1;i<=position;i++){
			probe=probe->next;
		}
		return probe->data1;
	}
	bool singlelink::deleteall(){
		node* probehead=&data;
		node* proberear=NULL;
		while(probehead->next!=&data){
			proberear=probehead->next;
			free(probehead);
			probehead=proberear;
			length--;
		}
		free(probehead);
		if(length==0)
			return true;
		else
			return false;
	}
	void singlelink::headinsert(int num){
		node* probe=&data;
		node* newnode=new node;
		newnode->data1=num;
		newnode->next=probe->next;
		probe->next=newnode;
		length++;
	}
	void singlelink::rearinsert(int num){
		node* probe=&data;
		for(int i=1;i<=length;i++){
			probe=probe->next;
		}
		node* newnode=new node;
		newnode->data1=num;
		newnode->next=&data;
		probe->next=newnode;
		length++;
	}
	void singlelink::returnallnum(int position){
		int times=0;
		node* probe=&data;
		for(int i=1;i<=position;i++){
			probe=probe->next;
		}
		while(times<length){
			if(probe!=(&data)){
			
			cout<<probe->data1<<" ";
			times++;
			probe=probe->next;
		}
			else
			probe=probe->next;
		} 
	}
	int main(){
		singlelink a1,a2;
		if(a1.isempty())
		cout<<"是空链表"<<endl;
		for(int i=1, j=10;i<21;i++,j++){
			a1.headinsert(j);
			a2.rearinsert(j);
		}
		cout<<"a1,a2的长度分别是"<<a1.returnlength()<<"  "<<a2.returnlength()<<endl;
		cout<<"a1成员为"<<endl; 
		for (int i=1;i<=a1.returnlength();i++){
		cout<<a1.returnnum(i)<<" ";
		}
		cout<<endl;
		cout<<"a2成员为"<<endl; 
		for (int i=1;i<=a2.returnlength();i++){
		cout<<a2.returnnum(i)	<<" ";
		}
		cout<<endl;
		a1.deletenode(9);
		cout<<"删除第9node后a1成员为"<<endl; 
		for (int i=1;i<=a1.returnlength();i++){
		cout<<a1.returnnum(i)	<<" ";
		}
		cout<<endl;
		a1.insert(9,520);
		cout<<"插入第9node后a1成员为"<<endl; 
		for (int i=1;i<=a1.returnlength();i++){
		cout<<a1.returnnum(i)	<<" ";
		}
		cout<<endl;
		a1.returnallnum(9);
		cout<<endl;
		if(a1.deleteall())
		cout<<"删除a1成功"<<endl;
		return 0;
	}
	

猜你喜欢

转载自blog.csdn.net/zcawesome/article/details/79889834