請注意這很久之前做的,程式上我有稍微修改~很多地方會有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
看過文章之後歡迎留下您寶貴的意見喔!