C++多文件实现链表的相关的操作

之前的时候用C语言写过链表的相关的操作,闲着没事用c++语言去实现了一下,发现还是C语言用起来比较的痛快微笑

main.cpp文件:

/*6. 设计并实现一个集合类IntSet,集合元素范围为1~100,要求:
 *      (1)正确初始化集合;
 *      (2)支持集合的交集、并集运算;
 *      (3)判断一个指定整数是否在集合中;
 *      (4)将给定整数加入集合,加入前应判断数值范围;
 *      (5)从集合中删除指定元素;
 *      (6)集合对象之间的复制;
 *      (7)获得集合元素个数;
 *      (8)输出集合中的所有元素;*/
#include <iostream>
#include "InSet.h"

using namespace std;
int main()
{
	my_InSet set;
	set.add(1);
	set.add(26);
	set.add(26);
	set.add(45);
	set.add(99);
	set.print();
	cout<<endl;
	int length=set.size();
	cout<<"集合中元素的个数为:"<<length<<endl;
	int num;
	cout<<"请输入要查找的元素"<<endl;
	cin>>num;
	bool a=set.is_Exit(num);
	if(a)
		cout<<num<<"元素在集合中"<<endl;
	else
		cout<<num<<"元素不在集合中"<<endl;
	int m,n;
	cout<<"请输入你要插入的元素的值以及下标"<<endl;
	cin>>m>>n;
	set.insert(m,n);
	cout<<"集合中的元素的个数为"<<set.size()<<endl;
	set.print();
	int c;
	cout<<"请输入你要删除的元素"<<endl;
	cin>>c;
	set.delete_Set(c);
	set.print();
	int a1,b1;
	cout<<"请输入你要查找的元素的下标"<<endl;
	cin>>b1; 
	a1=set.get(b1);
	cout<<"集合当中下标为"<<b1<<"的元素的值为"<<a1<<endl;
	my_InSet set2;
	cout<<"请输入集合2的元素"<<endl;
	set2.add(11);set2.add(3);set2.add(5);set2.add(99);
	cout<<"集合2:";
	set2.print();
	cout<<endl<<"集合1:";	
	set.print();
	cout<<endl<<"两个集合的交集:";
	set.intersection(set2);
	cout<<endl<<"两个集合的并集为:";
	set.union_Set(set2); 
	my_InSet set3(set);
	cout<<"复制的集合3为:"<<set3.size();
	
	set3.print();
	return 0;
}
InSet.cpp文件:

