Data_Structure/作業/unit7/Threaded Binary Tree_bit.cpp

525 lines
15 KiB
C++
Raw Normal View History

2025-01-20 21:30:53 +08:00
/*Notes: <20><><EFBFBD>J<EFBFBD>i<EFBFBD><69>
w={"Mary":10, "Tom":3, "Charlie":5, "Bob":6, "Dickens":20, 4:9, "z":0, "Za":12, "aZ":8}
w={10:10, 20:3, 5:5, 17:6, 23:20, 18:9, 3:0, 9:12}
w={10:10, 5:5, 9:6, 3:20, 7:9}
w={"A":10, "B":3, "C":5, "Bob":6, "D":20}
w={"D":10, "C":3, "B":5, "A":6}
del w["A"]
del w["Dickens"]
del w["Mary"]
del w["aZ"]
del w
w={"B":3, "A":10}
w["A"]=10
w["B"]=20
w["Tom"]+=2
w[4]?
w?
*/
#include <stdio.h> /* for sscanf(), printf() */
#include <stdlib.h>
#include <string.h> /* for strstr(), strtok(), strtok_r() */
#include <conio.h>
/* <20>w<EFBFBD>qdict<63><74><EFBFBD>c */
typedef struct dict { /* <20>޽u<DEBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>c<EFBFBD>A<EFBFBD><41><EFBFBD>@<40>r<EFBFBD><72> */
char key[20]; /* <20><><EFBFBD><EFBFBD><EFBFBD>Ӹ`<60>I<EFBFBD><49><EFBFBD>u<EFBFBD><75><EFBFBD>v(key)<29><><EFBFBD>e */
int value; /* <20><><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>ȡv(value)<29><><EFBFBD>e */
struct dict *llink; /* <20><><EFBFBD>V<EFBFBD><56><EFBFBD>l<EFBFBD><6C><EFBFBD>کΤ޽u<DEBD>γ~ */
struct dict *rlink; /* <20><><EFBFBD>V<EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD>کΤ޽u<DEBD>γ~ */
int lbit; /* <20><><EFBFBD><EFBFBD> llink <20>O<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD> */
int rbit; /* <20><><EFBFBD><EFBFBD> rlink <20>O<EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>`<60><><EFBFBD><EFBFBD> */
} dict;
void show(void); /* <20><><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD> */
void insert(char [], int); /* <20>N<EFBFBD><4E><EFBFBD>ƥ[<5B>J<EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D> */
void insert_left(struct dict *s, struct dict *t);
void insert_right(struct dict *s, struct dict *t);
void removing(char []); /* <20>N<EFBFBD><4E><EFBFBD>Ʊq<C6B1>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD>𤤲<EFBFBD><F0A4A4B2><EFBFBD> */
void inorder(struct dict *); /* <20><><EFBFBD>ƥH<C6A5><48><EFBFBD>Ǫk<C7AA><6B><EFBFBD>X */
void free_all_nodes(struct dict *node);
void find_newroot(void); /* <20>j<EFBFBD>M<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I */
dict *search_p(struct dict *node);
dict *search(char []); /* <20>j<EFBFBD>M<EFBFBD>`<60>I */
dict *insuc(dict *ptr);
dict *root = NULL, *ptr, *prev ,*head = NULL ;
int main(){
head = (dict *)malloc(sizeof(dict));
if (head == NULL) {
printf("<EFBFBD>O<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>ѡI\n");
return 1;
}
head->lbit = head->rbit = 1;
head->rlink = head;
head->llink = root;
char *token, key[12], line[128];
const char *s = " ={},"; /* <20><><EFBFBD>j<EFBFBD>ŰO<C5B0><4F><EFBFBD>r<EFBFBD><72> */
int value;
char *rest ,option;
printf("<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>s<EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><EFBFBD><EFBFBD><EFBFBD>z<EFBFBD>A<EFBFBD>w<EFBFBD><EFBFBD><Enter><3E><><EFBFBD><EFBFBD><EFBFBD>{<7B><>\n");
while (1) {
printf("\n<EFBFBD><EFBFBD><EFBFBD>O => ");
fgets(line,128,stdin); /* <20>ϥ<EFBFBD>gets()Ū<><C5AA><EFBFBD>]<5D>i<EFBFBD>H<EFBFBD>A<EFBFBD><41><EFBFBD>]gets()<29><><EFBFBD><>J<EFBFBD>r<EFBFBD><72><EFBFBD>ƪ<EFBFBD><C6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>i<EFBFBD><69><EFBFBD>ɭP<C9AD>x<EFBFBD>s<EFBFBD><73><EFBFBD>J<EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>}<7D>C<EFBFBD>Ŷ<EFBFBD><C5B6>z<EFBFBD><7A> */
if (line[0]=='\n') break; /* <20><><EFBFBD>J<EFBFBD>Ŧr<C5A6><72><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A> */
if (strstr(line,"{")) { /* line<6E>t<EFBFBD><74>"{" */
sscanf(line,"w = {%[^}]}",line);
rest = line;
while (token = strtok_r(rest,s,&rest)) { /* strtok_r()<29><><EFBFBD>Ϊk<CEAA>i<EFBFBD>Ѩ<EFBFBD> http://bit.ly/3VcvbbZ */
/* printf("%s\n",token); */
if (strstr(token,":")) {/* token<65>t<EFBFBD><74>":" */
sscanf(token,"%[^:]:%d",key,&value);
// printf("key=%s,value=%d\n",key,value);
insert(key,value);
// printf("Token #%d: <20><>=%s; <20><>=%d\n",++i,key,value);
}
}
}else if (strstr(line,"del")) {
if(sscanf(line,"del w[%[^]]]",key)){
if(strcmp(key,root->key)==0){
// printf("<22>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>w[%s]<5D><>root<6F>`<60>I\n",key);
find_newroot();
// printf("<22>s<EFBFBD><73>root<6F>`<60>I<EFBFBD><49>w[%s]\n",root->key);
}else removing(key);
}else{
printf("<EFBFBD>L<EFBFBD>k<EFBFBD><EFBFBD>N<EFBFBD>R<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40>Ӥ<EFBFBD><D3A4><EFBFBD><EFBFBD>A<EFBFBD>N<EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>Ӧr<D3A6><72>? (y/n) => ");
scanf("%c",&option);
fflush(stdin);
if (option == 'y' || option == 'Y') {
free_all_nodes(root);
root = NULL;
}else{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD><EFBFBD><EFBFBD>Ҧ<EFBFBD><EFBFBD>r<EFBFBD><EFBFBD>\n");
}
}
}else if (strstr(line,"+=")) { /* line<6E>t<EFBFBD><74>"+=" */
sscanf(line,"w[%[^]]] +=%d",key,&value);
dict *modify_node;
if((modify_node = search(key)) == NULL){ /* <20><EFBFBD><E4A4A3><EFBFBD><EFBFBD><EFBFBD>ƫh<C6AB><68><EFBFBD>ܿ<EFBFBD><DCBF>~ */
printf("<EFBFBD><EFBFBD><EFBFBD>~! %s <20><><EFBFBD>b<EFBFBD><62><EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>!\n", key);
}else{
modify_node->value += value;
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,modify_node->value);
}
}else if (strstr(line,"=")) { /* line<6E>t<EFBFBD><74>"=" */
sscanf(line,"w[%[^]]] = %d",key,&value);
dict *add_node;
if (root == NULL){
insert(key,value);
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,root->value);
}else{
if((add_node = search(key)) == NULL){ /* <20><EFBFBD><E4A4A3><EFBFBD><EFBFBD><EFBFBD>ƫh<C6AB>s<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD> */
insert(key,value);
printf("%s <20><><EFBFBD>b<EFBFBD><62><EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>!\n", key);
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,value);
}else{
add_node->value = value;
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,add_node->value);
}
}
}else if (sscanf(line,"w[%[^]]]?",key)==1){
dict *read_node;
if((read_node = search(key)) == NULL){ /* <20><EFBFBD><E4A4A3><EFBFBD><EFBFBD><EFBFBD>ƫh<C6AB>s<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD> */
printf("<EFBFBD><EFBFBD><EFBFBD>~! %s <20><><EFBFBD>b<EFBFBD><62><EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>!\n", key);
}else{
printf("<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>w[%s]=%d\n",key,read_node->value);
}
}else if (strstr(line,"?")) show();
else printf("<EFBFBD>y<EFBFBD>k<EFBFBD>L<EFBFBD>k<EFBFBD><EFBFBD><EFBFBD>{<7B>Asorry!\n");
}
printf("\n<EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>R<EFBFBD><52><EFBFBD>Ҧ<EFBFBD><D2A6>`<60>I<EFBFBD>Abye ~\n");
free_all_nodes(root);
free(head);
return 0;
}
// <20>ק<EFBFBD><D7A7>᪺insert<72><74><EFBFBD><EFBFBD>
void insert(char key[], int value) {
// <20>ˬd<CBAC>O<EFBFBD>_<EFBFBD>w<EFBFBD>s<EFBFBD>b
if (search(key) != NULL) {
printf("%s <20>w<EFBFBD>s<EFBFBD>b!\n", key);
return;
}
// <20>إ߷s<DFB7>`<60>I
ptr = (struct dict *) malloc(sizeof(struct dict));
strcpy(ptr->key, key);
ptr->value = value;
ptr->lbit = ptr->rbit = 0;
ptr->llink = ptr->rlink = NULL; // <20><><EFBFBD>T<EFBFBD><54><EFBFBD>l<EFBFBD>Ƭ<EFBFBD> NULL
// <20>B<EFBFBD>z<EFBFBD>ž𪺱<C5BE><F0AABAB1>p
if (root == NULL) {
root = ptr;
head->llink = root; // head <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB5B2><EFBFBD>V root
root->llink = head; // root <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>V head
root->rlink = head; // root <20><><EFBFBD>k<EFBFBD><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>V head
return;
}
// <20>M<EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD>m
dict *current = root;
dict *parent;
while (1) {
parent = current;
if (strcmp(ptr->key, current->key) < 0) { // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (current->lbit == 0) { // <20><><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD>m
insert_left(current, ptr);
break;
}
current = current->llink;
}else { // <20><><EFBFBD>k<EFBFBD><6B>
if (current->rbit == 0) { // <20><><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD>m
insert_right(current, ptr);
break;
}
current = current->rlink;
}
}
}
// <20>b<EFBFBD>Y<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD>J<EFBFBD>s<EFBFBD>`<60>I
void insert_left(struct dict *s, struct dict *t) {
t->llink = s->llink; // <20>s<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>V<EFBFBD><56><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I
t->rlink = s; // <20>s<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>V<EFBFBD><56><EFBFBD>`<60>I
t->lbit = s->lbit; // <20>s<EFBFBD>`<60>I<EFBFBD>~<7E>ӭ<EFBFBD><D3AD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECA4B8>
t->rbit = 0; // <20>]<5D>w<EFBFBD>k<EFBFBD><EFBFBD><ECA4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s->llink = t; // <20><><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>V<EFBFBD>s<EFBFBD>`<60>I
s->lbit = 1; // <20>]<5D>w<EFBFBD><77><EFBFBD><EFBFBD><ECA4B8><EFBFBD><EFBFBD><EFBFBD>`<60>
if (t->lbit == 1) {
dict *p = t->llink;
while (p->rbit == 1)
p = p->rlink;
p->rlink = t;
}
}
// <20>b<EFBFBD>Y<EFBFBD>`<60>I<EFBFBD>k<EFBFBD><EFBFBD>J<EFBFBD>s<EFBFBD>`<60>I<EFBFBD>]<5D>ھڹϤ<DAB9><CFA4>ҥܡ^
void insert_right(struct dict *s, struct dict *t) {
t->rlink = s->rlink; // <20>s<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>V<EFBFBD><56><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I
t->rbit = s->rbit; // <20>s<EFBFBD>`<60>I<EFBFBD>~<7E>ӭ<EFBFBD><D3AD>`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD><EFBFBD><ECA4B8>
t->llink = s; // <20>s<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>V<EFBFBD><56><EFBFBD>`<60>I
t->lbit = 0; // <20>]<5D>w<EFBFBD><77><EFBFBD><EFBFBD><ECA4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s->rlink = t; // <20><><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>V<EFBFBD>s<EFBFBD>`<60>I
s->rbit = 1; // <20>]<5D>w<EFBFBD>k<EFBFBD><EFBFBD><ECA4B8><EFBFBD><EFBFBD><EFBFBD>`<60>
// <20>M<EFBFBD><4D><EFBFBD>e<EFBFBD>X<EFBFBD>`<60>I<EFBFBD>ç<EFBFBD><C3A7>s<EFBFBD>޽u
if (t->rbit == 1) {
dict *p = t->rlink;
while (p->lbit == 1)
p = p->llink;
p->llink = t;
}
}
/* <20>N<EFBFBD><4E><EFBFBD>Ʊq<C6B1>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD>𤤲<EFBFBD><F0A4A4B2><EFBFBD> */
void removing(char key[]) {
dict *del_node = search(key);
if (del_node == NULL) {
printf("%s <20><><EFBFBD>b<EFBFBD><62><EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>!\n", key);
return;
}
dict *parent = search_p(del_node);
// Case 1: <20><><EFBFBD>`<60>I (<28>S<EFBFBD><53><EFBFBD>l<EFBFBD>`<60>I)
if (del_node->lbit == 0 && del_node->rbit == 0) {
if (parent == NULL) { // <20>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ڸ`<60>I
root = NULL;
head->llink = head;
} else if (parent->llink == del_node) {
parent->llink = del_node->llink; // <20>~<7E>ӥ<EFBFBD><D3A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
parent->lbit = 0;
} else {
parent->rlink = del_node->rlink; // <20>~<7E>ӥk<D3A5><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
parent->rbit = 0;
}
free(del_node);
}
// Case 2: <20>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C>
else if (del_node->lbit == 1 && del_node->rbit == 0) {
dict *left_child = del_node->llink;
dict *successor = del_node->rlink; // <20>O<EFBFBD>s<EFBFBD><73><EFBFBD>~<7E>`<60>I
// <20><><EFBFBD><EFBFBD>l<EFBFBD>𪺳̥k<CCA5>`<60>I
dict *rightmost = left_child;
while (rightmost->rbit == 1) {
rightmost = rightmost->rlink;
}
// <20><><EFBFBD>s<EFBFBD>s<EFBFBD><73>
rightmost->rlink = successor;
if (parent == NULL) {
root = left_child;
head->llink = root;
} else if (parent->llink == del_node) {
parent->llink = left_child;
} else {
parent->rlink = left_child;
}
free(del_node);
}
// Case 3: <20>u<EFBFBD><75><EFBFBD>k<EFBFBD>l<EFBFBD><6C>
else if (del_node->lbit == 0 && del_node->rbit == 1) {
dict *right_child = del_node->rlink;
dict *predecessor = del_node->llink; // <20>O<EFBFBD>s<EFBFBD>e<EFBFBD>X<EFBFBD>`<60>I
// <20><><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>l<EFBFBD>𪺳̥<F0AABAB3><CCA5>`<60>I
dict *leftmost = right_child;
while (leftmost->lbit == 1) {
leftmost = leftmost->llink;
}
// <20><><EFBFBD>s<EFBFBD>s<EFBFBD><73>
leftmost->llink = predecessor;
if (parent == NULL) {
root = right_child;
head->llink = root;
} else if (parent->llink == del_node) {
parent->llink = right_child;
} else {
parent->rlink = right_child;
}
free(del_node);
}
// Case 4: <20><><EFBFBD><EFBFBD><EFBFBD>Ӥl<D3A4><6C>
else {
// <20><><EFBFBD><EFBFBD>ǫ<EFBFBD><C7AB>~<7E>`<60>I<EFBFBD>]<5D>k<EFBFBD>l<EFBFBD>𤤳̤p<CCA4><70><EFBFBD>`<60>I<EFBFBD>^
dict *successor = del_node->rlink;
dict *succ_parent = del_node;
while (successor->lbit == 1) {
succ_parent = successor;
successor = successor->llink;
}
// <20>ƻs<C6BB><73><EFBFBD>~<7E>`<60>I<EFBFBD><49><EFBFBD>ƾڨ<C6BE><DAA8>Q<EFBFBD>R<EFBFBD><52><EFBFBD>`<60>I
strcpy(del_node->key, successor->key);
del_node->value = successor->value;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~<7E>`<60>I
if (succ_parent == del_node) {
del_node->rlink = successor->rlink;
del_node->rbit = successor->rbit;
} else {
succ_parent->llink = successor->llink;
succ_parent->lbit = successor->lbit;
}
free(successor);
}
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n", key);
}
void find_newroot() {
struct dict *newroot_node, *prev;
if(root->lbit == 0 && root->rbit == 0 ){
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n", root->key);
free(root);
root = NULL;
return;
}
if (root->lbit == 1) { // <20><><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD><EFBFBD>l<EFBFBD>𤤳̤j<CCA4><6A><EFBFBD>`<60>I
newroot_node = root->llink;
prev = root;
// <20><><EFBFBD><EFBFBD>l<EFBFBD>𤤳̤j<CCA4><6A><EFBFBD>`<60>I
while (newroot_node->rbit == 1) {
prev = newroot_node;
newroot_node = newroot_node->rlink;
}
// <20>B<EFBFBD>z<EFBFBD>s<EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD>s<EFBFBD><73>
if (newroot_node != root->llink) {
// <20>p<EFBFBD>G<EFBFBD>s<EFBFBD>ڤ<EFBFBD><DAA4>O<EFBFBD><4F><EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I
prev->rbit = newroot_node->rbit; // <20>~<7E>ӷs<D3B7>ڪ<EFBFBD><DAAA>k<EFBFBD><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
prev->rlink = newroot_node->rlink; // <20>~<7E>ӷs<D3B7>ڪ<EFBFBD><DAAA>k<EFBFBD><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
newroot_node->lbit = root->lbit; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ъ<EFBFBD><D0AA>A
newroot_node->llink = root->llink; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD>l<EFBFBD><6C>
newroot_node->rbit = root->rbit; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA>k<EFBFBD><6B><EFBFBD>Ъ<EFBFBD><D0AA>A
newroot_node->rlink = root->rlink; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA>k<EFBFBD>l<EFBFBD><6C>
} else {
// <20>p<EFBFBD>G<EFBFBD>s<EFBFBD>ڬO<DAAC><4F><EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I
newroot_node->rbit = root->rbit; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA>k<EFBFBD><6B><EFBFBD>Ъ<EFBFBD><D0AA>A
newroot_node->rlink = root->rlink; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA>k<EFBFBD>l<EFBFBD><6C>
}
} else if (root->rbit == 1) { // <20><><EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD><41><EFBFBD>k<EFBFBD>l<EFBFBD>𤤳̤p<CCA4><70><EFBFBD>`<60>I
newroot_node = root->rlink;
prev = root;
// <20><><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>l<EFBFBD>𤤳̤p<CCA4><70><EFBFBD>`<60>I
while (newroot_node->lbit == 1) {
prev = newroot_node;
newroot_node = newroot_node->llink;
}
// <20>B<EFBFBD>z<EFBFBD>s<EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD>s<EFBFBD><73>
if (newroot_node != root->rlink) {
// <20>p<EFBFBD>G<EFBFBD>s<EFBFBD>ڤ<EFBFBD><DAA4>O<EFBFBD><4F><EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I
prev->lbit = newroot_node->lbit; // <20>~<7E>ӷs<D3B7>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
prev->llink = newroot_node->llink; // <20>~<7E>ӷs<D3B7>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
newroot_node->lbit = root->lbit; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ъ<EFBFBD><D0AA>A
newroot_node->llink = root->llink; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD>l<EFBFBD><6C>
newroot_node->rbit = root->rbit; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA>k<EFBFBD><6B><EFBFBD>Ъ<EFBFBD><D0AA>A
newroot_node->rlink = root->rlink; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA>k<EFBFBD>l<EFBFBD><6C>
} else {
// <20>p<EFBFBD>G<EFBFBD>s<EFBFBD>ڬO<DAAC><4F><EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I
newroot_node->lbit = root->lbit; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ъ<EFBFBD><D0AA>A
newroot_node->llink = root->llink; // <20>~<7E>ӭ<EFBFBD><D3AD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD>l<EFBFBD><6C>
}
}
// <20><><EFBFBD>s<EFBFBD>Y<EFBFBD>`<60>I<EFBFBD><49><EFBFBD>s<EFBFBD><73>
if(root != NULL){
head->llink = newroot_node;
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n", root->key);
free(root);
root = newroot_node;
}
}
void show(void) {
if (root == NULL) {
puts("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>Ū<EFBFBD>!");
return;
}
printf("<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>ܼƤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(key<65>Gvalue)<29>p<EFBFBD>U\n");
inorder(root);
}
// <20>ϥΤ޽u<DEBD>S<EFBFBD>ʶi<CAB6><EFBFBD>ǹM<C7B9><4D>
void inorder(dict *root) {
if (root == NULL) {
printf("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>Ū<EFBFBD>!\n");
return;
}
dict *current = root;
// <20><><EFBFBD><EFBFBD><EFBFBD>̥<EFBFBD><CCA5><EFBFBD>`<60>I
while (current->lbit == 1) {
current = current->llink;
}
// <20>ϥΤ޽u<DEBD>S<EFBFBD>ʹM<CAB9><4D>
while (current != head) {
printf("%s<>G%d\n", current->key, current->value);
current = insuc(current);
}
}
// <20>M<EFBFBD><EFBFBD>ǫ<EFBFBD><C7AB>~<7E>`<60>I
dict *insuc(dict *ptr) {
dict *current;
// <20>Y<EFBFBD>k<EFBFBD><6B><EFBFBD>ЬO<D0AC><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]rbit = 0<>^<5E>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>k<EFBFBD><6B><EFBFBD><EFBFBD>
if (ptr->rbit == 0) {
return ptr->rlink;
}
// <20>_<EFBFBD>h<EFBFBD><68><EFBFBD>k<EFBFBD><6B><EFBFBD>@<40>B<EFBFBD><42><EFBFBD>A<EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>F<EFBFBD>̥<EFBFBD><CCA5><EFBFBD>`<60>I
current = ptr->rlink;
while (current->lbit == 1) {
current = current->llink;
}
return current;
}
/* <20>j<EFBFBD>Mtarget<65>Ҧb<D2A6>`<60>I */
struct dict *search(char target[]) {
struct dict *node = root;
while (node != NULL && node != head) { // <20>[<5B>J head <20><><EFBFBD>ˬd<CBAC>H<EFBFBD><48><EFBFBD><EFBFBD><EEA8AB><EFBFBD>Y<EFBFBD>`<60>I
int cmp = strcmp(target, node->key);
if (cmp == 0) {
return node; // <20><><EFBFBD><EFBFBD><EFBFBD>ؼи`<60>I
} else if (cmp < 0) { // target <20>p<EFBFBD><70><EFBFBD>ثe<D8AB>`<60>I<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M
if (node->lbit == 0) { // <20>p<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return NULL; // <20>N<EFBFBD><4E><EFBFBD><EFBFBD><E4A4A3><EFBFBD>ؼ<EFBFBD>
}
node = node->llink;
} else { // target <20>j<EFBFBD><6A><EFBFBD>ثe<D8AB>`<60>I<EFBFBD>A<EFBFBD><41><EFBFBD>k<EFBFBD>j<EFBFBD>M
if (node->rbit == 0) { // <20>p<EFBFBD>G<EFBFBD>k<EFBFBD><6B><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return NULL; // <20>N<EFBFBD><4E><EFBFBD><EFBFBD><E4A4A3><EFBFBD>ؼ<EFBFBD>
}
node = node->rlink;
}
}
return NULL; // <20><EFBFBD><E4A4A3><EFBFBD>ؼ<EFBFBD>
}
/* <20>j<EFBFBD>Mnode<64><65><EFBFBD><EFBFBD><EFBFBD>`<60>I */
struct dict *search_p(struct dict *node) {
if (node == NULL || node == root) {
return NULL;
}
struct dict *current = root;
struct dict *parent = NULL;
while (current != NULL && current != head) {
int cmp = strcmp(node->key, current->key);
if (cmp == 0) { // <20><><EFBFBD><EFBFBD><EFBFBD>ؼи`<60>I<EFBFBD>A<EFBFBD><41><EFBFBD>^<5E><><EFBFBD><EFBFBD><EFBFBD>`<60>I
return parent;
}
parent = current; // <20><><EFBFBD>s<EFBFBD><73><EFBFBD>`<60>I
if (cmp < 0) { // <20>ؼЦb<D0A6><62><EFBFBD>l<EFBFBD><6C>
if (current->lbit == 0) { // <20>p<EFBFBD>G<EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return NULL; // <20><EFBFBD><E4A4A3><EFBFBD>ؼ<EFBFBD>
}
current = current->llink;
} else { // <20>ؼЦb<D0A6>k<EFBFBD>l<EFBFBD><6C>
if (current->rbit == 0) { // <20>p<EFBFBD>G<EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return NULL; // <20><EFBFBD><E4A4A3><EFBFBD>ؼ<EFBFBD>
}
current = current->rlink;
}
}
return NULL; // <20>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼи`<60>I
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ҧ<EFBFBD><D2A6>`<60>I<EFBFBD><49><EFBFBD>D<EFBFBD><44><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD>
void free_all_nodes(struct dict *root) {
if (root == NULL) {
return;
}
dict *current = root;
dict *temp;
// <20><><EFBFBD><EFBFBD><EFBFBD>̥<EFBFBD><CCA5><EFBFBD>`<60>I
while (current->lbit == 1) {
current = current->llink;
}
// <20>ϥΤ޽u<DEBD>S<EFBFBD>ʹM<CAB9><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I
while (current != head) {
temp = current;
current = insuc(current);
printf("<EFBFBD>R<EFBFBD><EFBFBD>'w[%s]=%d'<27>`<60>I\n", temp->key, temp->value);
free(temp);
}
root = NULL;
}