如何在链接结构

时间:2017-09-04 08:51:57

标签: c

我的插入有效,所以一个新问题,如何在C中将数据设置为NULL?请参阅最后一部分进行说明。

我已定义了结构类型

typedef struct node {
    char* data;
    int weight;
    bool  end_of_key;
    struct node * left;
    struct node * equal;
    struct node * right;
} node_t;



int main(int argc, char *argv[]){
node_t* root=NULL;
int weight;
int i = 1;

insert(root,"cat",3);
insert(root,"at",2);
insert(root,"cute",4);
.....
return 0 ;}

这是我的插入功能

node_t*  insert(node_t* pNode,char* word, int weight) {

    /**
    * Create a new pNode, and save a character from word
    */
  pNode = (node_t*)malloc(sizeof(node_t));

if(*pNode->data == NULL){   
        pNode->left = NULL;
        pNode->equal = NULL;
        pNode->right = NULL;
        pNode->data = word;
  }



if (word[0] < *(pNode->data)) {
    /**
    * Insert the character on the left branch
    */
    pNode->left = insert(pNode, word, weight);
}

else if (word[0] == *(pNode->data)) {
    if ((word[1]) == '\0') {
        /**
        *set pNode end_of_key_flag to true and assign weight
        */
        pNode->end_of_key = true;
        pNode->weight = weight;
    //  printf("%c", *(pNode->data++));
    }
    else {
        /**
        * If the word contains more characters, try to insert them
        * under the equal branch
        */
    //  printf("%c", *(pNode->data++));
        pNode->equal = insert(pNode,word + 1, weight);

    }
}

else {
    /**
    * If current char in word is greater than char in pData
    * Insert the character on the right branch
    */
    pNode->right = insert(pNode,word, weight);
}

return pNode;} 

此代码正在尝试执行此操作enter image description here

所以我的插入最终有效,但看起来它只能插入一件事,我想知道如何在C中将数据设置为NULL?

if(*pNode->data == NULL){   
        pNode->left = NULL;
        pNode->equal = NULL;
        pNode->right = NULL;
        pNode->data = word;
  }

我想在* pNode-&gt;数据为空时运行这四行代码,但显然不能按照我想要的方式运行。

2 个答案:

答案 0 :(得分:1)

代码的一些改进

  • insert()必须将第一个参数设为node_t **(请参阅评论)
  • char *data必须为char data,因为每个节点只包含一个字符
  • 填写清单时可以计算
  • weight

以下是您的代码的更正版本。函数get()用于在填充列表中找到密钥(用于测试)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node {
    char data;
    int weight;
    struct node * left;
    struct node * equal;
    struct node * right;
} node_t;

void insert(node_t** pNode, char* word, int weight)
{
    char data;
    node_t **pNext;
    node_t *pCurrent;

    if (word == NULL)
    {
        return ;
    }

    data = word[weight];

    if (*pNode == NULL)
    {
        *pNode = malloc(sizeof(node_t));
        pCurrent = *pNode;
        memset(pCurrent, 0, sizeof(node_t));
        pCurrent->data = data;
    }
    else
    {
        pCurrent = *pNode;
    }

    if (data == pCurrent->data)
    {
        weight ++;
        if (strlen(word) == weight)
        {
            pCurrent->weight = weight;
            return;
        }

        pNext = &pCurrent->equal;
    }
    else if (data > pCurrent->data)
    {
        pNext = &pCurrent->right;
    }
    else
    {
        pNext = &pCurrent->left;
    }

    insert(pNext, word, weight);
}

int get(node_t** pNode, char *word, int weight)
{
    char data;
    node_t **pNext;
    node_t *pCurrent;

    if (word == NULL)
    {
        return 0;
    }

    data = word[weight];

    if (*pNode == NULL)
    {
        return 0; // not found
    }

    pCurrent = *pNode;

    if (data == pCurrent->data)
    {
        weight ++;

        if (strlen(word) == weight)
        {
            return pCurrent->weight;
        }

        pNext = &pCurrent->equal;
    }
    else if (data > pCurrent->data)
    {
        pNext = &pCurrent->right;
    }
    else
    {
        pNext = &pCurrent->left;
    }

    return get(pNext, word, weight);
}

int main()
{
    node_t * root = NULL;

    insert(&root, "cat", 0);
    insert(&root, "at", 0);
    insert(&root, "cute", 0);

    printf("cat=%d\n",get(&root,"cat",0)); // cat=3
    printf("at=%d\n",get(&root,"at",0)); // at=2
    printf("cute=%d\n",get(&root,"cute",0)); // cute=4

    // todo: free memory

    return 0;
}

除了释放内存外,还会测试代码。

答案 1 :(得分:0)

首先,您的insert()签名有问题 (正如@MichaelWalz指出的那样)

你宁愿

node_t* insert(node_t** pNode, char* word, int weight);

然后

insert(&root,"cute",4);

为什么不开始修改此内容并编辑帖子?