Связанные списки и деревья - PullRequest
0 голосов
/ 20 ноября 2011

Последний вопрос / Пост на этом!Думаю, я довольно близок!

По сути, дерево, где каждый узел содержит список чисел, где дерево сортируется по имени (данные содержатся в узле дерева).По сути, на данный момент у меня есть так, чтобы мое имя добавлялось в мое дерево, а списку этого дерева присваивался номер, но я пытаюсь работать над тем, чтобы каждое имя имело несколько номеров, таким образом, связанный список расширяется, если дваодни и те же имена вводятся с разными номерами.У меня есть код сравнения для проверки того же имени, но в этот момент я не уверен, как изменить мои указатели, чтобы я добавил еще один элемент в свой список и добавил туда новый номер.

Приветствия, любая помощь / советы / подсказки и т. Д. Очень ценятся

Ниже мой текущий код:

РЕДАКТИРОВАТЬ: Вопрос действительно, как я сейчас, взять код, который я имею, и разрешитьсписок каждого 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;
}

Мое первое предположение состоит в том, что код мне нужендобавить, должен быть помещен в мой оператор сравнения IF, когда результат сравнения == 0, таким образом, увеличить список и добавить туда число.Но это то, где я застрял!

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Я не полностью прочитал твой код, потому что у меня глаза застеклились ...

Это твоя структура, содержащая числа.

typedef struct ListNode {
    char            *number;
    struct ListNode *next;
}ListNode;

Если имя предназначено дляиметь несколько чисел, вы должны объявить это следующим образом.

char            **number;

Так, чтобы первый указатель * (* число + 0) был первым номером для этогоимя, а затем * (* число + 0) является следующим.Это будет выглядеть аккуратно как связанный список, поэтому я предлагаю структурировать его таким образом, а затем выполнять итерацию по списку, пока вы не нажмете null, чтобы получить все возможные числа для этого имени.

0 голосов
/ 16 декабря 2011

Поскольку этот поток содержит большую часть вашего кода, я подумал, что лучше ответить здесь.

Чтобы ваш код работал, вам нужно изменить код внутри «оператора IF» вашей функции AddNode когда 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, чтобы она возвращала список телефонных номеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...