下面这个程序,是关于集合的算法,其中UnionSet(jihe& S2)是合并两个集合的方法,但是运行后发现,新建的一个集合S2好像是与原来的集合S1共用一段内存--S2中输入值时,若与S1中的值相同(但是S2中并没有该值),也不插入(本来是不插入本集合中已有的值),而最后输出两个集合的地址时发现:两个集合的地址不同。但是为何没有公用内存还会出现上述情况呢?请指教! #include <iostream> #include <stdlib.h>
using namespace std; typedef int ElemType;
class jihe { public: jihe (); jihe (int ms); bool InsertSet(ElemType item); void OutputSet(); bool DeleteSet(ElemType item); bool FindSet (ElemType& item); bool ModifySet (const ElemType& item); bool UnionSet (jihe& S2);
ElemType *set; //指向该空间的指针 int len; //集合实际长度 int MaxSize; //集合最大长度 }; jihe::jihe () //初始化集合为空 { set = NULL; len = MaxSize = 0; } jihe::jihe (int ms) //重载初始化函数,ms用于初始化MaxSize,ms > 1 { if (ms < 1) { cout << "ms值必须大于1!\n"; exit(1); } MaxSize = ms; set = new ElemType[ms]; //分配空间 if (!set) { cerr << "存储空间用完\n"; exit(1); } len = 0; } bool jihe::InsertSet(ElemType item) //插入一个元素 { int i; for (i=0;i<len ;i++ ) //元素已存在,则返回false,表示不用插入 { if (set[i] == item) { return false; } } if (len == MaxSize) //空间用完的处理 { ElemType *p = new ElemType[2*MaxSize + 1]; //空间比原来增加1倍加1 if (!p) { cout << "存储空间用完\n"; exit(1); } for (i=0;i<len ;i++ ) //把原空间内容复制到新空间 { p[i] = set[i]; } delete []set; //释放原集合空间 set = p; //使S.set指向新集合空间 MaxSize = 2*MaxSize + 1; //更改集合空间长度 } set[len] = item; //在末尾插入新元素 len++; return true; } void jihe::OutputSet() //输出集合中所有元素 { for (int i=0;i<len ;i++ ) { cout << set[i] << ' '; } cout << endl; } bool jihe::DeleteSet(ElemType item) //删除一个元素 { int i; for (i=0;i<len ;i++ ) { if (set[i] == item) break; } if (i < len) { set[i] = set[len-1]; //以最后一个元素取代之 len--; return true; } else { return false; } } bool jihe::FindSet(ElemType& item) //查找元素 { int i; for (i=0;i<len ;i++ ) { if (set[i] == item) break; } if (i < len) { item = set[i]; cout << "这是第" << i << "个元素"; return true; } else { return false; } } bool jihe::ModifySet(const ElemType& item) //修改指定元素 { int i; ElemType newnum; for (i=0;i<len ;i++ ) { if (set[i] == item) break; } if (i < len) { cout << "输入新值:"; cin >> newnum; set[i] = newnum; return true; } else { return false; } } bool jihe::UnionSet(jihe& S2) //合并集合,将S2合并到S1 { for (int i=0;i<S2.len ;i++ ) { if (!InsertSet(S2.set[i])) { return false; } } return true; } int main() { int i; ElemType n; printf("集合"); jihe S1(5); jihe S2(5); for (i=0;i<5 ;i++ ) { printf("插入一个元素:"); cin >> n; if (S1.InsertSet(n)) { cout << "插入OK\n"; } } S1.OutputSet(); printf("超过5\n"); for (i=0;i<3 ;i++ ) { printf("插入一个元素:"); cin >> n; if (S1.InsertSet(n)) { cout << "插入OK\n"; } } S1.OutputSet(); cout << "删除:\n输入删除的值:"; cin >> n; S1.DeleteSet(n); S1.OutputSet(); cout << "查找:\n输入查找的值:"; cin >> n; S1.FindSet(n); cout << "修改:\n输入修改的值:"; cin >> n; S1.ModifySet(n); S1.OutputSet(); cout << "S2\n"; for (i=0;i<5 ;i++ ) { printf("插入一个元素:"); cin >> n; if (S1.InsertSet(n)) { cout << "插入OK\n"; } } S2.OutputSet(); cout << "合并"; S1.UnionSet(S2); S1.OutputSet(); S2.OutputSet(); cout << "\nS1地址:" << &S1 << "\nS2地址:" << &S2; return 0; }