我正在尝试打印和访问结构的成员,以便使用其中包含的某些数据。
我有两个结构,第一个是二进制搜索树,其中包含重复的键。我试图提取唯一键并将它们存储在单独的结构中。
注意:我能够从node
函数中将所有唯一键打印出unique_key
结构。但是,我需要从主体内部访问这些唯一键。因此,我的想法是创建一个单独的结构,并将其传递回主函数。
定义两个结构:
/* structure containing duplicate keys */
struct node
{
int KEY;
char *command;
char *duration; /* pointer to a char since it is of unknown size*/
char *time;
char *description;
int count;
struct node *left, *right;
};
/* structure to hold unique keys*/
typedef struct {
int KEY;
char *command;
char *duration; /* pointer to a char since it is of unknown size*/
char *time;
char *description;
}unique;
我正在使用实用程序功能遍历二进制搜索树。该函数带有指向二进制搜索树*root
的指针,并打印所有唯一键。
/* A utility function to find deepest keys of BST */
/* This is done by extracting the key with the lowest count,
since count member of node struct gets incremented each time it is read. */
unique* unique_key(struct node *root)
{
unique *temp = (struct unique *)malloc(sizeof(unique));
if (root != NULL)
{
unique_key(root->left);
if (root->count == 1) {
//the printf statement below prints all unique keys
//Somehow I need to access in the main function, thus my idea was to create a separate struct as explained above
printf("%d(%d) -> %s %s %s %s \n", root->KEY, root->count, root->command, root->time, root->duration, root->description);
temp->KEY = root->KEY;
temp->command = root->command;
temp->description = root->description;
temp->duration = root->duration;
}
unique_key(root->right);
}
return temp;
}
主要驱动程序代码:
int main()
{
/* Let us create following BST. Passing values along with key */
struct node *root = NULL;
root = insert_node(root, 12, "C", "1200", "79", "Meeting");
root = insert_node(root, 3, "C", "1300", "60", "Lunch");
root = insert_node(root, 2, "C", "1400", "30", "Dinner");
root = insert_node(root, 1, "C", "0600", "90", "Work");
root = insert_node(root, 5, "C", "4300", "30", "Diyoor");
root = insert_node(root, 7, "C", "5608", "30", "Dinner");
root = insert_node(root, 9, "C", "1409", "35", "t");
root = insert_node(root, 2, "C", "1600", "60", "play");
root = insert_node(root, 2, "U", "1800", "88", "eve");
printf("Inorder traversal of the given tree \n");
inorder(root); //prints all keys and subsequent values
unique *data = NULL;
data = unique_key(root); //prints only unique keys
printf("%d %s\n", data[1].KEY, data[1].command); //cannot print keys in main function to access from here on
}
一个示例输出如下。相应地填充了BST,并且所有遍历功能都能正常工作。
Inorder traversal of the given tree
1(1) 2(3) 2(2) 2(1) 3(1) 5(1) 7(1) 9(1) 12(1)
Deepest unique keys of the given tree
1(1) -> C 0600 90 Work
2(1) -> U 1800 88 eve
3(1) -> C 1300 60 Lunch
5(1) -> C 4300 30 Diyoor
7(1) -> C 5608 30 Dinner
9(1) -> C 1409 35 t
12(1) -> C 1200 79 Meeting
-33686019 å, æ
有时还会出现其他乱码,这些字符没有在上方显示。
我的问题是:我如何打印和访问unique
的成员,为什么会看到乱码?任何建议,将不胜感激。
编辑:
这些是我试图保存在unique
中的唯一键:
1(1) -> C 0600 90 Work
2(1) -> U 1800 88 eve
3(1) -> C 1300 60 Lunch
5(1) -> C 4300 30 Diyoor
7(1) -> C 5608 30 Dinner
9(1) -> C 1409 35 t
12(1) -> C 1200 79 Meeting
我希望printf("%d %s\n", data[1].KEY, data[1].command);
返回2 U
。
答案 0 :(得分:1)
在C数组中,索引从0开始而不是从1开始索引。通过尝试访问data[1]
,您将在访问数据之后立即访问垃圾。 printf需要使用data[0]
而不是data[1]
。
答案 1 :(得分:1)
当前,您的代码遍历了树并且可以正常打印,但是在其内部调用unique_key时实际上并没有收集任何结果,并且您的返回类型不足以返回事物列表(列表需要结尾,可以是大小变量,也可以是空终止)。您需要更改代码以实际收集结果。一种方法是使用基本向量(自扩展数组),如下所示:
struct MyVector {
void **data;
size_t head;
size_t size;
};
MyVector new_MyVector(size_t initial_size)
{
MyVector list = {
.data = malloc(sizeof(void*) * initial_size),
.head = 0,
.size = initial_size,
};
return list;
}
void push_MyVector(MyVector *vec, unique *item)
{
if (vec->head <= vec->size) {
vec->data = realloc(*vec->data)
vec->size *= 2;
}
vec->data[vec->head] = item;
vec->head++;
}
然后像这样使用它
unique* unique_key(struct node *root, MyVector *list) {
...
unique *left = unique_key(root->left);
push_MyVector(list, left)
...
unique *right = unique_key(root->right);
push_MyVector(list, right)
...
}
一些注意事项:因为数据是双指针,所以要释放向量,您需要遍历它并释放每个单独的项目。我选择使数据成为双指针,以使您的当前代码与大多数代码兼容,但是最好使它成为单个指针,并直接使您的函数写入向量。同样没有实现的是扩展向量,因此您不会耗尽空间,尽管定义了head和size后,您可以做到这一点(只需查找如何使用realloc即可)。
PS:这段代码未经测试,但我希望您能大致了解