Trie节点在C语言中的实现
我在使用Trie数据结构的LZW算法中工作。我遇到的问题是,我的函数InsertTrie应该添加一个新节点并链接到上一个节点Trie节点在C语言中的实现,c,trie,C,Trie,我在使用Trie数据结构的LZW算法中工作。我遇到的问题是,我的函数InsertTrie应该添加一个新节点并链接到上一个节点 enter code here typedef struct TrieNode { short codes[256]; struct *TrieNode links[258]; } TrieNode; typedef struct LZWCmp { TrieNode *head; * Head pointer to first TrieNode
enter code here
typedef struct TrieNode {
short codes[256];
struct *TrieNode links[258];
} TrieNode;
typedef struct LZWCmp {
TrieNode *head; * Head pointer to first TrieNode
CodeSink sink; * Code sink to send bits to
void *sinkState; * Unknown object to send to sink for state
int nextCode; * Next code to be assigned
int numBits; * Number of bits per code currently
int maxCode; * Max code that fits in numBits bits
UInt nextInt; * Partially-assembled next int of output
int bitsUsed; * Number of valid bits in top portion of nextInt
TrieNode *curLoc; * Current position in trie
short lastSym; * Most recent symbol encoded
} LZWCmp
void InsertTrie(LZWCmp *cmp, UChar sym) {
int init = 0;
if (cmp->curLoc == NULL) {
printf("Current Code %u\n", CurCode);
cmp->curLoc = malloc(sizeof(TrieNode));
do {
cmp->curLoc->codes[init] = -1;
cmp->curLoc->links[init] = NULL;
} while(++init < NUM_SYMS);
cmp->curLoc->codes[sym] = CurCode;
}
int TrieTraverse(LZWCmp *cmp, char *sym) {
UChar init = 0, result;
int size = 1;
if (cmp->curLoc == NULL)
return FALSE;
do {
if (init == *sym) {
cmp->lastSym = cmp->curLoc->codes[init]; // Pack Code
cmp->curLoc = cmp->curLoc->links[init];
return TRUE;
}
} while(++init < NUM_SYMS && cmp->curLoc != NULL);
}
在此处输入代码
类型定义结构三节点{
短码[256];
结构*三节点链接[258];
}三元组;
类型定义结构LZWCmp{
三节点*头;*头指针指向第一个三节点
CodeSink sink;*向其发送位的代码接收器
void*sinkState;*要发送到接收器以获取状态的未知对象
int nextCode;*要分配的下一个代码
int numBits;*当前每个代码的位数
int maxCode;*适合其位的最大代码
UInt nextInt;*部分组装到输出的下一个int
int bitsUsed;*nextInt顶部的有效位数
三节点*curLoc;*三节点中的当前位置
短lastSym;*最近编码的符号
}LZWCmp
void InsertTrie(LZWCmp*cmp,UChar sym){
int init=0;
如果(cmp->CULLOC==NULL){
printf(“当前代码%u\n”,CurCode);
cmp->curLoc=malloc(sizeof(三节点));
做{
cmp->CULLOC->codes[init]=-1;
cmp->curLoc->links[init]=NULL;
}而(++initcurLoc->code[sym]=CurCode;
}
int-trietranverse(LZWCmp*cmp,char*sym){
UChar init=0,结果;
int size=1;
如果(cmp->CULLOC==NULL)
返回FALSE;
做{
if(init==*sym){
cmp->lastSym=cmp->curLoc->Code[init];//包代码
cmp->curLoc=cmp->curLoc->links[init];
返回TRUE;
}
}而(++initcurLoc!=NULL);
}
CurCode是一个静态变量,它跟踪最后一个代码并插入到trie树中。首先我遍历trie节点,然后我将curLoc设置为特定的链接,该链接多次将为NULL,我创建了一个新的节点,但它确实起作用。它不链接。它只是分配内存。任何建议
谢谢哪一行应该设置链接?对不起,@hyde我只是编辑我的代码,所以基本上根是字典0到255个符号,例如代码aa从根开始看起来是a(索引97)如果链接为,则转到链接97null@hyde我们在索引97中添加了一个新的符号257,因为最后一个字符是97,其余的符号我们设置为-1,因为它们不会被使用。请创建一个MCVE()或SSCCE()-两个名称和链接,用于相同的基本思想。您的代码似乎不匹配
{
。如果缩进正确,这一点很明显。请同时修复这两个问题。此时询问无效代码是没有意义的(除非您特别询问您遇到的编译器错误,但不理解或不知道如何修复)。