2011-11-19 2 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 비교 목록을 증가, 거기에 수를 추가 할 때 내 비교 IF 문 내에 배치 될 필요가 있다는 점이다. 그러나 이것이 내가 붙어있는 곳입니다!

+0

숙제 문제가 있습니까? 다시 태그를 지정하십시오. –

+0

예, 태그를 다시 지정하겠습니다. – PnP

+0

이 질문을 특정 질문으로 구성 할 수 있습니까? –

답변

1

이 내 눈을 유약하게 나는 당신의 코드를 완전히 읽어 보지 않았 ...

이 숫자를 가지고 당신의 구조체이다.

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

이름이 여러 개인 경우, 다음과 같이 선언해야합니다.

char   **number; 

그래서 제 포인터 * (* 번호 + 0)는 그 이름의 첫번째 숫자이며, * (* 번호 + 0) 다음이다. 이것은 연결된 목록으로 더 깔끔해 보일 것입니다. 그래서 그것을 구조화하는 것이 좋습니다. 그런 다음 해당 이름에 대해 가능한 모든 숫자를 얻기 위해 null을 누를 때까지 목록을 반복합니다.

0

이 스레드는 대부분의 코드를 포함하고 있으므로 여기에서 응답하는 것이 가장 좋을 것이라고 생각했습니다.

코드를 작동 시키려면 이미 지적한 일 때 함수 AddNode의 "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 기능을 조정해야합니다.