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