实现对象管理器功能,其中管理的对象有3个外部关键字,要求实现:
增加对象;
删除对象;
判断对象是否存在;
说明: 对象的三个外部关键字分别以KEY1,KEY2,KEY3表示。
方法1:链表的方式
#include "ObjMgt.h"
#include <iostream>
using namespace std;
typedef struct Node
{
unsigned int ky1;
unsigned int ky2;
unsigned int ky3;
struct Node * next;
}NNode,*pNode;
unsigned int cnt = 0;
pNode head = NULL;
/*************************************************************************
功能:增加单个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字KEY2
key3 外部关键字KEY3
输出:无
返回:
-1 :失败(对象已经存在或者其它异常)
0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
if(IsObjectExist(key1,key2,key3) || (cnt >= 10000))
return -1;
pNode p1 = (pNode)malloc(sizeof(NNode));
if(NULL == p1)
exit(-1);
p1->ky1 = key1;
p1->ky2 = key2;
p1->ky3 = key3;
p1->next = NULL;
if(NULL == head)
{
head = p1;
cnt = 1;
}
else
{
pNode p2 = head;
while(p2->next != NULL)
p2 = p2->next;
p2->next = p1;
++cnt;
}
return 0;
}
/********************************************************************************
功能:删除一个或多个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:无
说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值;
举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
if(NULL == head)
{
cnt = 0;
return;
}
pNode p2 = head;
/*while((p2 != NULL) && ((p2->ky1 == key1) || (p2->ky1 == 0xFFFFFFFF)) && ((p2->ky2 == key2) || (p2->ky2 == 0xFFFFFFFF)) && ((p2->ky3 == key3) || (p2->ky3 == 0xFFFFFFFF)))*/
//while((p2 != NULL) && (p2->ky1 == key1 || p2->ky1 == 0xFFFFFFFF) && (p2->ky2 == key2 || p2->ky2 == 0xFFFFFFFF) && (p2->ky3 == key3 || p2->ky3 == 0xFFFFFFFF))
while((p2 != NULL) && ((p2->ky1 == key1) || (key1 == 0xFFFFFFFF)) && ((p2->ky2 == key2) || (key2 == 0xFFFFFFFF)) && ((p2->ky3 == key3) || (key3 == 0xFFFFFFFF)))
{ //通配符表示的是key1,而不是让某个节点的值为通配符
--cnt;
head = head->next;
free(p2);
p2 = head;
}
if(NULL == head)
{
cnt = 0;
return;
}
pNode p1 = head;
p2 = p1->next;
while(p2 != NULL)
{
//if((p2->ky1 == key1 || p2->ky1 == 0xFFFFFFFF) && (p2->ky2 == key2 || p2->ky2 == 0xFFFFFFFF) && (p2->ky3 == key3 || p2->ky3 == 0xFFFFFFFF))
if(((p2->ky1 == key1) || (key1 == 0xFFFFFFFF)) && ((p2->ky2 == key2) || (key2 == 0xFFFFFFFF)) && ((p2->ky3 == key3) || (key3 == 0xFFFFFFFF)))
{
p1->next = p2->next;
free(p2);
--cnt;
p2 = p1->next;
}
else
{
p2 = p2->next;
p1 = p1->next;
}
}
return ;
}
/********************************************************************************
功能:查询单个对象是否存在
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:
0:不存在
1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
if(NULL == head)
return 0;
pNode p2 = head;
while(p2 != NULL)
{
//if((p2->ky1 == key1 || p2->ky1 == 0xFFFFFFFF) && (p2->ky2 == key2 || p2->ky2 == 0xFFFFFFFF) && (p2->ky3 == key3 || p2->ky3 == 0xFFFFFFFF))
if((p2->ky1 == key1) && (p2->ky2 == key2) && (p2->ky3 == key3))
{
return 1;
}
else
p2 = p2->next;
}
return 0;
//while(p2->next != NULL)
//{
// if(p2->ky1 == key1)
// if(p2->ky2 == key2)
// if(p2->ky3 == key3)
// return 1;
// p2 = p2->next;
//}
//if(p2->ky1 == key1)
// if(p2->ky2 == key2)
// if(p2->ky3 == key3)
// return 1;
// return 0;
}
/******************************************************************************************************
Description 清空所有对象
Prototype void Clear();
Input Param 无
Output Param 无
Return Value 无
********************************************************************************************************/
void Clear(void)
{
/*在这里实现功能*/
pNode p1 = head;
while(p1 != NULL)
{
head = head->next;
free(p1);
p1 = head;
}
head = NULL;
p1 = NULL;
cnt = 0;
return;
}
方法2:map映射和vector结合
#include "ObjMgt.h"
#include <iostream>
#include <map>
#include <vector>
using namespace std;
map<long long,bool> ObjMa;
/*************************************************************************
功能:增加单个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字KEY2
key3 外部关键字KEY3
输出:无
返回:
-1 :失败(对象已经存在或者其它异常)
0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
long long Lkey1 = (long long)key1;
long long Lkey2 = (long long)key2;
long long Lkey3 = (long long)key3;
Lkey1 <<= 32;
Lkey2 <<= 16;
long long key = Lkey1 + Lkey2 + Lkey3;
if(!ObjMa.count(key))
ObjMa[key] = true;
else
return -1;
return 0;
}
/********************************************************************************
功能:删除一个或多个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:无
说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值;
举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
map<long long,bool>::iterator it;
unsigned int myky1,myky2,myky3;
vector<long long> keyRrase;
for(it = ObjMa.begin();it != ObjMa.end();++it)
{
long long ky = (*it).first;
myky1 = (ky & 0xFFFF00000000)>>32;
myky2 = (ky & 0xFFFF0000)>>16;
myky3 = ky & 0xFFFF;
if((0xFFFFFFFF == key1 || myky1 == key1) &&
(0xFFFFFFFF == key2 || myky2 == key2) &&
(0xFFFFFFFF == key3 || myky3 == key3))
{
keyRrase.push_back(ky);
}
}
for(unsigned int i = 0;i < keyRrase.size();++i)
ObjMa.erase(keyRrase[i]);
return ;
}
/********************************************************************************
功能:查询单个对象是否存在
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:
0:不存在
1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
long long Lkey1 = (long long)key1;
long long Lkey2 = (long long)key2;
long long Lkey3 = (long long)key3;
Lkey1 <<= 32;
Lkey2 <<= 16;
long long key = Lkey1 + Lkey2 + Lkey3;
if(ObjMa.count(key))
return 1;
return 0;
}
/******************************************************************************************************
Description 清空所有对象
Prototype void Clear();
Input Param 无
Output Param 无
Return Value 无
********************************************************************************************************/
void Clear(void)
{
/*在这里实现功能*/
ObjMa.clear();
return;
}
方法3:vector向量使用,注意struct的定义方式,这种定义里面有构造函数,可以直接赋值
#include "ObjMgt.h"
#include <vector>
using namespace std;
struct Object
{
unsigned int key1;
unsigned int key2;
unsigned int key3;
Object(unsigned int a,unsigned int b,unsigned int c)
{
key1 = a;
key2 = b;
key3 = c;
}
Object(){}
};
vector<Object> container;
/*************************************************************************
功能:增加单个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字KEY2
key3 外部关键字KEY3
输出:无
返回:
-1 :失败(对象已经存在或者其它异常)
0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
int isExist = IsObjectExist(key1,key2,key3);
if(isExist)
{
return -1;
}
Object o(key1,key2,key3);
container.push_back(o);
return 0;
}
/********************************************************************************
功能:删除一个或多个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:无
说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值;
举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
Object o;
vector<Object>::iterator ite = container.begin();
while(ite != container.end())
{
o = *ite;
if((o.key1 == key1 || key1 == 0xFFFFFFFF) && (o.key2 == key2 || key2 == 0xFFFFFFFF) && (o.key3 == key3 || key3 == 0xFFFFFFFF))
ite = container.erase(ite);
else
++ite;
}
return ;
}
/********************************************************************************
功能:查询单个对象是否存在
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:
0:不存在
1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
int size = container.size();
Object o;
for(int i = 0;i < size;++i)
{
o = container[i];
if(o.key1 == key1 && o.key2 == key2 && o.key3 == key3)
return 1;
}
return 0;
}
/******************************************************************************************************
Description 清空所有对象
Prototype void Clear();
Input Param 无
Output Param 无
Return Value 无
********************************************************************************************************/
void Clear(void)
{
/*在这里实现功能*/
container.clear();
return;
}
一般的struct的定义方式
#include "ObjMgt.h"
#include <vector>
using namespace std;
typedef struct{
unsigned int key1;
unsigned int key2;
unsigned int key3;
}KEY;
vector <KEY> allKey;
/*************************************************************************
功能:增加单个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字KEY2
key3 外部关键字KEY3
输出:无
返回:
-1 :失败(对象已经存在或者其它异常)
0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
if(allKey.size() > 10000)
return -1;
if(key1 > 65535 || key2 > 65535 || key3 > 65535)
return -1;
int i,j = allKey.size();
for(i = 0;i < j;i++)
if(allKey[i].key1 == key1 && allKey[i].key2 == key2 && allKey[i].key3 == key3)
return -1;
KEY k = {key1,key2,key3};
allKey.push_back(k);
return 0;
}
/********************************************************************************
功能:删除一个或多个对象
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:无
说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值;
举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
/*bool allKey1,allKey2,allKey3;*/
//int i,j = allKey.size();
vector<KEY>::iterator it;
it = allKey.begin();
while(it != allKey.end())
{
if(0xFFFFFFFF == key1 || it->key1 == key1)
if(0xFFFFFFFF == key2 || it->key2 == key2)
if(0xFFFFFFFF == key3 || it->key3 == key3)
{
it = allKey.erase(it);
continue;
}
it++;
}
return ;
}
/********************************************************************************
功能:查询单个对象是否存在
输入:
key1 外部关键字 KEY1
key2 外部关键字 KEY2
key3 外部关键字 KEY3
输出:无
返回:
0:不存在
1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
/*请实现*/
if(key1 > 65535 || key2 > 65535 || key3 > 65535)
return 0;
int i,j = allKey.size();
for(i = 0;i < j;++i)
if(allKey[i].key1 == key1 && allKey[i].key2 == key2 && allKey[i].key3 == key3)
return 1;
return 0;
}
/******************************************************************************************************
Description 清空所有对象
Prototype void Clear();
Input Param 无
Output Param 无
Return Value 无
********************************************************************************************************/
void Clear(void)
{
/*在这里实现功能*/
allKey.clear();
return;
}