| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 799 人关注过本帖
标题:[求助]两个实例像是公用内存,但实际上却不是。。。
只看楼主 加入收藏
笨笨鸟
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-5-10
收藏
 问题点数:0 回复次数:2 
[求助]两个实例像是公用内存,但实际上却不是。。。

下面这个程序,是关于集合的算法,其中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; }

搜索更多相关主题的帖子: 内存 实例 jihe int include 
2005-05-10 18:08
黑客
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2005-3-18
收藏
得分:0 
按你的程序代码,S1与S2根本没有任何关系
不管你是在cout &lt;&lt; "S2\n";输入还是在其后输入数据,都是只输到S1中
而S2是空的,当你去掉S1.UnionSet(S2);时,对程序也没有任何影响.
还有你的两个S2.OutputSet();输出的都是空的,你注意到了没有??
那这样两者的地址就一定是不同的了
在这里我有一点不明白的是,不管是输入什么,地址都是:
S1:0012FF6C
S2:0012FF60
谁能帮忙说明一下.

还有,当在查找时,若是集合中没有要找的元素那就出错了,什么提示说明也没有的.
在修改时,若修改后有两个元素相同时,你也保留了,这可不是你所期望的吧.(哈哈,当然这是小问题啦).

[此贴子已经被作者于2005-5-11 0:07:40编辑过]



教父,已成为过去;谁来续写这段传说?-----我!
2005-05-11 00:05
笨笨鸟
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-5-10
收藏
得分:0 
的确是的,S2输出是空的,程序的健壮性也很差,这是我在复习数据结构
是我马虎了, cout &lt;&lt; "S2\n";之后应该用S2.InsertSet(n),我写成S1.InsertSet(n)了,谢谢提醒!
2005-05-11 07:35
快速回复:[求助]两个实例像是公用内存,但实际上却不是。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026767 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved