设某容器中存储着一系列表达指向关系的节点,其中:fid
代表出发节点,tid
代表到达节点,指向表达为fid->tid
。
struct Node {
uint32_t fid;
uint32_t tid;
...
};
说明1
- fid/tid 并非 用于表示节点序号
于是,这一容器可以用来存储多个节点所构成的复杂指向信息。针对这一容器,有以下 4 项约束条件:
Rule1
节点禁止保存自指向关系,即fid
与tid
不能 相同;Rule2
容器 禁止保存重复 指向关系节点;Rule3
容器中指向关系节点所构成的指向信息 禁止闭合成环 ;Rule4
容器中指向关系节点所构成的指向信息 允许扇出 ,禁止扇入 。
说明2
- 若已有3个指向关系节点
1->2
,2->3
,3->4
存在于容器中时,则不允许新节点4->1
加入容器,否则将出现闭合环;- 扇出指“一指多”,扇入指“多指一”,即容器可以保存
1->2
,1->3
,但不允许保存1->3
,2->3
。
请在 60分钟 内挑选C
或者C++
实现所要求的的函数/方法。请注意:
- 不允许更改已给出的任何结构定义、函数声明等内容;
- 仅允许使用
stdc
或stl
,禁止使用任何其他第三方库; - 允许添加必要的子函数;
- 在线作答必须完成
C
版本 ,有余力者尽量完成C++
版本; - 在线作答 请勿folk,请克隆本地上传,或其他方式发送。
完成insert_node
与remove_node
2 个函数。
struct Node {
uint32_t fid;
uint32_t tid;
struct Node* prev;
struct Node* next;
};
/**
* @brief insert a node into list
*
* there are 4 strains for the container :
*
* 1) `fid` and `tid` **CANNOT** be the same
* 2) it should **NOT** hold duplicated node
* 3) it should **NOT** hold circled link
* 4) fan-out is allowed while fan-in is **NOT**.
*
* @param head The head
* @param[in] fid The fid
* @param[in] tid The tid
*
* @return new head
*/
struct Node* insert_node(struct Node* head, uint32_t fid, uint32_t tid);
/**
* @brief remove a node from list
*
* @param head The head
* @param[in] fid The fid
* @param[in] tid The tid
*
* @return new head
*/
struct Node* remove_node(struct Node* head, uint32_t fid, uint32_t tid);
完成insert
与sort
2 个函数。
struct Node{
std::string fid;
std::string tid;
};
/**
* @brief insert a new pair into the list
*
* there are 4 strains for the container :
*
* 1) `fid` and `tid` **CANNOT** be the same
* 2) it should **NOT** hold duplicated node
* 3) it should **NOT** hold circled link
* 4) fan-out is allowed while fan-in is **NOT**.
*
* @param nodes The nodes
* @param[in] fid The fid
* @param[in] tid The tid
*
* @return success with true returned
*/
bool insert(
std::vector<Node>& nodes, const std::string& fid, const std::string& tid);
/**
* @brief sort nodes
*
* @param nodes The nodes
* @param[in] accend The accend
*/
void sort(std::vector<Node>& nodes, bool accend);