POJ 数据结构的动态管理

之前看了POJ的编程题目,大致讲的是模拟公司管理入职、离职管理的组织管理,收藏了一位提交者的answer:
#include <cstdio>
#include <cstring>

const int MAXN = 1010;
//2003

//自己封装体中含有度,作为里面的成分
struct node
{
	int son[MAXN];          //用链表比较合适
	int len;
	int id;                //同样的孩子是有等级的标识
	int parent;
} p[MAXN * 5];

char name[MAXN][25];


//如果说题目中换了一种按等级打印如何实现
void print(int x, int dep)
{
	for (int i = 0; i<dep; ++i)
		printf("+");
	printf("%s\n", name[x]);
	for (int i = 0; i<p[x].len; ++i)
	{
		print(p[x].son[i], dep + 1);  
	}
}

void del(int x)
{
	//从顶向下,依次循环进行,下面的处理后再返回到上面来
	if (p[x].len != 0)
		del(p[x].son[0]);
	int px = p[x].parent;
	for (int i = 1; i<p[px].len; ++i)
	{
		p[p[px].son[i]].parent = x;           //设置同级别孩子的父亲
		p[p[px].son[i]].id = p[x].len;        //对ID进行了重新赋值
		p[x].son[p[x].len++] = p[px].son[i];  //设置父亲的孩子
	}
	p[px].len = 1;
}

int main()
{
    freopen("input.txt","r",stdin);
	int size = 1, tem, root;
	char str[25];
	scanf("%s", name[0]);
	p[0].parent = -1;
	p[0].id = -1;
	p[0].len = 0;
	root = 0;
	while (scanf("%s", str) != EOF)   //相当于按照行来读取
	{
		if (strcmp(str, "print") == 0)
		{
			print(root, 0);
			printf("------------------------------------------------------------\n");
		}
		else if (strcmp(str, "fire") == 0)
		{
			scanf("%s", str);
			for (int i = 0; i<size; ++i)
			{
				if (strcmp(name[i], str) == 0)
				{
					tem = i;
					break;
				}
			}
			if (tem == root)
			{
				if (p[root].len>0)
				{
					del(p[tem].son[0]);
					//p[p[tem].son[0]].parent = p[tem].parent; ///-1也是可以的
					p[p[tem].son[0]].parent = -1;
					root = p[tem].son[0];
				}//如果只有一个人的话,就不进行删除,确保组织中最少有一人
			}
			else
			{
				if (p[tem].len == 0)
				{
					int px = p[tem].parent;
					for (int i = p[tem].id; i<p[px].len - 1; ++i)
					{//等级层级发生了改变,进行了相应的移动
						p[p[px].son[i + 1]].id--;
						p[px].son[i] = p[px].son[i + 1];
					}
					p[px].len--;   //处理了相应的子
				}
				else
				{
					del(p[tem].son[0]);
					p[p[tem].son[0]].parent = p[tem].parent;  //改变孩子的父亲
					p[p[tem].son[0]].id = p[tem].id;         //继承了等级
					p[p[tem].parent].son[p[tem].id] = p[tem].son[0];//改变了父亲的孩子
				}
			}
		}
		else
		{
			for (int i = 0; i<size; ++i)
			{
				if (strcmp(str, name[i]) == 0)
				{
					tem = i;
					break;
				}
			}
			scanf("%s", str);
			scanf("%s", name[size]);
			p[tem].son[p[tem].len++] = size;
			p[size].len = 0;
			p[size].id = p[tem].len - 1;             
			p[size++].parent = tem;
		}
	}
	return 0;
}

其中input.txt内容如下:

VonNeumann
VonNeumann hires Tanenbaum
VonNeumann hires Dijkstra
Tanenbaum hires Stallings
Tanenbaum hires Silberschatz
Stallings hires Knuth
Stallings hires Hamming
Stallings hires Huffman
print
VonNeumann hires Shannon
fire Tanenbaum
print
fire Silberschatz
fire VonNeumann
print

与此相对应的有一道管理文件机构的题目,也收集了一份做对比:

#include<iostream>
#include<string>
#include<list>
using namespace std;

string  str;
void fun(int deepth,string directory)
{

	for (int i = 0; i < deepth; i++)cout << "|     ";
	cout << directory << endl;
	list<string>fileList;                          //管理每层的文件列表
	while (str != "]"&&str != "*")
	{
		if (str[0] == 'f')fileList.push_back(str);
		else directory = str, cin >> str, fun(deepth + 1, directory);
		cin >> str;
	}
	fileList.sort();
	for (list<string>::iterator it = fileList.begin(); it != fileList.end(); it++)
	{
		for (int i = 0; i < deepth; i++)cout << "|     ";
		cout << *it << endl;
	}

}
int main()
{
	freopen("input.txt", "r", stdin);
	for (int t = 1; cin >> str, str != "#"; t++)
	{
		cout << "DATA SET " << t << ":" << endl;
		fun(0,"ROOT");
		cout << endl;
	}

	return 0;
}

其中输入input.txt如下:

file1
file2
dir3
dir2
file1
file2
]
]
file4
dir1
]
file3
*
file2
file1
*
#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值