我正在使用链接列表和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文件中。 (但是这不会造成任何区别),并且我当然可以根据需要提供更多代码
答案 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;
}