无法将BST节点插入到List节点中

时间:2019-04-16 04:00:17

标签: c++ list

我正在使用链接列表和BST创建客户忠诚度计划类型代码。它使用会员计划列表,每个节点都包含客户ID的BST。目前,我正在尝试创建一个在列表中搜索忠诚度计划的功能,一旦找到该功能(如果未创建,则会创建)将客户ID添加到该节点的BST中。但是,在测试时,即时消息在插入新列表节点(insert_at_front)函数时遇到读取冲突。 任何帮助将不胜感激!

我曾经尝试过更改find​​_list函数的函数类型并为其创建包装函数,就像我以前为BST使用类似的函数所做的那样,但是我一直迷失在代码中,而且似乎会破坏更多代码。

list.h header file:
typedef struct listNode {
    char* name; //Name of company
    BST *customer;  //Tree of customer ID's
    struct listNode *next; //Pointer for next compnay
} *ListNodePtr;
void option_insert(List *self) {
    char* input_loyalty;
    int input_ID;

    printf("What loyalty program do you wish to add a customer to?  \n");
    scanf("%s", &input_loyalty);
    printf("What is the customer ID \n");
    scanf("%d", &input_ID);

    find_list(self, input_loyalty, input_ID);
}

void find_list(List *self, char* data, int ID) {
    ListNodePtr current = self->head;

    if (current != NULL) {
        if (current->name == data) {
            insert_bst(self->head->customer, ID);
        }
        else {
            current = current->next;
        }
    }
    else {                          
        insert_at_front(self, data);
        insert_bst(self->head->customer, ID);
    }

}

void insert_at_front(List *self, char* data) {
    int n = strlen(data);
    ListNodePtr new_node = malloc(n * sizeof(char*));
    strcpy(new_node->name, data);

    new_node->next = self->head;
    self->head = new_node;
}

我已经包含了问题中正在使用的功能,但请注意,它们被分隔在不同的.c文件中。 (但是这不会造成任何区别),并且我当然可以根据需要提供更多代码

1 个答案:

答案 0 :(得分:0)

答案可能与您使用malloc()有关。您将根据数据的大小而不是结构的大小来创建内存。

我还应该提到,如果您使用的是C ++(而不是C),则最好学习如何使用new关键字。

无论如何,如果仍然决定使用malloc,请尝试以下方法:

void insert_at_front(List *self, char* data) {
    int n = strlen(data);
    ListNodePtr new_node = malloc(sizeof(listNode)); // note, we're using the size of a node instead
    new_node->name = malloc(n * sizeof(char)); // now, we need to allocate the string too.

    strlcpy(new_node->name, data, n); // if you want to use a "secure" copy

    new_node->next = self->head;
    self->head = new_node;
}