链表和树



最后一个问题!我想我现在已经很接近了!

基本上是一个树,其中每个节点包含一个数字列表,其中树按名称(包含在树节点中的数据)排序。本质上,现在,我有。我的名字被添加到我的树中,树的列表中,有一个数字,但我试图使每个名字都有多个数字,因此,如果两个相同的名字输入不同的数字,链表就会扩展。我有比较代码来检查相同的名称,但在这一点上,我不确定如何修改指针,所以我向列表中添加了另一个元素,并在那里添加了新的数字。

干杯,任何帮助/提示/线索等都非常感谢

下面是我当前的代码:

编辑:问题是,我现在如何使用我拥有的代码,并允许每个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函数,使其返回电话号码列表

相关内容

  • 没有找到相关文章

最新更新