525 lines
15 KiB
C++
525 lines
15 KiB
C++
|
/*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>PŪ<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;
|
|||
|
}
|