335 lines
9.8 KiB
C++
335 lines
9.8 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, "Charlie":5, "Bob":6, "Dickens":20}
|
|||
|
w={"A":6,"B":5,"C":3,"D":10}
|
|||
|
w={"A":6,"B":5}
|
|||
|
del w["A"]
|
|||
|
del w["Dickens"]
|
|||
|
del w["Mary"]
|
|||
|
del w["aZ"]
|
|||
|
del w
|
|||
|
w["Mary"]=1
|
|||
|
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>qstudent<6E><74><EFBFBD>c */
|
|||
|
typedef struct student {
|
|||
|
char name[20]; /* <20>ǥͩm<CDA9>W */
|
|||
|
int score; /* <20>ǥͦ<C7A5><CDA6>Z */
|
|||
|
struct student *llink; /* <20><><EFBFBD>l<EFBFBD>쵲 */
|
|||
|
struct student *rlink; /* <20>k<EFBFBD>l<EFBFBD>쵲 */
|
|||
|
}student;
|
|||
|
|
|||
|
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 removing(char []); /* <20>N<EFBFBD><4E><EFBFBD>Ʊq<C6B1>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD>𤤲<EFBFBD><F0A4A4B2><EFBFBD> */
|
|||
|
void inorder(struct student *); /* <20><><EFBFBD>ƥH<C6A5><48><EFBFBD>Ǫk<C7AA><6B><EFBFBD>X */
|
|||
|
void free_all_nodes(struct student *node);
|
|||
|
void find_newroot(void); /* <20>j<EFBFBD>M<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I */
|
|||
|
|
|||
|
student *search_p(struct student *node);
|
|||
|
student *search(char []); /* <20>j<EFBFBD>M<EFBFBD>`<60>I */
|
|||
|
|
|||
|
student *root, *ptr, *prev;
|
|||
|
|
|||
|
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 ,choice[3];
|
|||
|
|
|||
|
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);
|
|||
|
insert(key,value);
|
|||
|
// printf("Token #%d: <20><>=%s; <20><>=%d\n",++i,key,value);
|
|||
|
}
|
|||
|
}
|
|||
|
}else if (strstr(line,"del")) {
|
|||
|
if(strcmp(line,"del w\n")==0){
|
|||
|
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) => ");
|
|||
|
fgets(choice, sizeof(choice), stdin);
|
|||
|
if(strcmp(choice,"y\n")==0){
|
|||
|
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(sscanf(line,"del w[%[^]]]",key)==1){
|
|||
|
if(strcmp(key,root->name)==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->name);
|
|||
|
}else{
|
|||
|
removing(key);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}else if (strstr(line,"+=")) { /* line<6E>t<EFBFBD><74>"+=" */
|
|||
|
sscanf(line,"w[%[^]]] +=%d",key,&value);
|
|||
|
student *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->score += value;
|
|||
|
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,modify_node->score);
|
|||
|
}
|
|||
|
}else if (strstr(line,"=")) { /* line<6E>t<EFBFBD><74>"=" */
|
|||
|
sscanf(line,"w[%[^]]] = %d",key,&value);
|
|||
|
student *add_node;
|
|||
|
if (root == NULL){
|
|||
|
insert(key,value);
|
|||
|
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,root->score);
|
|||
|
}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->score = value;
|
|||
|
printf("<EFBFBD>s<EFBFBD>]w[%s]=%d\n",key,add_node->score);
|
|||
|
}
|
|||
|
}
|
|||
|
}else if (sscanf(line,"w[%[^]]]?",key)==1){
|
|||
|
student *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->score);
|
|||
|
}
|
|||
|
}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>Abye ~\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/* <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<DCA4><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD> */
|
|||
|
void insert(char name[], int score){
|
|||
|
struct student *node, *prev;
|
|||
|
/* <20><><EFBFBD>Ƥw<C6A4>s<EFBFBD>b<EFBFBD>h<EFBFBD><68><EFBFBD>ܿ<EFBFBD><DCBF>~ */
|
|||
|
if (search(name) != NULL) {
|
|||
|
printf("%s <20>w<EFBFBD>s<EFBFBD>b!\n", name);
|
|||
|
return;
|
|||
|
}
|
|||
|
ptr = (struct student *) malloc(sizeof(struct student));
|
|||
|
strcpy(ptr->name, name);
|
|||
|
ptr->score = score;
|
|||
|
ptr->llink = ptr->rlink = NULL;
|
|||
|
if (root == NULL) /* <20><><EFBFBD>ڸ`<60>I<EFBFBD><49>NULL<4C><4C><EFBFBD><EFBFBD><EFBFBD>p */
|
|||
|
root = ptr;
|
|||
|
else { /* <20><><EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD><EFBFBD>NULL<4C><4C><EFBFBD><EFBFBD><EFBFBD>p */
|
|||
|
node = root;
|
|||
|
while (node != NULL) { /* <20>j<EFBFBD>M<EFBFBD><4D><EFBFBD>ƴ<EFBFBD><C6B4>J<EFBFBD>I */
|
|||
|
prev = node;
|
|||
|
if(strcmp(ptr->name, node->name) < 0)
|
|||
|
node = node->llink;
|
|||
|
else
|
|||
|
node = node->rlink;
|
|||
|
}
|
|||
|
if (strcmp(ptr->name, prev->name) < 0)
|
|||
|
prev->llink = ptr;
|
|||
|
else
|
|||
|
prev->rlink = ptr;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* <20>N<EFBFBD><4E><EFBFBD>Ʊq<C6B1>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD>𤤲<EFBFBD><F0A4A4B2><EFBFBD> */
|
|||
|
void removing(char name[]){
|
|||
|
student *del_node = search(name);
|
|||
|
if (del_node == NULL) {
|
|||
|
printf("%s <20><><EFBFBD>b<EFBFBD><62><EFBFBD>G<EFBFBD><47><EFBFBD>j<EFBFBD>M<EFBFBD><4D><EFBFBD><EFBFBD>!\n", name);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
student *parent = search_p(del_node);
|
|||
|
|
|||
|
// <20>B<EFBFBD>z<EFBFBD>S<EFBFBD><53><EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>p
|
|||
|
if (del_node->llink == NULL && del_node->rlink == NULL) {
|
|||
|
if (parent->llink == del_node) {
|
|||
|
parent->llink = NULL;
|
|||
|
} else {
|
|||
|
parent->rlink = NULL;
|
|||
|
}
|
|||
|
}else if (del_node->llink == NULL || del_node->rlink == NULL) { // <20>B<EFBFBD>z<EFBFBD>@<40>䦳<EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>p
|
|||
|
student *child = (del_node->llink != NULL) ? del_node->llink : del_node->rlink;
|
|||
|
if (parent->llink == del_node) {
|
|||
|
parent->llink = child;
|
|||
|
} else {
|
|||
|
parent->rlink = child;
|
|||
|
}
|
|||
|
}else{ //<2F>B<EFBFBD>z<EFBFBD><7A><EFBFBD>䦳<EFBFBD>l<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>p
|
|||
|
if(del_node == parent->rlink){
|
|||
|
parent->rlink = del_node->llink;
|
|||
|
if(del_node->llink->rlink != NULL){ //<2F>Y<EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>l<EFBFBD>`<60>I<EFBFBD>٦<EFBFBD><D9A6>k<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>p
|
|||
|
student *child = del_node->llink->rlink;
|
|||
|
printf("%s\n",child->name);
|
|||
|
while(child->rlink!= NULL){ //<2F><><EFBFBD>k<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>̩<EFBFBD>
|
|||
|
child = child->rlink;
|
|||
|
printf("%s\n",child->name);
|
|||
|
}
|
|||
|
child->rlink = del_node->rlink;
|
|||
|
}else parent->rlink->rlink = del_node->rlink; //<2F>S<EFBFBD><53><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
}else{
|
|||
|
parent->llink = del_node->llink;
|
|||
|
if(del_node->rlink->llink != NULL){ //<2F>Y<EFBFBD>R<EFBFBD><52><EFBFBD><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD>l<EFBFBD>`<60>I<EFBFBD>٦<EFBFBD><D9A6><EFBFBD><EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>p
|
|||
|
student *child = del_node->rlink->llink;
|
|||
|
printf("%s\n",child->name);
|
|||
|
while(child->llink!= NULL){ //<2F>䥪<EFBFBD>`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>̩<EFBFBD>
|
|||
|
child = child->llink;
|
|||
|
printf("%s\n",child->name);
|
|||
|
}
|
|||
|
child->llink = del_node->llink;
|
|||
|
}else parent->llink->rlink = del_node->rlink; //<2F>S<EFBFBD><53><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
free(del_node); /* <20><><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD> */
|
|||
|
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n",name);
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD>X<EFBFBD><58><EFBFBD>ơA<C6A1>N<EFBFBD><4E><EFBFBD>ƿ<EFBFBD><C6BF>X<EFBFBD>ܿù<DCBF> */
|
|||
|
void show(void){
|
|||
|
/* <20>P<EFBFBD>_<EFBFBD>ڸ`<60>I<EFBFBD>O<EFBFBD>_<EFBFBD><5F>NULL */
|
|||
|
if (root == NULL) {
|
|||
|
puts("<EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>Ū<EFBFBD>!");
|
|||
|
return;
|
|||
|
}
|
|||
|
// printf("root<6F><74>%s\n", root->name);
|
|||
|
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>H<EFBFBD><48><EFBFBD>Ǫk<C7AA><6B><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD> */
|
|||
|
}
|
|||
|
|
|||
|
/* <20>H<EFBFBD><48><EFBFBD>Ǫk<C7AA><6B><EFBFBD>X<EFBFBD><58><EFBFBD>ơA<C6A1>Ļ<EFBFBD><C4BB>j<EFBFBD>覡 */
|
|||
|
void inorder(struct student *node ){
|
|||
|
if(node != NULL) {
|
|||
|
|
|||
|
inorder(node->llink);
|
|||
|
printf("%s<>G%d\n", node->name, node->score);
|
|||
|
inorder(node->rlink);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void find_newroot(){ /* <20>j<EFBFBD>M<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60>I <20><><EFBFBD>s<EFBFBD><73><EFBFBD>̤j<CCA4><6A>*/
|
|||
|
struct student *newroot_node ,*prev;
|
|||
|
|
|||
|
if(root->llink == NULL && root->rlink == NULL){
|
|||
|
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n",root->name);
|
|||
|
free(root);
|
|||
|
root = NULL;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if(root->llink!=NULL){ //<2F>䥪<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>̤j<CCA4><6A>
|
|||
|
newroot_node = root->llink;
|
|||
|
|
|||
|
while(newroot_node->rlink!=NULL){ //<2F><><EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD>N<EFBFBD>`<60>I
|
|||
|
prev = newroot_node;
|
|||
|
newroot_node = newroot_node->rlink;
|
|||
|
}
|
|||
|
if(newroot_node->llink!=NULL){ //<2F>Y<EFBFBD>s<EFBFBD><73><EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>`<60>I
|
|||
|
prev->rlink = newroot_node->llink;
|
|||
|
}else prev->rlink = NULL;
|
|||
|
|
|||
|
if(newroot_node != root->llink ){ //<2F>Y<EFBFBD>s<EFBFBD><73><EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쥻<EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD>`<60>I
|
|||
|
newroot_node->llink = root->llink;
|
|||
|
newroot_node->rlink = root->rlink;
|
|||
|
}else{ //<2F>Y<EFBFBD>s<EFBFBD><73><EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>쥻<EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD>`<60>I
|
|||
|
newroot_node->rlink = root->rlink;
|
|||
|
}
|
|||
|
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n",root->name);
|
|||
|
free(root);
|
|||
|
root = newroot_node;
|
|||
|
}else if(root->rlink!=NULL){ //<2F><><EFBFBD>k<EFBFBD>s<EFBFBD><73><EFBFBD><EFBFBD><EFBFBD>̤p<CCA4><70>
|
|||
|
newroot_node = root->rlink;
|
|||
|
|
|||
|
while(newroot_node->llink!=NULL){ //<2F><><EFBFBD>ڪ<EFBFBD><DAAA><EFBFBD><EFBFBD>N<EFBFBD>`<60>I
|
|||
|
prev = newroot_node;
|
|||
|
newroot_node = newroot_node->llink;
|
|||
|
}
|
|||
|
if(newroot_node->rlink!=NULL){ //<2F>Y<EFBFBD>s<EFBFBD><73><EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD>k<EFBFBD>`<60>I
|
|||
|
prev->llink = newroot_node->rlink;
|
|||
|
}else prev->llink = NULL;
|
|||
|
|
|||
|
if(newroot_node != root->rlink ){ //<2F>Y<EFBFBD>s<EFBFBD><73><EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쥻<EFBFBD>ڪ<EFBFBD><DAAA>k<EFBFBD>`<60>I
|
|||
|
newroot_node->llink = root->llink;
|
|||
|
newroot_node->rlink = root->rlink;
|
|||
|
}else{ //<2F>Y<EFBFBD>s<EFBFBD><73><EFBFBD>ڸ`<60>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>쥻<EFBFBD>ڪ<EFBFBD><DAAA>k<EFBFBD>`<60>I
|
|||
|
newroot_node->llink = root->llink;
|
|||
|
}
|
|||
|
printf("<EFBFBD>R<EFBFBD><EFBFBD>w[%s]<5D><><EFBFBD><EFBFBD>\n",root->name);
|
|||
|
free(root);
|
|||
|
root = newroot_node;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* <20>j<EFBFBD>Mtarget<65>Ҧb<D2A6>`<60>I */
|
|||
|
struct student *search(char target[]){
|
|||
|
struct student *node;
|
|||
|
node = root;
|
|||
|
while(node != NULL){
|
|||
|
if (strcmp(target, node->name) == 0)
|
|||
|
return node;
|
|||
|
else
|
|||
|
/* target<65>p<EFBFBD><70><EFBFBD>ثe<D8AB>`<60>I<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>M */
|
|||
|
if (strcmp(target, node->name) < 0)
|
|||
|
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>Mnode<64><65><EFBFBD><EFBFBD><EFBFBD>`<60>I */
|
|||
|
struct student *search_p(struct student *node){
|
|||
|
struct student *parent;
|
|||
|
parent = root;
|
|||
|
while (parent != NULL) {
|
|||
|
if (strcmp(node->name, parent->name) < 0) {
|
|||
|
if (strcmp(node->name, parent->llink->name) == 0)
|
|||
|
return parent;
|
|||
|
else
|
|||
|
parent = parent->llink;
|
|||
|
}else {
|
|||
|
if (strcmp(node->name, parent->rlink->name) == 0)
|
|||
|
return parent;
|
|||
|
else
|
|||
|
parent = parent->rlink;
|
|||
|
}
|
|||
|
}
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD>Ҧ<EFBFBD><D2A6>`<60>I<EFBFBD><49><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD> */
|
|||
|
void free_all_nodes(struct student *node) {
|
|||
|
if (node == NULL) return;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD>l<F1A5AAA4><6C>
|
|||
|
free_all_nodes(node->llink);
|
|||
|
// <20>A<EFBFBD><41><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>l<EFBFBD><6C>
|
|||
|
free_all_nodes(node->rlink);
|
|||
|
printf("<EFBFBD>R<EFBFBD><EFBFBD>'w[%s]=%d'<27>`<60>I\n",node->name,node->score);
|
|||
|
// <20>̫<EFBFBD><CCAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>`<60>I
|
|||
|
free(node);
|
|||
|
}
|