- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个简单的测试程序,如下(省略了错误检查)。
我的 Tree_Find() 和 Node_Find() 函数似乎工作正常,但我想知道是否有更有效的方法来实现相同的目标。
Node.h
typedef struct _Node Node;
Node* Node_Create(int nTag);
void Node_Destroy(Node **ppNode);
void Node_Append(Node **ppParent, Node *pChild);
Node* Node_Find(Node *pNode, int nTag);
树.h
#include "Node.h"
typedef struct _Tree Tree;
Tree* Tree_Create(void);
void Tree_Destroy(Tree **ppTree);
void Tree_Init(Tree *pTree);
Node* Tree_Find(Tree *pTree, int nTag);
Node.c
#include "Node.h"
struct _Node
{
int nTag;
struct _Node *pFirstChild;
struct _Node *pNextSibling;
};
Node* Node_Create(int nTag)
{
Node *pNode = malloc(sizeof(*pNode));
pNode->nTag = nTag;
pNode->pFirstChild = NULL;
pNode->pNextSibling = NULL;
return pNode;
}
void Node_Destroy(Node **ppNode)
{
Node *pNode = NULL;
if (!ppNode)
return;
if ((pNode = *ppNode) == NULL)
return;
Node_Destroy(&(pNode->pFirstChild));
Node_Destroy(&(pNode->pNextSibling));
free(pNode);
*ppNode = NULL;
}
void Node_Append(Node **ppParent, Node *pChild)
{
Node *pLastChild = NULL;
if (!(*ppParent))
return;
if (!((*ppParent)->pFirstChild))
{
(*ppParent)->pFirstChild = pChild;
return;
}
pLastChild = (*ppParent)->pFirstChild;
while (pLastChild->pNextSibling)
pLastChild = pLastChild->pNextSibling;
pLastChild->pNextSibling = pChild;
}
Node* Node_Find(Node *pNode, int nTag)
{
Node *pNodeFound = NULL;
if (!pNode)
return NULL;
if (pNode->nTag == nTag)
return pNode;
if ((pNodeFound = Node_Find(pNode->pFirstChild, nTag)) == NULL)
pNodeFound = Node_Find(pNode->pNextSibling, nTag);
return pNodeFound;
}
树.c
#include "Tree.h"
struct _Tree
{
Node *pRoot;
};
Tree* Tree_Create(void)
{
Tree *pTree = malloc(sizeof(*pTree));
pTree->pRoot = NULL;
return pTree;
}
void Tree_Destroy(Tree **ppTree)
{
Tree *pTree = NULL;
if (!ppTree)
return;
if ((pTree = *ppTree) == NULL)
return;
Node_Destroy(&(pTree->pRoot));
free(pTree);
*ppTree = NULL;
}
void Tree_Init(Tree *pTree)
{
Node *p1 = Node_Create(1);
Node *p2 = Node_Create(2);
Node *p3 = Node_Create(3);
Node *p4 = Node_Create(4);
Node *p5 = Node_Create(5);
Node_Append(&p1, p2);
Node_Append(&p1, p3);
Node_Append(&p3, p4);
Node_Append(&p3, p5);
pTree->pRoot = p1;
}
Node* Tree_Find(Tree *pTree, int nTag)
{
if (!pTree)
return NULL;
return Node_Find(pTree->pRoot, nTag);
}
main.c
#include "Tree.h"
int main(void)
{
Node *pNodeToFind = NULL;
Tree *pTree = Tree_Create();
Tree_Init(pTree);
pNodeToFind = Tree_Find(pTree, 1);
pNodeToFind = Tree_Find(pTree, 2);
pNodeToFind = Tree_Find(pTree, 3);
pNodeToFind = Tree_Find(pTree, 4);
pNodeToFind = Tree_Find(pTree, 5);
pNodeToFind = Tree_Find(pTree, 6); // Not found!
Tree_Destroy(&pTree);
return 0;
}
最佳答案
如果您的目标是构建和搜索键上没有顺序的任意树,那么您已经完成了几乎所有您能做的事情,除了一件事:您的追加方法将有 O(n^2) 运行时间,其中 n 是单个节点可能拥有的子节点数量。如果维护的是队列而不是列表,则可以在单位时间内追加。有一个很好的技巧可以实现队列中只有一个头指针而不是单独的头指针和尾指针。使子列表成为循环列表,并使父列表指向循环列表的尾部。那么parent->children是尾元素,parent->children->sibling是头元素。通过此设置,您可以插入子列表的尾部,也可以从子列表的头部插入和弹出。这些操作的代码可以非常优雅,并且您的追加时间将是恒定的。
或者,您可以将子项存储在自动调整大小的数组中。存在轻微的存储损失(您需要存储每个节点的指针和子节点计数),但在某些情况下对子节点的随机访问可能很方便。
关于c - ANSI C - 在任意树中查找节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333934/
我正在寻找一个控制代码来使用 ANSI 或其他一些标准在终端中创建橙色文本,这可能吗?我只看到黄色和红色可用,我认为您不能将红色和黄色混合用于同一个角色:) 最佳答案 严格来说,不:ANSI 从未标准
我知道 \33[nC移动光标 n列向前;问题是,我不知道特定行包含多少个字符。 最佳答案 什么都没有显式 ,但是屏幕“小”,您可以使用任何光标移动命令移动到任意远的目的地,终端将通过屏幕大小限制移动。
这个问题在这里已经有了答案: Oracle Joins - Comparison between conventional syntax VS ANSI Syntax (11 个回答) 8 年前关闭。
我知道在 bash 终端中,一种可靠的变色方法是使用 ANSI 转义序列。例如: echo -e "\033[0;31mbrown text\033[0;00m" 应该输出 brown text (i
上次我检查时,说您正在使用 ANSI C 编码等同于说“这是符合 C99 的代码,其中没有任何其他内容”。现在有了 C11 和 C++11,这种区别还存在吗?它还有某种意义吗? 最佳答案 历史上,“A
我的业务逻辑包含在大约 7000 行 T-SQL 存储过程中,其中大多数都具有下一个 JOIN 语法: SELECT A.A, B.B, C.C FROM aaa AS A, bbb AS B, cc
我的业务逻辑包含在大约 7000 行 T-SQL 存储过程中,其中大多数都具有下一个 JOIN 语法: SELECT A.A, B.B, C.C FROM aaa AS A, bbb AS B, cc
我正在使用 CentOS 7 和 PHP 7.0 TERM=xterm-256color 我确实有一个彩色提示和 ls 颜色,如果我通过 --ansi然后它确实显示为彩色,但我不想总是添加 --ans
在我工作过的每家公司,我发现人们仍然按照 ANSI-89 标准编写 SQL 查询: select a.id, b.id, b.address_1 from person a, address b wh
我正在使用 Delphi RIO 10.3.3。 当我将 Ansi 字符串作为 const 数组的元素之一传递时,string() 转换对其不起作用。为了让它工作,我必须先将 VAnsiString
我正在使用 Delphi RIO 10.3.3。 当我将 Ansi 字符串作为 const 数组的元素之一传递时,string() 转换对其不起作用。为了让它工作,我必须先将 VAnsiString
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
当我在终端上调整大小时,它保持全屏显示。我想,有某种方法可以找出终端的屏幕尺寸。我怎样才能在 VT100 中做到这一点? 使用 ,当我列出文件夹时,它以蓝色显示文件夹。 (或者让我们说不同的颜色)但是
我的程序正在向某个日志文件发送characters-colored文本: echo -e "\\033[38;5;2m-->\\033[0m Starting program." | tee $Log
我刚开始使用 gsoap。我只使用 c++ 取得了 4 个小成功,但是我当前的项目限制了我设置源代码生成选项来创建纯 ANSI C(不是 c++)。我似乎无法成功调用该服务,错误返回为 0xC0000
来自 http://blocktronics.org/ 的 ANSI 文件似乎使用的是另一种 ANSI 编码,而不是我的 VT100 终端仿真器支持的编码。 如果我使用 tetraview 查看这些文
如何在 Java 中将十六进制字符串转换为 ansi(窗口 1252)以及将 ansi(窗口 1252)转换为十六进制字符串。 python(完美运行) q = "hex string value"
我用 java 编写了一个 android 应用程序来获取用户答案并将它们保存在一个文件中。问题是这个文件是以 utf-8 格式保存的。最终用户将在 IBM SPSS 中打开这些文件,这是一种适用于
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 锁定。这个问题及其答案
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicates: Floating point inaccuracy examples Is JavaScript's Ma
我是一名优秀的程序员,十分优秀!