#include <iostream>
#include "InSet.h"
using namespace std;
//初始化一个集合 
my_InSet::my_InSet()
{
	p=NULL;
	max=100;min=1;
}
//向集合中添加元素 
bool my_InSet::add(int num)
{
	if(num>100 || num<1){
		cout<<"请插入1~100以内的元素"<<endl;
		return false;
	}
	struct Node*q=p,*t;
	if(this->is_Exit(num))
		return false;
	if(p==NULL)
	{
		p=new Node;
		p->data=num;
		p->pNext=NULL;
		return true;
	} 
	else{
		while(q->pNext!=NULL){
			q=q->pNext;
		}
		t=new Node;
		t->data=num;
		t->pNext=NULL;
		q->pNext=t;
		return true;
	}
}
//打印集合中的元素 
void my_InSet::print(){
	struct Node*q;
	cout<<endl;
	for(q=p;q!=NULL;q=q->pNext)
		cout<<q->data<<" ";
}
int my_InSet::size(){
	if(p==NULL)
		return 0;
	struct Node *q=p;
	int num=0;
	while(q!=NULL){
		num++;
		q=q->pNext;
	}
	return num;
}
//判断一个元素是否存在与稽核当中 
bool my_InSet::is_Exit(int num)
{
	struct Node *q;
	if(num>100 || num<1)
		return false;
	else{
		for(q=p;q!=NULL;q=q->pNext)
			if(q->data==num)
				return true;
			return false;
	}
}
//向集合中插入一个元素 
void my_InSet::insert(int num,int pos)
{
	if(num>100 || num<1){
		cout<<"请输入指定范围内的元素"<<endl; 
		return;
	}
	if(pos<0 || pos>my_InSet::size()+1){
		cout<<"元素下标越界"<<endl;
		return;
	}
	struct Node *t=p,*r=new Node,*a=new Node;
	int c=0;a->data=num;
	if(pos==0){
		a->pNext=p;
		p=a;
		return;
	}
	while(c<pos-1  && t->pNext!=NULL){
		c++;
		t=t->pNext;
	}
	r=t->pNext;
	t->pNext=a;
	a->pNext=r;
	
	/**
	struct Node *a;
	a->data=num;
	r=t->pNext;
	t->pNext=q;
	q->pNext=r;*/
}
//从集合中删除一个元素
void my_InSet::delete_Set(int num)
{
	if(!my_InSet::is_Exit(num)){
		cout<<"集合中没有这个元素"<<endl;
		return;
	}
	struct Node *q=p;
	if(q->data==num)
	{
		p=q->pNext;
		delete q;
		return;
	}
	for(q=p;q!=NULL;q=q->pNext)
		if(q->pNext->data==num)
			break;
		q->pNext=q->pNext->pNext;	
		
} 
//获取集合当中下标为i的元素的值
int my_InSet::get(int num)
{
	struct Node *q=p;
	int c=0;
	while(c<num && q!=NULL)
	{
		c++;
		q=q->pNext;
	}
	return q->data;
} 
//求集合的交集
void my_InSet::intersection(my_InSet set2)
{
	my_InSet set3;
	for(int i=0;i<this->size();i++)
	{
		for(int j=0;j<set2.size();j++)
		{
			if(this->get(i)==set2.get(j))
			{
				set3.add(this->get(i));
			}
		}
	} 
	set3.print();
}
//求集合的并集 
void my_InSet::union_Set(my_InSet set2)
{
	this->sort();
	set2.sort();
	my_InSet set3;
	int p=0,q=0,k=0;
	int m=this->size(),n=set2.size();
	while(p<m || q<n)
	{
		if(p<m && q<n)
		{
			if(this->get(p)==set2.get(q))
			{set3.add(this->get(p));p++;q++;}
			else if(this->get(p)<set2.get(q))
			{set3.add(this->get(p));p++;}
			else{set3.add(set2.get(q));q++; }
		} 
		else if(p>=m&&q<n){
			set3.add(set2.get(q));q++;
		}
		else if(p<m && q>=n)
		{set3.add(this->get(p));p++;}
	}
	set3.print();
}
//d对集合进行排序
void my_InSet::sort()
{
	struct Node *q,*r;
	int t,i,j;
	for( i=0,q=p;i<this->size()-1;i++,q=q->pNext)
		for(j=i+1,r=q->pNext;j<this->size();j++,r=r->pNext)
			if(q->data>r->data) 
			{
				t=q->data;q->data=r->data;r->data=t;
			}
} 

my_InSet::my_InSet (const my_InSet & set)      //深度拷贝   
{  
    if (set.p == NULL)  
        return;  
	
    Node* q = set.p;  
    Node* s = new Node;  
    this->p = s;                            //创建头指针  
    s->data = q->data;                   //拷贝头指针的数据  
	
    while (q != NULL)  
    {  
        Node*r = new Node ;  //为下一个节点申请空间  
        r->data = q->data;  
        r->pNext = NULL;  
        s->pNext = r;  
        s = r;  
        q = q->pNext;                           
    }  
} 
InSet.h文件:

#ifndef INSET_H
#define INSET_H
class my_InSet
{
private:
	struct Node{
		int data;
		struct Node* pNext;
	}*p;
	int min;
	int max;
	public:
		my_InSet();
		bool add(int num);
		void print();
		int size();
		bool is_Exit(int num);
		void insert(int num,int pos);
		void delete_Set(int num);
		int get(int i);
		void intersection(my_InSet set2);
		void union_Set(my_InSet set2); 
		void sort();
		my_InSet (const my_InSet & set);
		
};
#endif 
运行效果:






猜你喜欢

转载自blog.csdn.net/Scorpion_CG/article/details/61443556