链接列表和树

时间:2011-11-19 20:39:53

标签: c list struct linked-list

最后的问题/帖子就此!我觉得我现在很接近了!

基本上是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语句中,从而增加列表,并在那里添加数字。但这就是我被困住的地方!

2 个答案:

答案 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功能,以便返回电话号码列表。