Social Icons

twitterfacebookgoogle plusrss feedemail

5/15/2013

資料結構 Tree 建置 與 印出

有很多人不知道怎麼用C建立一顆簡單的樹...這邊PO上一個小範例
請注意這很久之前做的,程式上我有稍微修改~很多地方會有BUG (疑,主要是為了不讓同學直接抄答案...)

請將下面的程式碼做修改,達到以下目的
0.找出BUG
1.做交集聯集。
2.將樹改成 Complete. Binary Tree 完整(完美)二元樹
3.增加刪除節點

點圖可放大

在開始看程式碼前,我再提醒一次,這個程式碼很多問題要解決!!!請找出來並修改!!

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#define MAX 100
//宣告結構
typedef struct _node {
        int data;
        struct _node *left;
        struct _node *right;
} *Node;

Node createNode(int data) {
        //產生節點
        Node node =(Node ) malloc(sizeof(struct _node));
        node -> data = data;
        node -> left = node -> right = NULL;
        return node;
}
Node insertNode(Node root, int data) {
        if(!root)//如果樹根則直接產生空間
                return createNode(data);
        else {
                if(data <= root->data)
                        root->left = insertNode(root->left, data);
                else
                        root->right = insertNode(root->right, data);
        }
        return root;
}
Node searchNode(Node root, int data) {//搜尋節點
        if(root) {
                if(root->data == data)
                        return root;
                else if(data < root->data)
                        return searchNode(root->left, data);
                else
                        return searchNode(root->right, data);
        }

        return root;
}
int getInt() {
/*存放使用者輸入的建值*/
 char line[MAX];
 int n;
 printf("請輸入鍵值(數字): ");
 if(fgets(line,MAX,stdin)) {
    if(sscanf(line, "%d",&n))
    return n;
}
}
int judge() {
/*存放使用者輸入的建值*/
 char line[MAX];
 int n;
 printf("請問要選擇<集合> 還是<集合>,輸入或\n");
 while(fgets(line,MAX,stdin)) {
     if(sscanf(line, "%d",&n))
         switch(tolower(n)) {
             case 1:
                 return n;
             case 2:
                 return n;
             default:
                 printf("\n請重新輸入或\n");
                 break;
          }
   
 }
}
void conti() {//繼續執行
        char line[MAX];
        printf("請按ENTER繼續");
        fgets(line,MAX,stdin);
         system("cls");
}
void show(Node root) {//印出節點
        if(root) {
                show(root->left);
                show(root->right);
                printf(" %d,", root->data);
        }
}

int main(int argc, char *argv[]) {
    char line[MAX], cmd;
    Node ptr,root1= NULL,root2=NULL;
    int data,set_num,i=0,count=0;
    int set1[100],set2[100];
    for(i=0;i<101;i++)
    {
       set1[i]=0;
       set2[i]=0;
    }
start:
    
    printf("請輸入代號相應功能選項:\n"
           "* [a]將鍵值輸入至樹中\n"
           "* [s]搜尋數中的鍵值\n"
           "* [p]印出tree.\n"
           "* [e]離開.\n"
           "> ");
    while(fgets(line,BUFSIZ,stdin)) {//存取使用者輸入的值
      if(sscanf(line, "%c", &cmd)) {
          switch(tolower(cmd)) {
           case 'a':
               set_num=judge();//判斷是存放在集合還是集合
               data = getInt();//存放使用者輸入的建值
               if(set_num==1){ //集合1時
               set1[data]=data;
               root1 = insertNode(root1, data);//將鍵值存入樹中
               }
               else if(set_num==2){ //集合2時
               set2[data]=data;
               root2 = insertNode(root2, data);
               }
               printf("\n鍵值'%d'已經加入集合%d 的樹中\n", data,set_num);
               conti();//繼續
               goto start;
           case 's':
               data = getInt();//存取要找的鍵值
               set_num=judge();//判斷是找哪個集合
               if(set_num==1)
               ptr = searchNode(root1, data);
               else if(set_num==2)
               ptr = searchNode(root2, data);
               printf("鍵值'%d' ,在集合%d的樹中%s 被找到\n", data,set_num, (ptr ? "有" : "沒有"));
               conti();//繼續
               goto start;
           case 'p':
                printf("集合的鍵值如下:\n");
                show(root1);
                printf("\n集合的鍵值如下:\n");
                show(root2);
               
               goto start;
           case 'e':
               printf("\n");
               goto over;
            default:
            printf("沒這個字的功能,請重新輸入.\n");
               break;
            }
      }
    
    
    }
over:
      system("pause");
      return 0;
}

請勿直接複製上面程式碼執行,因為編碼不同 ^.<

沒有留言:

張貼留言

俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!

 
 
无觅相关文章插件,迅速提升网站流量