最后的问题/帖子就此!我觉得我现在很接近了!
基本上是A Tree,其中每个节点都包含一个数字列表,其中树按名称排序(树节点中包含的数据)。基本上,此刻,我已经将我的名字添加到我的树中,并且该树的列表被赋予了数字,但我正在努力使每个名称具有多个数字的能力,因此如果两个名称链接列表扩展使用不同的数字输入相同名称。我有比较代码来检查相同的名称,但在那时,我不确定如何修改我的指针,以便我添加另一个元素到我的列表,并在那里添加新的数字。
干杯,任何帮助/提示/线索等都非常感谢
以下是我目前的代码:
编辑:问题是,我现在如何,获取我拥有的代码,并允许每个TreeNode的列表包含多个数字,当输入前一个treenode的相同名称时,从而构建一个数字列表那个名字。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
typedef struct ListNode {
char *number;
struct ListNode *next;
}ListNode;
typedef struct TreeNode {
char *name;
ListNode *numbers;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
TreeNode* AddNode(TreeNode *, char *, char *);
TreeNode* SearchTree(TreeNode *root, char *search);
int N_Print(TreeNode *root);
int main(void) {
char my_string[50], name[25], number[25];
TreeNode *root = NULL;
while ((fgets(my_string, 50, stdin)) != NULL) {
if (my_string[0] == '.')
break;
sscanf(my_string, "%s %s", name, number);
root = AddNode(root, name, number);
}
N_Print(root);
return 0;
}
TreeNode* AddNode(TreeNode *root, char *name, char *number) {
int comparison;
if ( root == NULL) {
root = (TreeNode *)malloc(sizeof(TreeNode));
root->numbers = (ListNode *)malloc(sizeof(ListNode));
root->name = strdup(name); root->numbers->number = strdup(number);
root->left = root->right = NULL;
root->numbers->next = NULL;
}else if (( comparison = strcmp(name, root->name)) < 0 )
root->left = AddNode(root->left, name, number);
else if (comparison > 0) {
root->right = AddNode(root->right, name, number);
} else if (comparison == 0 ) {
root->numbers->number = strdup(number);
root->numbers->next = NULL;
}
return root;
}
TreeNode* SearchTree(TreeNode *root, char *search) {
int comparison;
if (root == NULL) {
printf("NOT FOUND\n");
return NULL;
} else if ((comparison = stricmp(search, root->name)) == 0) {
return root;
} else if ((comparison = stricmp(search, root->name)) < 0) {
return SearchTree(root->left, search);
} else if ((comparison = stricmp(search, root->name)) > 0)
return SearchTree(root->right, search);
}
int N_Print(TreeNode *root) {
TreeNode *search_val;
char search[25];
while(1) {
printf("Type a name please: ");
scanf("%24s", search);
if (search[0] == '.')
break;
search_val = SearchTree(root, search);
if (search_val == NULL) {
N_Print(root);
}
printf("%s\n", search_val->numbers->number);
}
return 0;
}
我的第一个猜测是我需要添加的代码,当compare == 0的结果时需要放在我的比较IF语句中,从而增加列表,并在那里添加数字。但这就是我被困住的地方!
答案 0 :(得分:1)
我没有完全通过你的代码阅读,因为它使我的眼睛釉......
这是包含数字的结构。
typedef struct ListNode {
char *number;
struct ListNode *next;
}ListNode;
如果名称有多个号码,您应该这样声明。
char **number;
这样第一个指针 * (* number + 0)是该名称的第一个数字,然后是* ( * number +0)是下一个。这看起来像链接列表更整洁,所以我建议像这样构造它,然后遍历列表直到你点击null来获得该名称的所有可能数字。
答案 1 :(得分:0)
由于此主题包含大部分代码,我认为最好在此处回复。
要使代码正常工作,您需要在AddNode
时更改函数comparison == 0
的“IF语句”中的代码,这已经指出了。
TreeNode* AddNode(TreeNode *root, char *name, char *number) {
int comparison;
if ( root == NULL) {
root = (TreeNode *)malloc(sizeof(TreeNode));
root->numbers = (ListNode *)malloc(sizeof(ListNode));
root->name = strdup(name); root->numbers->number = strdup(number);
root->left = root->right = NULL;
root->numbers->next = NULL;
}else if (( comparison = strcmp(name, root->name)) < 0 )
root->left = AddNode(root->left, name, number);
else if (comparison > 0) {
root->right = AddNode(root->right, name, number);
} else if (comparison == 0 ) {
// Create a new ListNode
newListNode = (ListNode *)malloc(sizeof(ListNode));
newListNode -> number = strdup(number);
// Add newListNode to existing list
newListNode -> next = root -> numbers;
root -> numbers = newListNode;
}
return root;
}
您可能还应调整SearchTree
功能,以便返回电话号码列表。