C++与树

cuiran
博客专家认证
2009-05-05 03:57:39
在数据库中有这样一张表
table_A
id name
1 aa
2 bb
3 cc
4 dd
5 ee
6 ff
7 gg
...
table_B(id1表示table_A的id id2表示id1的上一级部门的id,id2=0表示是根)
id1 id2
1 0
2 1
3 2
4 1
5 2
6 1
7 6


怎么用C++程序来把数据库里面的值这样显示:
1
2
3
5
4
6
7

谢谢!
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianya0609 2009-05-06
  • 打赏
  • 举报
回复
mark
ououo 2009-05-06
  • 打赏
  • 举报
回复
4楼排版的确有问题
看看我这个,代码即丑又笨.

#include <map>
#include <vector>
using namespace std;

struct Department
{
int id;
char name[32];
bool show;
Department *sub; // 子部门
Department *next; // 同级部门
Department()
{
id = 0;
memset(&name, 0, 32);
sub = NULL;
next = NULL;
show = false;
}
void addSub(Department *dt)
{
if(!sub)
sub = dt;
else
{
Department *next = sub;
while(1)
{
if(next->next == NULL)
{
next->next = dt;
break ;
}
else
next = sub->next;
}
}
}
void out(int space)
{
if(show)
return ;

for(int i = 0; i < space; i++)
printf("-");
printf("%s", name);
show = true;

if(sub)
{
printf("\r\n");
sub->out(space + 1);
}
Department *n = next;
while(n)
{
printf("\r\n");
for(int i = 0; i < space; i++)
printf("-");
printf("%s", n->name);
n->show = true;
if(n->sub)
{
printf("\r\n");
n->sub->out(space + 1);
}
n = n->next;
}
}
};

struct Level
{
int id1;
int id2;
Level()
{
id1 = 0;
id2 = 0;
}
};

typedef std::map<int, Department*> mapDepartment;
typedef mapDepartment::iterator mapDepartmentIter;
typedef std::vector<Level> listLevel;
typedef listLevel::iterator listLevelIter;

mapDepartment gDepartmens;
listLevel gLevel;

void addDepartment(int id, char *name)
{
Department *dt = new Department();
dt->id = id;
strcpy_s(dt->name, 32, name);
gDepartmens[dt->id] = dt;
}

void addLevel(int id1, int id2)
{
Level ll;
ll.id1 = id1;
ll.id2 = id2;
gLevel.push_back(ll);
}

void init()
{
addDepartment(1, "aa");
addDepartment(2, "bb");
addDepartment(3, "cc");
addDepartment(4, "dd");
addDepartment(5, "ee");
addDepartment(6, "ff");
addDepartment(7, "gg");
addLevel(1, 0);
addLevel(2, 1);
addLevel(3, 2);
addLevel(4, 1);
addLevel(5, 6);
addLevel(6, 1);
addLevel(7, 6);
}

void release()
{
mapDepartmentIter iter = gDepartmens.begin();
for(; iter != gDepartmens.end(); iter++)
{
delete iter->second;
}
gDepartmens.clear();
gLevel.clear();
}

void out()
{
// 预处理上下级关系
mapDepartmentIter iter1;
mapDepartmentIter iter2;
listLevelIter iter = gLevel.begin();
for(; iter != gLevel.end(); iter++)
{
iter1 = gDepartmens.find(iter->id1);
iter2 = gDepartmens.find(iter->id2);
if(iter1 != gDepartmens.end() && iter2 != gDepartmens.end())
iter2->second->addSub(iter1->second);
}

// 格式化输出
mapDepartmentIter iterOut = gDepartmens.begin();
for(; iterOut != gDepartmens.end(); iterOut++)
{
iterOut->second->out(0);
}

printf("\r\n");
}

int main()
{
init();
out();
release();
return 0;
}
cuiran 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qqwx_1986 的回复:]
C/C++ code
用map写了一个,丑了点

#include<map>
#include<string>
#include<iostream>
using namespace std;
void find(map<int,int>& mp,int value,int printValue)
{
map<int,int>::iterator iter=mp.find (value);
if(iter == mp.end ())
return;
if(iter->second !=0)
{
cout<<"\t";
find(mp,iter->second ,printValue);
}
else
{
cout<…
[/Quote]

这样写打印是没问题。如果用Tree来显示就问题了
qqwx_1986 2009-05-05
  • 打赏
  • 举报
回复

用map写了一个,丑了点

#include<map>
#include<string>
#include<iostream>
using namespace std;
void find(map<int,int>& mp,int value,int printValue)
{
map<int,int>::iterator iter=mp.find (value);
if(iter == mp.end ())
return;
if(iter->second !=0)
{
cout<<"\t";
find(mp,iter->second ,printValue);
}
else
{
cout<<printValue <<endl;
return;
}
}
void print(map<int,int>& mp)
{
map<int,int>::iterator iter=mp.begin ();
for(;iter!=mp.end ();++iter)
{
find(mp,iter->first,iter->first );
}
}
int main(void)
{
map<int,int> mp;
mp.insert(make_pair<int,int>(1,0));
mp.insert(make_pair<int,int>(2,1));
mp.insert(make_pair<int,int>(3,2));
mp.insert(make_pair<int,int>(4,1));
mp.insert(make_pair<int,int>(5,2));
mp.insert(make_pair<int,int>(6,1));
mp.insert(make_pair<int,int>(7,6));
mp.insert(make_pair<int,int>(8,7));
mp.insert(make_pair<int,int>(9,8));
mp.insert(make_pair<int,int>(10,11));
mp.insert(make_pair<int,int>(11,9));
mp.insert(make_pair<int,int>(12,11));
mp.insert(make_pair<int,int>(13,12));

print(mp);
system("pause");
return 0;
}
operatingtuzi 2009-05-05
  • 打赏
  • 举报
回复
没看明白。。帮顶了
liliangbao 2009-05-05
  • 打赏
  • 举报
回复
帮顶 ~
Paradin 2009-05-05
  • 打赏
  • 举报
回复
前几天有个推荐的帖子:
http://topic.csdn.net/u/20090503/18/6f5225c2-89b7-4285-b8ee-6bf159ead4fb.html

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