集合的顺序存储及操作实现
来源:互联网 发布:台湾清华大学知乎 编辑:程序博客网 时间:2024/04/18 05:41
typedef int ElemType;
typedef struct
{
ElemType *set;
int len;
int MaxSize;
}SetSq;
/* 1.集合初始化*/
void InitSet(SetSq& S)
{
S.set=NULL;
S.len=S.MaxSize=0;
}
void InitSet(SetSq& S,int ms)/* 重载初始化函数*/
{
if (ms<=0)
{
cout<<"ms值非法"<<endl;exit(1);
}
S.MaxSize=ms;
S.set=new ElemType[ms];
if (S.set==NULL)
{
cout<<"内存分配失败"<<endl; exit(1);
}
S.len=0;
}
/* 2.向集合中插入元素 */
bool InsertSet(SetSq& S,ElemType item)
{
int i;
for (i=0;i<S.len;i++)
{
if (S.set[i]==item)
{
return false;
}
}
/* 如果集合满了,则该重新分配空间,把原来集合中的数据拷贝到新的数组中去,再把指向集合首地址的指针指向新的数组 */
if (S.len==S.MaxSize)
{
ElemType *p=new ElemType[2*S.MaxSize+1];
if (p==NULL)
{
cout<<"内存分配失败"<<endl;exit(1);
}
for (i=0;i<S.len;i++)
{
p[i]=S.set[i];
}
delete []S.set;
S.set=p;
S.MaxSize=2*S.MaxSize+1;
}
S.set[i+1]=item;
S.len++;
return true;
}
/* 3.从集合中删除一个元素 */
bool DeleteSet(SetSq& S,ElemType item)
{
int i;
for (i=0;i<S.len;i++)
{
if (S.set[i]==item)
{
break;
}
}
if(i!=S.len)
{
S.set[i]=S.set[S.len-1];/*如果被删的元素是集合中最后一个,就是把集合最后一个赋值还是给最后一个,然后舍弃,如果删除的是其他位置的,就是把最后一个赋值到被删除的位置,然后删除最后一个,原理一样*/
S.len--;
return true;
}
else return false;
}
/* 4.从集合中查找一个元素*/
bool FindSet(SetSq& S,ElemType& item)
{
int i;
for(i=0;i<S.len;i++)
{
if (item==S.set[i])
{
break;
}
}
if (i<S.len)
{
item=S.set[i];
return true;
}
else return false;
}
/* 5.修改集合中的一个元素值*/
bool ModifySet(SetSq& S,const ElemType& item)/*使用const表明item是不能改变的*/
{
int i;
for (i=0;i<S.len;i++)
{
if (S.set[i]==item)
{
break;
}
}
if (i<S.len)
{
S.set[i]=item;
return true;
}
else return false;
}
/* 6.判断一个元素是否属于集合*/
bool InSet(SetSq& S,ElemType item)
{
int i;
for (i=0;i<S.len;i++)
{
if (item==S.set[i]) return true;
}
return false;
}
/* 7.判断集合是否为空*/
bool EmptySet(SetSq& S)
{
return S.len==0;
}
/* 8.求出集合中元素的个数*/
int LenthSet(SetSq& S)
{
return S.len;
}
/* 9.输出集合中的所有元素*/
void OutputSet(SetSq& S)
{
int i;
for (i=0;i<S.len;i++)
{
cout<<S.set[i]<<' ';
}
cout<<endl;
}
/* 10.求两个集合的并集*/
/*先开辟一个新的集合空间,然后用第一个集合去初始化 并借助之前写的集合初始化函数和插入函数*/
SetSq UnionSet(SetSq& S1,SetSq& S2)/*由于返回还是一个集合,所以函数返回值为集合类型*/
{
SetSq S;
int i;
InitSet(S,S1.len);
for (i=0;i<S1.len;i++)
{
S.set[i]=S1.set[i];
}
S.len=S1.len;
for (i=0;i<S2.len;i++)
{
InsertSet(S,S2.set[i]);
}
return S;
}
/* 11.求两个集合的交集*/
SetSq InterseSet(SetSq& S1,SetSq& S2)
{
SetSq S;
int len;
if(S1.len<S2.len)len=S1.len;
else len=S2.len;
InitSet(S,len);
for (int i=0;i<S2.len;i++)
{
bool b=FindSet(S1,S2.set[i]);
if (b)
{
S.set[i]=S2.set[i];
len++;/*之前初始化集合S时,len的值会重新被置为0*/
}
}
return S;
}
/* 12.按元素的值或关键字对集合排序 这里使用简单插入排序方法*/
void SortSet(SetSq& S)
{
int i;
for (i=0;i<S.len;i++)
{
int temp=S.set[i];
int j;
for (j=i-1;j>=0;j--)
{
if (temp<S.set[j])
{
S.set[j+1]=S.set[j];
}
else break;
}
S.set[j+1]=temp;
}
}
/* 13. 清除集合中的所有元素*/
void ClearSet(SetSq& S)
{
if (S.set!=NULL)
{
delete []S.set;//释放内存空间
S.set=NULL;//收回指针,避免野指针出现
S.len=S.MaxSize=0;
}
}
- 集合的顺序存储及操作实现
- 队列顺序存储的实现及操作
- 集合的链式存储及操作实现
- 集合顺序存储结构的实现和操作
- 集合----顺序存储的实现
- 【线性表】顺序存储、链式存储的实现及操作
- 线性表的顺序存储及操作实现
- 线性表的顺序存储及操作实现
- 栈的顺序存储结构操作及实现
- 用数组实现顺序存储二叉树及操作的实现
- 栈的顺序存储结构及实现
- 栈的顺序存储及实现
- 线性表的顺序存储实现及相关操作 C语言版
- 线性表的顺序存储实现及相关操作 C语言版
- 数据结构-线性表的顺序存储实现及各种操作代码
- 栈的顺序存储及链式存储的分别实现
- 顺序表的建立,实现及操作
- 栈的顺序存储结构和操作实现 数组实现
- 第九周(1)
- php简单登录注册处理
- TCP/IP协议(Socket)做服务器,HTTP协议做客户端
- 第9周-任务3-分数类中运算符重载
- 黑马程序员_SQL Server学习第一季
- 集合的顺序存储及操作实现
- Linux中断(interrupt)子系统之二:arch相关的硬件封装层
- JavaScript笔记之处理事件
- awk基础
- 简单的委托示例
- java环境变量配置
- 解决apt-get update 告警提示
- 第9周-任务4-二维数组类
- 蜗牛在奔跑