最后一个问题!我想我现在已经很接近了!
基本上是一个树,其中每个节点包含一个数字列表,其中树按名称(包含在树节点中的数据)排序。本质上,现在,我有。我的名字被添加到我的树中,树的列表中,有一个数字,但我试图使每个名字都有多个数字,因此,如果两个相同的名字输入不同的数字,链表就会扩展。我有比较代码来检查相同的名称,但在这一点上,我不确定如何修改指针,所以我向列表中添加了另一个元素,并在那里添加了新的数字。
干杯,任何帮助/提示/线索等都非常感谢
下面是我当前的代码:编辑:问题是,我现在如何使用我拥有的代码,并允许每个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 FOUNDn");
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("%sn", search_val->numbers->number);
}
return 0;
}
我的第一个猜测是,当compare == 0的结果时,我需要添加的代码需要放在我的compare IF语句中,从而增加列表,并在那里添加数字。但这就是我被困住的地方!
我没有完全看完你的代码,因为它让我的眼睛发呆…
这是保存数字的结构体。
typedef struct ListNode {
char *number;
struct ListNode *next;
}ListNode;
如果一个名字有多个数字,你应该这样声明。
char **number;
因此,第一个指针*(*number+0)是该名称的第一个数字,然后*(*number+0)是下一个。这将看起来更整洁,作为一个链表,所以我建议这样构建它,然后遍历列表,直到你点击null,以获得该名称的所有可能的数字。
由于这个线程包含了您的大部分代码,我认为最好在这里回复。
为了使你的代码工作,你需要改变你的函数AddNode
的"IF语句"中的代码,当comparison == 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 ) {
// 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
函数,使其返回电话号码列表