Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Trie节点在C语言中的实现_C_Trie - Fatal编程技术网

Trie节点在C语言中的实现

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

我在使用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 
    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()-两个名称和链接,用于相同的基本思想。您的代码似乎不匹配
{
。如果缩进正确,这一点很明显。请同时修复这两个问题。此时询问无效代码是没有意义的(除非您特别询问您遇到的编译器错误,但不理解或不知道如何修复)。