Data_Structure/Vorlesungen/DS/Beispiele/dict.c

400 lines
13 KiB
C
Raw Normal View History

2025-01-20 21:25:33 +08:00
/*
Program: dict.c (Report comments/bugs to chikh@yuntech.edu.tw)
Function: <EFBFBD>X<EFBFBD>R<EFBFBD><EFBFBD>binarySearchTree.c<EFBFBD>d<EFBFBD>ҵ{<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD>@<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>n<EFBFBD>D<EFBFBD><EFBFBD><EFBFBD>W<EFBFBD><EFBFBD><EFBFBD>Ԩ<EFBFBD><EFBFBD>ҵ{<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD>~<EFBFBD><EFBFBD><EFBFBD>i
Notes: <EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>i<EFBFBD><EFBFBD>
w={"Mary":10, "Tom":3, "Charlie":5, "Bob":6, "Dickens":20, 4:2, "z":0, "Za":12, "aZ":8}
del w["Dickens"]
w["Mary"]=1
w["Tom"]+=2
w[4]?
w?
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* for strcmp() */
/* <20>w<EFBFBD>qdict<63><74><EFBFBD>c */
typedef struct dict {
char key[20];
int value;
struct dict *llink; /* <20><><EFBFBD>l<EFBFBD>쵲 */
struct dict *rlink; /* <20>k<EFBFBD>l<EFBFBD>쵲 */
} dict;
//void insert(); /* <20>s<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD> */
void prune(); /* <20>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void modify(char, char [], int); /* <20>ק<EFBFBD><D7A7><EFBFBD><EFBFBD><EFBFBD> */
void show(char, char []); /* <20><><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD> */
void process(char [], int); /* <20>N<EFBFBD><4E><EFBFBD>ƥ[<5B>J<EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D> */
void drop(char []); /* <20>N<EFBFBD><4E><EFBFBD>Ʊq<C6B1>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD>𤤲<EFBFBD><F0A4A4B2><EFBFBD> */
dict *replace(dict *); /* <20>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>`<60>I<EFBFBD>ò<EFBFBD><C3B2>ʦܾA<DCBE><41><EFBFBD><EFBFBD><EFBFBD>m */
void connect(dict *, char); /* <20>վ<EFBFBD><D5BE>쵲 */
void inorder(dict *); /* <20><><EFBFBD>ƥH<C6A5><48><EFBFBD>Ǫk<C7AA><6B><EFBFBD>X */
void deleteAll(dict *); /* <20>R<EFBFBD><52><EFBFBD>Ҧ<EFBFBD><D2A6>`<60>I */
dict *search(char []); /* <20>j<EFBFBD>M<EFBFBD>`<60>I */
dict *search_re_r(dict *); /* <20>j<EFBFBD>M<EFBFBD>k<EFBFBD>l<EFBFBD>𤤪<EFBFBD><F0A4A4AA><EFBFBD><EFBFBD>N<EFBFBD>`<60>I */
dict *search_re_l(dict *); /* <20>j<EFBFBD>M<EFBFBD><4D><EFBFBD>l<EFBFBD>𤤪<EFBFBD><F0A4A4AA><EFBFBD><EFBFBD>N<EFBFBD>`<60>I */
dict *search_p(dict *); /* <20>j<EFBFBD>M<EFBFBD><4D><EFBFBD>`<60>I */
dict *root, *ptr; /* root<6F><74><EFBFBD>ڸ`<60>I<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD> */
int main()
{
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("\n<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); //gets(line);
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,"{")) {
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 */
if (strstr(token,":")) { /* token<65>t<EFBFBD><74>":" */
sscanf(token,"%[^:]:%d",key,&value);
//printf("Token #%d: <20><>=%s; <20><>=%d\n",++i,key,value);
process(key,value); /* <20><>key,value<75><65><EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD> */
}
}
}
else if (strstr(line,"del")) {
if (sscanf(line,"del w[%[^]]]",key))
drop(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') {
deleteAll(root);
root = NULL;
}
}
//printf("<22>R<EFBFBD><52><EFBFBD>B<EFBFBD><42><EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=%s\n",key);
}
else if (strstr(line,"+=")) { /* line<6E>t<EFBFBD><74>"+=" */
sscanf(line,"w[%[^]]] +=%d",key,&value);
//printf("<22><><EFBFBD>W<EFBFBD>B<EFBFBD><42><EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=%s<>F<EFBFBD>B<EFBFBD>⤸=%d\n",key,value);
modify('+',key,value);
}
else if (strstr(line,"=")) { /* line<6E>t<EFBFBD><74>"=" */
sscanf(line,"w[%[^]]] = %d",key,&value);
//printf("<22><><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=%s; <20>B<EFBFBD>⤸=%d\n",key,value);
modify('s',key,value);
}
else if (sscanf(line,"w[%[^]]]",key)==1)
//printf("Ū<>ȹB<C8B9><42><EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=%s\n",key);
show('@',key);
else if (strstr(line,"?"))
//printf("<22><><EFBFBD>ܾ<EFBFBD><DCBE>Ӧr<D3A6><EFBFBD>e\n");
show('*',NULL);
else
printf("<EFBFBD>y<EFBFBD>k<EFBFBD>L<EFBFBD>k<EFBFBD><EFBFBD><EFBFBD>{<7B>Asorry!\n");
}
/*
char option;
while (1) {
puts("");
puts("********************");
puts(" <1> insert");
puts(" <2> delete");
puts(" <3> modify");
puts(" <4> show");
puts(" <5> quit");
puts("********************");
printf("Enter your choice: ");
option = getchar();
fflush(stdin);
printf("\n");
switch(option) {
case '1':
insert();
break;
case '2':
prune();
break;
case '3':
modify();
break;
case '4':
show();
break;
case '5':
exit(0);
default :
puts("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>~!");
}
}
*/
return 0;
}
/* <20>s<EFBFBD>W<EFBFBD><57><EFBFBD>ơA<C6A1>s<EFBFBD>W<EFBFBD>@<40><><EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*
void insert()
{
char key[20];
int value;
puts("=====INSERT DATA=====");
printf("<EFBFBD>m<EFBFBD>W: ");
scanf("%s", key);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ");
scanf("%d", &value);
fflush(stdin);
process(key, value);
}
*/
/* <20>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>ơA<C6A1>N<EFBFBD><4E><EFBFBD>Ʊq<C6B1>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD>𤤧R<F0A4A4A7><52> */
void prune(char key[]) /* <20><><EFBFBD><EFBFBD><EFBFBD>ƭ<EFBFBD><C6AD>W<EFBFBD><57>delete_f()<29>A<EFBFBD>o<EFBFBD>̧<EFBFBD><CCA7>W<EFBFBD>O<EFBFBD>{<EFBFBD><EFBFBD><EFBFBD>ݰ_<EFBFBD>Ӱ<EFBFBD><EFBFBD>ܤ@<EFBFBD><EFBFBD> */
{
//char key[20];
if (root == NULL) {
puts("<EFBFBD>r<EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return;
}
//puts("=====DELETE DATA=====");
//printf("<22>п<EFBFBD><D0BF>J<EFBFBD><4A><EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD>W: ");
//scanf("%s", key);
//fflush(stdin);
drop(key);
}
/* <20>ק<EFBFBD><D7A7><EFBFBD><EFBFBD>ơA<C6A1>ק<EFBFBD><D7A7>ǥͦ<C7A5><CDA6>Z */
void modify(char mode, char key[], int value)
{
dict *node;
//char key[20];
//if (root == NULL) { /* <20>P<EFBFBD>_<EFBFBD>ڸ`<60>I<EFBFBD>O<EFBFBD>_<EFBFBD><5F>NULL<4C>A<EFBFBD>Y<EFBFBD><59><EFBFBD>šA<C5A1>ڥ<EFBFBD><DAA5>S<EFBFBD>o<EFBFBD><6F><EFBFBD>A<EFBFBD><41><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>A<EFBFBD><41><EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
//puts("<22>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD>O<EFBFBD>Ū<EFBFBD>!");
//return;
//}
//puts("=====MODIFY DATA===== ");
//printf("<22>п<EFBFBD><D0BF>J<EFBFBD><4A><EFBFBD>ק諸<D7A7>m<EFBFBD>W: ");
//scanf("%s", key);
//fflush(stdin);
if ((node=search(key)) == NULL)
//printf("%s<><73><EFBFBD>b<EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>!\n", key);
process(key,value);
else {
/* <20>C<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>ƪ<EFBFBD><C6AA>p */
//printf("<22>m<EFBFBD>W: %s\n", node->key);
//printf("<22><><EFBFBD><EFBFBD>: %d\n\n", node->value);
//printf("<22>п<EFBFBD><D0BF>J<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ");
//scanf("%d", &node->value);
//fflush(stdin);
if (mode == '+')
node->value += value;
else if (mode == 's')
node->value = value;
value = node->value;
}
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,value);
}
/* <20><><EFBFBD>X<EFBFBD><58><EFBFBD>ơA<C6A1>N<EFBFBD><4E><EFBFBD>ƿ<EFBFBD><C6BF>X<EFBFBD>ܿù<DCBF> */
void show(char mode, char key[])
{
dict *node;
if (mode == '@') {
if ((node=search(key)) == NULL)
printf("w[%s]<5D><><EFBFBD>s<EFBFBD>b\n",key);
else
printf("<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>w[%s]=%d\n",key,node->value);
}
else {
if (root == NULL) { /* <20>P<EFBFBD>_<EFBFBD>ڸ`<60>I<EFBFBD>O<EFBFBD>_<EFBFBD><5F>NULL */
puts("<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD>󤺮e");
return;
}
//puts("=====SHOW DATA=====");
printf("<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>ܼƤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD>s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(key:value)<29>p<EFBFBD>U\n");
inorder(root); /* <20>H<EFBFBD><48><EFBFBD>Ǫk<C7AA><6B><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD> */
}
}
/* <20>B<EFBFBD>z<EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD>A<EFBFBD>N<EFBFBD>s<EFBFBD>W<EFBFBD><57><EFBFBD>ƥ[<5B>J<EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D> */
void process(char key[], int value)
{
dict *node, *prev;
if ((node=search(key)) != NULL) { /* <20>Y<EFBFBD><59><EFBFBD>Ƥw<C6A4>s<EFBFBD>b<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>ܿ<EFBFBD><DCBF>~<7E>A<EFBFBD>]<5D>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD>n<EFBFBD>D<EFBFBD>C<EFBFBD>Ӹ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>Ȥ<EFBFBD><C8A4><EFBFBD><EFBFBD><EFBFBD> */
//printf("%s<>w<EFBFBD>s<EFBFBD>b!\n", key);
node->value = value;
return;
}
ptr = (dict *)malloc(sizeof(dict)); /* ptr<74><72><EFBFBD>V<EFBFBD>Y<EFBFBD>N<EFBFBD>[<5B>J<EFBFBD><4A><EFBFBD>`<60>I */
strcpy(ptr->key, key); /* <20><><EFBFBD>ǤJ<C7A4><4A><EFBFBD><EFBFBD><EFBFBD>ƪ<EFBFBD>name<6D>޼<EFBFBD>(<28>r<EFBFBD><72>)<29>ƻs<C6BB><73>ptr->name<6D><65><EFBFBD>줤 */
ptr->value = value; /* <20><><EFBFBD>ǤJ<C7A4><4A><EFBFBD><EFBFBD><EFBFBD>ƪ<EFBFBD>score<72>޼ƽƻs<C6BB><73>ptr->score<72><65><EFBFBD>줤 */
ptr->llink = ptr->rlink = NULL; /* ptr<74>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD>]<5D><><EFBFBD><EFBFBD> */
if (root == NULL) /* <20>Yroot<6F><74>NULL<4C>A<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>|<7C><><EFBFBD>إߡA<DFA1>]<5D><><EFBFBD>Hptr<74>`<60>I<EFBFBD>@<40><><EFBFBD>Щl<D0A9>G<EFBFBD><47><EFBFBD>𪺮ڸ`<60>I */
root = ptr;
else { /* <20>ڸ`<60>I<EFBFBD><49><EFBFBD><EFBFBD>NULL<4C>A<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>w<EFBFBD>s<EFBFBD>b<EFBFBD>A<EFBFBD>h<EFBFBD>ݧ<EFBFBD><DDA7><EFBFBD><EFBFBD>A<EFBFBD>Xptr<74>`<60>I<EFBFBD><49><EFBFBD>J<EFBFBD>𤤪<EFBFBD><F0A4A4AA><EFBFBD><EFBFBD>m */
node = root; /* <20>q<EFBFBD>ڸ`<60>I<EFBFBD>}<7D>l<EFBFBD>A<EFBFBD>z<EFBFBD>L<EFBFBD><4C><EFBFBD>U<EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD>ƪ<EFBFBD><C6AA><EFBFBD><EFBFBD>J<EFBFBD>I */
while (node != NULL) { /* node<64><65><EFBFBD><EFBFBD><EFBFBD>U<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD>A<EFBFBD>u<EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD>šA<C5A1>N<EFBFBD><4E><EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD>w<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><4D> */
prev = node; /* prev<65>O<EFBFBD><4F>node<64>{<7B><><EFBFBD>ҫ<EFBFBD><D2AB>`<60>I<EFBFBD>Fprev<65>N<EFBFBD><4E><EFBFBD><EFBFBD>ptr<74><72><EFBFBD><EFBFBD><EFBFBD>`<60>I */
if (strcmp(ptr->key, node->key) < 0) /* <20>Yptr->name<6D>p<EFBFBD><70>node->name<6D>A<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD>ptr<74><72><EFBFBD>w<EFBFBD><77><EFBFBD>bnode<64><65><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD>]<5D><><EFBFBD><EFBFBD><EFBFBD>Onode<64><65><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I<EFBFBD>A<EFBFBD>~<7E>򩹤U<F2A9B9A4><55><EFBFBD>M */
node = node->llink;
else /* ptr->name<6D>j<EFBFBD><6A>node->name<6D>A<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD>ptr<74><72><EFBFBD>w<EFBFBD><77><EFBFBD>bnode<64><65><EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD>G<EFBFBD><47><EFBFBD>Onode<64><65><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I<EFBFBD>A<EFBFBD>~<7E>򩹤U<F2A9B9A4><55><EFBFBD>M */
node = node->rlink;
}
if (strcmp(ptr->key, prev->key) < 0) /* <20>Yptr->name<6D>p<EFBFBD><70>prev->name<6D>A<EFBFBD>h<EFBFBD><68>ptr<74>`<60>I<EFBFBD>]<5D><>prev<65><76><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I<EFBFBD>Aptr<74>`<60>I<EFBFBD>H<EFBFBD>𸭪<EFBFBD><F0B8ADAA>Φ<EFBFBD><CEA6>[<5B>J<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD> */
prev->llink = ptr;
else /* ptr->name<6D>j<EFBFBD><6A>prev->name<6D>A<EFBFBD>h<EFBFBD><68>ptr<74>`<60>I<EFBFBD>]<5D><>prev<65><76><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I<EFBFBD>Aptr<74>`<60>I<EFBFBD>H<EFBFBD>𸭪<EFBFBD><F0B8ADAA>Φ<EFBFBD><CEA6>[<5B>J<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD> */
prev->rlink = ptr;
}
}
/* <20>N<EFBFBD><4E><EFBFBD>Ʊq<C6B1>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD>𤤲<EFBFBD><F0A4A4B2><EFBFBD> */
void drop(char key[]) /* <20><><EFBFBD><EFBFBD><EFBFBD>ƭ<EFBFBD><C6AD>W<EFBFBD><57>removing()<29>A<EFBFBD>o<EFBFBD>̧<EFBFBD><CCA7>W<EFBFBD>O<EFBFBD>{<EFBFBD><EFBFBD><EFBFBD>ݰ_<EFBFBD>Ӱ<EFBFBD><EFBFBD>ܤ@<EFBFBD><EFBFBD> */
{
dict *del_node; /* del_node<64>O<EFBFBD><4F><EFBFBD>N<EFBFBD>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>} */
if ((del_node=search(key)) == NULL) /* <20>H<EFBFBD>ǤJ<C7A4><4A>name<6D>޼Ʒ<DEBC><C6B7>@<40><><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD>A<EFBFBD><41><EFBFBD>M<EFBFBD>𤤭<EFBFBD><F0A4A4AD>@<40>Ӹ`<60>I<EFBFBD><49>name<6D><65><EFBFBD><EFBFBD><ECB5A5><EFBFBD>Ӧr<D3A6><72><EFBFBD>F<EFBFBD>Y<EFBFBD><EFBFBD><E4A4A3><EFBFBD><EFBFBD><EFBFBD>ƫh<C6AB><68><EFBFBD>ܿ<EFBFBD><DCBF>~ */
{
printf("w[%s]<5D><><EFBFBD>s<EFBFBD>b\n", key);
return;
}
if (del_node->llink != NULL || del_node->rlink != NULL) /* <20>Ydel_node<64>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>𸭡A<F0B8ADA1>h<EFBFBD>I<EFBFBD>sreplace()<29><><EFBFBD>Ƹm<C6B8><6D><EFBFBD>Ӹ`<60>I<EFBFBD><49><EFBFBD>e<EFBFBD>A<EFBFBD><41><EFBFBD>O"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22>欰 */
del_node = replace(del_node); /* <20>`<60>N<EFBFBD>ǤJreplace()<29><>del_node<64>P<EFBFBD>^<5E>ǥX<C7A5>Ӫ<EFBFBD>del_node<64>N<EFBFBD><4E><EFBFBD>P<EFBFBD>A<EFBFBD>^<5E>ǥX<C7A5>Ӫ<EFBFBD><D3AA>O<EFBFBD>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>}<7D>Freplace()<29><><EFBFBD>I<EFBFBD>sconnecting()<29>վ<EFBFBD><D5BE>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>d<EFBFBD><64><EFBFBD><EFBFBD>/<2F>k<EFBFBD>l<EFBFBD><6C><EFBFBD>s<EFBFBD><73><EFBFBD>覡 */
else /* <20>Ydel_node<64>`<60>I<EFBFBD><49><EFBFBD>𸭡A<F0B8ADA1>h<EFBFBD>~<7E><><EFBFBD>P<EFBFBD>O<EFBFBD>O<EFBFBD>_<EFBFBD><5F><EFBFBD>ڸ`<60>I<EFBFBD>Τ@<40><EFBFBD><EBA4BA><EFBFBD>`<60>I */
if (del_node == root) /* <20>Ydel_node<64><65><EFBFBD>ڸ`<60>I<EFBFBD>A<EFBFBD>h<EFBFBD><68>root<6F><74><EFBFBD>Э<EFBFBD><D0AD>m<EFBFBD><6D><EFBFBD><EFBFBD> */
root = NULL;
else /* del_node<64><65><EFBFBD>@<40><EFBFBD><EBA4BA><EFBFBD>`<60>I<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD>sconnecting()<29><><EFBFBD>Ӹ`<60>I<EFBFBD><49><EFBFBD><EFBFBD> */
connect(del_node, 'n');
free(del_node); /* <20><><EFBFBD><EFBFBD><EFBFBD>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD>Ŷ<EFBFBD> */
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n",key);
}
/* <20>M<EFBFBD><4D><EFBFBD>R<EFBFBD><52><EFBFBD>D<EFBFBD>𸭪<EFBFBD><F0B8ADAA><EFBFBD><EFBFBD>N<EFBFBD>`<60>I */
dict *replace(dict *node)
{
dict *re_node; /* <20><><EFBFBD>N<EFBFBD>`<60>I(<28>Q<EFBFBD><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I) */
/* <20>H<EFBFBD>ǤJ<C7A4><4A>node<64><65><EFBFBD>X<EFBFBD>o<EFBFBD>I<EFBFBD>A<EFBFBD>I<EFBFBD>ssearch_re_r()<29>j<EFBFBD>M<EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>`<60>Ire_node<64>F<EFBFBD>Y<EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><E4A4A3><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>`<60>I<EFBFBD>A<EFBFBD>A<EFBFBD>I<EFBFBD>ssearch_re_l()<29>j<EFBFBD>M<EFBFBD><4D><EFBFBD>l<EFBFBD>𤤪<EFBFBD><F0A4A4AA><EFBFBD><EFBFBD>N<EFBFBD>`<60>I */
if ((re_node=search_re_r(node->rlink)) == NULL)
re_node = search_re_l(node->llink);
if (re_node->rlink != NULL) /* <20>Y<EFBFBD><59><EFBFBD>N<EFBFBD>`<60>Ire_node<64><65><EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>ӥk<D3A5>l<EFBFBD>𩹤W<F0A9B9A4><57><EFBFBD><EFBFBD>re_node<64><65><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C> */
connect(re_node, 'r');
else
if (re_node->llink != NULL) /* <20><><EFBFBD>N<EFBFBD>`<60>Ire_node<64><65><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>ӥ<EFBFBD><D3A5>l<EFBFBD>𩹤W<F0A9B9A4><57><EFBFBD><EFBFBD>re_node<64><65><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD>l<EFBFBD><6C> */
connect(re_node, 'l');
else /* re_node<64><65><EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
connect(re_node, 'n'); /* 'n'<27><><EFBFBD><EFBFBD><EFBFBD>אּ'm'<27>A<EFBFBD>H<EFBFBD>Q<EFBFBD>P<EFBFBD><EFBFBD><E1ADB1><EFBFBD>{<7B><><EFBFBD>޿<EFBFBD><DEBF>@<40>P */
strcpy(node->key, re_node->key);/* node<64>ҫ<EFBFBD><D2AB><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>Hre_node<64>`<60>I<EFBFBD><49><EFBFBD>e<EFBFBD>л\<5C><><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD><6D> */
node->value = re_node->value;
return re_node; /* <20>^<5E>dzQ<C7B3><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>} */
}
/* <20>վ<EFBFBD><D5BE>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Alink<6E><6B>'r'<27><><EFBFBD>ܳB<DCB3>z<EFBFBD>k<EFBFBD><EFBFBD>A<EFBFBD><41>'l'<27><><EFBFBD>B<EFBFBD>z<EFBFBD><7A><EFBFBD><EFBFBD>A<EFBFBD><41>'m'<27>h<EFBFBD>N<EFBFBD><EFBFBD>]<5D><>NULL */
void connect(dict *node, char link) /* <20>o<EFBFBD>̶ǤJ<C7A4><4A>node<64>޼Ƭ<DEBC><C6AC>Y<EFBFBD>N<EFBFBD>Q<EFBFBD><51><EFBFBD>N<EFBFBD><4E><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>} */
{
dict *parent;
parent = search_p(node); /* <20>j<EFBFBD>M<EFBFBD>N<EFBFBD>Q<EFBFBD><51><EFBFBD>N<EFBFBD><4E><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>`<60>Iparent */
if (strcmp(node->key, parent->key) < 0) /* <20>Q<EFBFBD><51><EFBFBD>N<EFBFBD><4E><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD>parent<6E><74><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C> */
if (link == 'r') /* <20>Ylink<6E><6B>'r'<27>A<EFBFBD>h<EFBFBD><68>node<64><65><EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFB1BE>parent<6E><74><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD>۷<EFBFBD><DBB7><EFBFBD><EFBFBD>Q<EFBFBD><51><EFBFBD>N<EFBFBD><4E><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>X<EFBFBD><58><EFBFBD>m */
parent->llink = node->rlink;
else /* link<6E><6B>'m'<27>A<EFBFBD>hnode<64><65><EFBFBD>𸭡A<F0B8ADA1><41><EFBFBD>ɥu<C9A5>ݧ<EFBFBD>parent<6E><74><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>]<5D><><EFBFBD><EFBFBD> */
parent->llink = NULL;
else /* <20>Q<EFBFBD><51><EFBFBD>N<EFBFBD><4E><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD>parent<6E><74><EFBFBD>k<EFBFBD>l<EFBFBD><6C> */
if (link == 'l') /* <20>Ylink<6E><6B>'l'<27>A<EFBFBD>h<EFBFBD><68>node<64><65><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFB1BE>parent<6E><74><EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD>A<EFBFBD>۷<EFBFBD><DBB7><EFBFBD><EFBFBD>Onode<64><65><EFBFBD><EFBFBD> */
parent->rlink = node->llink;
else /* link<6E><6B>'m'<27>A<EFBFBD>hnode<64><65><EFBFBD>𸭡A<F0B8ADA1><41><EFBFBD>ɥu<C9A5>ݧ<EFBFBD>parent<6E><74><EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD>]<5D><><EFBFBD><EFBFBD> */
parent->rlink = NULL;
}
/* <20>H<EFBFBD><48><EFBFBD>ǰl<C7B0>ܪk<DCAA>q<EFBFBD>X<EFBFBD>C<EFBFBD>Ӹ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD>W<EFBFBD>P<EFBFBD><50><EFBFBD>Z<EFBFBD>A<EFBFBD>Ļ<EFBFBD><C4BB>j<EFBFBD>覡 */
void inorder(dict *node)
{
if (node != NULL) {
inorder(node->llink);
printf("%s:%d\n", node->key, node->value);
inorder(node->rlink);
}
}
void deleteAll(dict *node) /* <20>H<EFBFBD><48><EFBFBD>Ǩ<EFBFBD><C7A8>X<EFBFBD><58><EFBFBD><EFBFBD>R<EFBFBD><52><EFBFBD>`<60>I */
{
if (node != NULL) {
deleteAll(node->llink);
deleteAll(node->rlink);
printf("<EFBFBD>R<EFBFBD><EFBFBD>'w[%s]=%d'<27>`<60>I\n",node->key,node->value);
free(node);
}
}
/* <20>j<EFBFBD>Mtarget<65>Ҧb<D2A6>`<60>I */
dict *search(char target[])
{
dict *node;
node = root;
while (node != NULL) {
if (strcmp(target, node->key) == 0) /* <20>Ytarget<65>Pnode<64>ҫ<EFBFBD><D2AB><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>s<EFBFBD><73><EFBFBD>r<EFBFBD><72><EFBFBD>ۦP<DBA6>A<EFBFBD>h<EFBFBD>^<5E><>node<64>ҫ<EFBFBD><D2AB>`<60>I<EFBFBD><49><EFBFBD>} */
return node;
else
if (strcmp(target, node->key) < 0) /* <20>Ytarget<65>p<EFBFBD><70><EFBFBD>ثe<D8AB>`<60>I<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M */
node = node->llink;
else /* target<65>j<EFBFBD><6A><EFBFBD>ثe<D8AB>`<60>I<EFBFBD>A<EFBFBD><41><EFBFBD>k<EFBFBD>j<EFBFBD>M */
node = node->rlink;
}
return node;
}
/* <20>j<EFBFBD>M<EFBFBD>k<EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>`<60>I */
dict *search_re_r(dict *node)
{
dict *re_node;
re_node = node;
while (re_node != NULL && re_node->llink != NULL) /* <20>M<EFBFBD><4D>node<64>k<EFBFBD>l<EFBFBD>𩳳<EFBFBD><F0A9B3B3>̥<EFBFBD><CCA5>`<60>I<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>̱<EFBFBD><CCB1>񪺸`<60>I<EFBFBD>A<EFBFBD><41>re_node<64><65><EFBFBD>V */
re_node = re_node->llink;
return re_node; /* <20><><EFBFBD>o<EFBFBD>쪺re_node<64>^<5E>ǥX<C7A5>h */
}
/* <20>j<EFBFBD>M<EFBFBD><4D><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>`<60>I */
dict *search_re_l(dict *node)
{
dict *re_node;
re_node = node;
while (re_node != NULL && re_node->rlink != NULL) /* <20>M<EFBFBD><4D>node<64><65><EFBFBD>l<EFBFBD>𩳳<EFBFBD><F0A9B3B3>̥k<CCA5>`<60>I */
re_node = re_node->rlink;
return re_node; /* <20><><EFBFBD>o<EFBFBD>쪺re_node<64>^<5E>ǥX<C7A5>h */
}
/* <20>j<EFBFBD>Mnode<64><65><EFBFBD><EFBFBD><EFBFBD>`<60>I */
dict *search_p(dict *node)
{
dict *parent;
parent = root;
while (parent != NULL) {
if (strcmp(node->key, parent->key) < 0) { /* <20>o<EFBFBD><6F>strcmp()<0<>A<EFBFBD>N<EFBFBD><4E>node<64><65><EFBFBD><EFBFBD>parent<6E>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C> */
if (strcmp(node->key, parent->llink->key) == 0) /* <20>Yparent<6E><74><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>name<6D>Y<EFBFBD><59><EFBFBD>ڭ<EFBFBD><DAAD><EFBFBD><EFBFBD>ߪ<EFBFBD><DFAA>`<60>Inode<64>Ҹ<EFBFBD><D2B8>r<EFBFBD><72> */
return parent; /* <20>Y<EFBFBD><59>parent<6E>^<5E>ǥX<C7A5><58> */
else /* <20>_<EFBFBD>h<EFBFBD>A<EFBFBD><41>parent<6E><74><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>`<60>I<EFBFBD>]<5D><><EFBFBD>U<EFBFBD>@<40>ӥؼСA<D0A1>~<7E>򩹤U<F2A9B9A4><55><EFBFBD>M */
parent = parent->llink;
}
else { /* node<64><65><EFBFBD><EFBFBD>parent<6E>`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD>l<EFBFBD><6C> */
if (strcmp(node->key, parent->rlink->key) == 0) /* <20>Yparent<6E><74><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>name<6D>Y<EFBFBD><59><EFBFBD>ڭ<EFBFBD><DAAD><EFBFBD><EFBFBD>ߪ<EFBFBD><DFAA>`<60>I<EFBFBD>Ҹ<EFBFBD><D2B8>r<EFBFBD><72> */
return parent; /* <20>Y<EFBFBD><59>parent<6E>^<5E>ǥX<C7A5><58> */
else /* <20>_<EFBFBD>h<EFBFBD>A<EFBFBD><41>parent<6E><74><EFBFBD>k<EFBFBD>l<EFBFBD>`<60>I<EFBFBD>]<5D><><EFBFBD>U<EFBFBD>@<40>ӥؼСA<D0A1>~<7E>򩹤U<F2A9B9A4><55><EFBFBD>M */
parent = parent->rlink;
}
}
return NULL;
}