1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct node{ 5 int num; 6 struct node *left; 7 struct node *right; 8 }node; 9 10 void build_node(node **anode, int num) 11 { 12 if(*anode == NULL){ 13 (*anode) = calloc(1, sizeof(node)); 14 if((*anode) == NULL){ 15 perror("calloc error:"); 16 return; 17 } 18 (*anode)->num = num; 19 }else if((*anode)->num > num){ 20 build_node(&(*anode)->left, num); 21 }else if((*anode)->num == num){ 22 23 }else{ 24 build_node(&(*anode)->right, num); 25 } 26 } 27 void read_node(node *anode) 28 { 29 if(anode == NULL) 30 return; 31 if(anode->left != NULL) 32 read_node(anode->left); 33 34 printf("%d\n", anode->num); 35 36 if(anode->right != NULL) 37 read_node(anode->right); 38 } 39 void convert_node(node *anode, node **list) 40 { 41 if(anode == NULL) 42 return; 43 44 if(anode->left != NULL) 45 convert_node(anode->left, list); 46 /* 47 * 思考方式,首先考慮通常狀況,最後再考慮頭尾狀況 48 * 由於不更改節點num,只更改left,right。因此考慮 49 * left,right狀況便可。 50 */ 51 anode->left = *list; 52 if(*list != NULL) 53 (*list)->right = anode; 54 /*下一次循環作準備*/ 55 *list = anode; 56 57 if(anode->right != NULL) 58 convert_node(anode->right, list); 59 } 60 void convert_node2(node *anode, node **list) 61 { 62 if(anode == NULL) 63 return; 64 65 if(anode->right != NULL) 66 convert_node2(anode->right, list); 67 /* 68 * 倒序遍歷可得鏈表頭節點。 69 * 由於正序遍歷時順序創建鏈表節點,最後得尾節點。 70 */ 71 anode->right = *list; 72 if(*list != NULL) 73 (*list)->left = anode; 74 /*下一次循環作準備*/ 75 *list = anode; 76 77 if(anode->left != NULL) 78 convert_node2(anode->left, list); 79 } 80 int main(void) 81 { 82 node *anode = NULL; 83 node *llist = NULL, *rlist = NULL; 84 85 build_node(&anode, 11); 86 build_node(&anode, 7); 87 build_node(&anode, 14); 88 build_node(&anode, 4); 89 build_node(&anode, 8); 90 build_node(&anode, 12); 91 build_node(&anode, 16); 92 93 //read_node(anode); 94 95 convert_node(anode, &rlist); 96 //convert_node2(anode, &llist); 97 while(rlist != NULL){ 98 printf("%d\n", rlist->num); 99 rlist = rlist->left; 100 } 101 while(llist != NULL){ 102 //printf("%d\n", llist->num); 103 //llist = llist->right; 104 } 105 return 0; 106 }
不知道那麼多人轉來轉去幹什麼,又不測試,轉個有問題的代碼node