2011-11-19 57 views
0

最終問題/張貼在這!我覺得我現在非常接近!鏈接列表和樹木

基本上,一棵樹,其中每個節點包含一個數字列表,其中樹按名稱排序(樹節點中包含的數據)。從本質上說,目前,我的名字已經添加到我的樹中,並且該樹的列表中給出了數字,但是我正在努力爭取每個名稱具有多個數字的能力,因此如果兩個數字相同的名字用不同的數字輸入。我有比較代碼來檢查相同的名稱,但在那個時候,我不確定如何修改我的指針,以便我添加另一個元素到我的列表中,並在那裏添加新的數字。

乾杯,任何幫助/提示/線索等我們非常感激

下面是我當前的代碼:

編輯:真正的問題是,我怎麼現在,拿我的代碼,並允許每個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; 
} 

我的第一個猜測是,我需要添加代碼,需要放在我的比較,如果語句中時的結果比較== 0,從而增加了列表,並添加數量那裏。但這是我卡住的地方!

+0

這是一個功課題嗎?如果是的話請重新標記。 –

+0

是的,我會重新標記。 – PnP

+0

你可以把它變成一個具體的問題嗎? –

回答

1

我沒有通過您的代碼完全讀,因爲它使我的目光呆滯......

這是你的結構保存的數字。

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

如果一個名字有多個數字,你應該像這樣聲明它。

char   **number; 

使得第一指針*(* 數+ 0)是該名稱的第一個數字,然後* *號+ 0)是下一個。這看起來更整潔一些,因此我建議像這樣構建它,然後遍歷列表,直到找到空值以獲取該名稱的所有可能數字。

0

由於此線程包含大部分代碼,因此我認爲最好在此處做出迴應。

爲了讓你的代碼工作,你需要內改變代碼的「IF語句」你的函數AddNodecomparison == 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功能,使其返回電話號碼列表。