哪个是用C语言实现N-ary树的巧妙实现?
特别是,我想实现一个n-ary树,而不是自我平衡,每个节点中有一个未绑定数量的子节点,其中每个节点都包含一个已定义的结构,例如:
struct task {
char command[MAX_LENGTH];
int required_time;
};
Run Code Online (Sandbox Code Playgroud) 我有一个偶尔会有分割线的文件.线条以"+"开头(可能以空格开头)这一事实表明了分裂.
line 1
line 2
+ continue 2
line 3
...
Run Code Online (Sandbox Code Playgroud)
我想加入拆分线:
line 1
line 2 continue 2
line 3
...
Run Code Online (Sandbox Code Playgroud)
使用sed.我不清楚如何加入前一行.
有什么建议吗?
当我需要一些复杂的算法时,我首先检查互联网上是否已发布任何相关内容.十分之十,我会发现有人已经找到了比我想象的更聪明的解决方案.
除了通用的Google搜索,我使用:
我还发现了J.UCS(通用计算机科学杂志)包含一些有趣的文章(但我没有真正使用过我在那里发现的任何信息).
你知道其他任何可以免费搜索和阅读好CS文章的地方吗?
有人在C中实现了Cuckoo散列吗?如果有一个开源,非GPL版本,它将是完美的!
亚当在他的评论中提到它,任何人都知道它为什么用得不多?这只是一个实施问题还是在实践中没有实现好的理论属性?
以下代码:
#include <stdio.h>
typedef union {
int n;
char *s;
} val_t;
int main(void) {
val_t v1,v2;
v1 = (val_t)"Hello World";
v2 = (val_t)10;
printf("%s %d\n", v1.s, v2.n);
return(1);
}
Run Code Online (Sandbox Code Playgroud)
使用gcc正确编译和执行.如果试图转换一个常量,而且联合中没有合适的字段,则会产生错误消息.
但是,查看(C99)标准,我无法找到描述此行为的部分.因此,我的问题:
如果联合类型的字段具有兼容类型,那么C标准是否保证我可以将常量强制转换为联合类型?
或者,换句话说:
是
((val_t)10)
一个有效的rvalue类型val_t
?
了解其他编译器(或至少MS Visual C++)是否支持此行为也很有趣.有人知道吗?
编辑:转换为联盟是一个GCC扩展,所以使用它不是一个好主意.
感谢Maurits和Neil!我没想过用-pedantic检查!
我正在寻找一个令人难忘的32位值作为常量.如果可能的话,它也应该有点滑稽.
到目前为止,我已经提出了这两个:
0xcafebabe
0xdeaddad
Run Code Online (Sandbox Code Playgroud)
你也可以推荐一些其他的吗?
谢谢.
我希望这是程序员相关的问题.我从事C#编程的业余爱好.为了我自己的目的,我需要解析html文件,最好的想法是..正则表达式.正如许多人发现的那样,学习它们非常耗时,因此我很感兴趣,如果你知道一些能够接受输入的应用程序(任何代码片段),理解我需要的东西(由我选择一块我需要"剪掉"的代码,并为它或更多选项提供正确的正则表达式.
正如我所听到的,Regex本身就是一门科学,所以它可能并不像我想象的那么容易.
我已经编写了一个库来匹配一组模式的字符串,现在我可以轻松地将词汇扫描程序嵌入到C程序中.
我知道有许多成熟的工具可用于创建词法扫描程序(lex和re2c,仅列出前两个想到的)这个问题不是关于词法分析器,而是关于"扩展"C语法的最佳方法.词法分析器示例只是一个普遍问题的具体案例.
我可以看到两种可能的解决方案
我已经做过两个但问题是:"你会根据以下标准考虑哪一个更好的做法?"
换句话说,如果你不得不维护或编写一个使用这两种方法之一的软件,那么一个人会不会让你失望?
例如,以下是针对以下问题的词法分析器:
在两种风格.
/**** SCANNER STYLE 1 (preprocessor) ****/
#include "pmx.h"
t = buffer
while (*t) {
switch pmx(t) { /* the preprocessor will handle this */
case "&q" : /* skip strings */
break;
case "&f<?=eE>&F" : /* sum numbers */
sum += atof(pmx(Start,0));
break;
case "&b()": /* skip lists */
break;
case "&iend" : /* stop processing */ …
Run Code Online (Sandbox Code Playgroud) 我用C++编写了一个简单的MIDI控制台应用程序.这是整个事情:
#include <windows.h>
#include <iostream>
#include <math.h>
using namespace std;
void CALLBACK midiInputCallback(HMIDIIN hMidiIn, UINT wMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
switch (wMsg) {
case MIM_MOREDATA:
case MIM_DATA:
cout << dwParam1 << " ";
PlaySound("jingle.wav", NULL, SND_ASYNC | SND_FILENAME);
break;
}
}
int main() {
unsigned int numDevs = midiInGetNumDevs();
cout << numDevs << " MIDI devices connected:" << endl;
MIDIINCAPS inputCapabilities;
for (unsigned int i = 0; i < numDevs; i++) {
midiInGetDevCaps(i, &inputCapabilities, sizeof(inputCapabilities));
cout << …
Run Code Online (Sandbox Code Playgroud) 像treap这样的随机二进制搜索树以高概率提供了良好的性能(按O(log n)的顺序),同时避免了像AVL,red-blackm,AA等确定性平衡树所需的复杂(和昂贵)重新平衡操作. .
我们知道,如果我们将随机密钥添加到简单的BST中,我们可以预期它是合理平衡的.一个简单的原因是n个节点的非均衡树的数量远远低于"几乎平衡的"树的数量,因此,插入密钥的随机顺序很可能以可接受的树结束.
在这种情况下,在"计算机程序设计的艺术"中,Knuth给出了一点点多于1.3*lg2(n)作为相当好的路径的平均长度.他还说,从随机树中删除一个随机密钥可以保持其随机性(因此它具有良好的平均平衡).
那么,似乎二进制搜索树以随机顺序插入和删除密钥,很可能为所有三个操作提供O(log n)顺序的性能:搜索,插入和删除.
也就是说,我想知道以下方法是否会提供相同的良好属性:
举例来说,按顺序插入的密钥{4,3,5,1,2}的BST将是:
4
/ \
3 5
/\
1 2
Run Code Online (Sandbox Code Playgroud)
假设哈希函数将它们映射到(分别){221,142,12,380,18),我们就会得到.
221(4)
/ \
142(3) 380(1)
/ \
12(5) 18(2)
Run Code Online (Sandbox Code Playgroud)
关键点是"常规"BST可能会退化,因为键是按照用于将它们存储在树中的相同排序关系插入的(它们的"自然"排序,例如字符串的字母顺序)但是哈希函数在键上引入与"自然"完全无关的排序,因此,应该给出与按随机顺序插入键相同的结果.
一个强有力的假设是哈希函数是"好的",但我认为它不是一个不合理的.
我没有在文献中找到任何类似方法的参考,所以它可能是完全错误的,但我不明白为什么!
你觉得我的推理有什么缺点吗?有人已经尝试过吗?
c ×5
c++ ×2
automation ×1
binary-tree ×1
c# ×1
casting ×1
constants ×1
hash ×1
hashtable ×1
macros ×1
midi ×1
n-ary-tree ×1
preprocessor ×1
regex ×1
sed ×1
struct ×1
types ×1