Revisão | dbe36897620a065742219efa4aac94b0f3608c5f (tree) |
---|---|
Hora | 2017-09-02 22:36:26 |
Autor | dhrname <dhrname@user...> |
Commiter | dhrname |
New the ST_isLeaf function
@@ -439,13 +439,19 @@ const ST_Ordered_Pair ST_EMPTY = { | ||
439 | 439 | /*ST_isEmpty 関数 |
440 | 440 | * 引数のlistがST_EMPTYかどうかをチェックするときに使う。ST_EMPTYならばtrue( = 1) |
441 | 441 | * NULLは不具合が起きるので、入力すればエラー*/ |
442 | -bool ST_isEmpty (ST_Ordered_Pair *list) { | |
443 | - if (list == NULL) { | |
442 | +bool ST_isEmpty (ST_Ordered_Pair *list) | |
443 | +{ | |
444 | + if (list == NULL) | |
445 | + { | |
444 | 446 | eprintf("NULL argument error on the function ST_isEmpty"); |
445 | 447 | return false; |
446 | - } else if (list == &ST_EMPTY) { | |
448 | + } | |
449 | + else if (list == &ST_EMPTY) | |
450 | + { | |
447 | 451 | return true; |
448 | - } else { | |
452 | + } | |
453 | + else | |
454 | + { | |
449 | 455 | return false; |
450 | 456 | } |
451 | 457 | } |
@@ -453,10 +459,13 @@ bool ST_isEmpty (ST_Ordered_Pair *list) { | ||
453 | 459 | /*ST_first 関数 |
454 | 460 | * 順序対の一番目を返す |
455 | 461 | * ST_pair関数で指定された第一引数(例えば、ST_pair(a,b)ならばa)を返す)*/ |
456 | -ST_First_Type ST_first (ST_Ordered_Pair *list) { | |
457 | - if (ST_isEmpty(list)) { | |
462 | +ST_First_Type ST_first (ST_Ordered_Pair *list) | |
463 | +{ | |
464 | + if (ST_isEmpty(list)) | |
465 | + { | |
458 | 466 | return 0.0; |
459 | - } else { | |
467 | + } else | |
468 | + { | |
460 | 469 | return list->first; |
461 | 470 | } |
462 | 471 | } |
@@ -464,21 +473,27 @@ ST_First_Type ST_first (ST_Ordered_Pair *list) { | ||
464 | 473 | /*ST_second 関数 |
465 | 474 | * 順序対の二番目を返す |
466 | 475 | * ST_pair関数で指定された第二引数(例えば、ST_pair(a,b)ならばb)を返す)*/ |
467 | -ST_Ordered_Pair *ST_second (ST_Ordered_Pair *list) { | |
468 | - if ( ST_isEmpty(list) || (list->second == NULL) ){ | |
476 | +ST_Ordered_Pair *ST_second (ST_Ordered_Pair *list) | |
477 | +{ | |
478 | + if ( ST_isEmpty(list) || (list->second == NULL) ) | |
479 | + { | |
469 | 480 | /*ペアの二番目を取得できない場合は、自分自身を返す*/ |
470 | 481 | return list; |
471 | - } else { | |
482 | + } | |
483 | + else | |
484 | + { | |
472 | 485 | return list->second; |
473 | 486 | } |
474 | 487 | } |
475 | 488 | |
476 | 489 | /*メモリ割り当てを呼び出す関数 |
477 | 490 | * 引数nはメモリのサイズ*/ |
478 | -void *ST_emalloc(size_t n) { | |
491 | +void *ST_emalloc(size_t n) | |
492 | +{ | |
479 | 493 | void *p; |
480 | 494 | p = calloc(1, n); |
481 | - if (p == NULL) { | |
495 | + if (p == NULL) | |
496 | + { | |
482 | 497 | eprintf("%u bytes failed on the function ST_emalloc", n); |
483 | 498 | } |
484 | 499 | return p; |
@@ -487,17 +502,23 @@ void *ST_emalloc(size_t n) { | ||
487 | 502 | /*ST_freelist関数 |
488 | 503 | * 引数のlistを解放させる |
489 | 504 | * 他から参照されていない限り、ST_EMPTY以外のリストすべてが対象*/ |
490 | -void ST_freelist (ST_Ordered_Pair *list) { | |
505 | +void ST_freelist (ST_Ordered_Pair *list) | |
506 | +{ | |
491 | 507 | ST_Ordered_Pair *next; |
492 | - for (;!ST_isEmpty(list) || (list->lifepoint >= 1);list = next) { | |
508 | + for (;!ST_isEmpty(list) || (list->lifepoint >= 1);list = next) | |
509 | + { | |
493 | 510 | next = ST_second(list); |
494 | - if (list == next) { | |
511 | + if (list == next) | |
512 | + { | |
495 | 513 | break; |
496 | - } else { | |
514 | + } | |
515 | + else | |
516 | + { | |
497 | 517 | free(list); |
498 | 518 | list = NULL; |
499 | 519 | } |
500 | - if (!ST_isEmpty(next)) { | |
520 | + if (!ST_isEmpty(next)) | |
521 | + { | |
501 | 522 | /*すでに死んだため参照カウンタを減らす*/ |
502 | 523 | next->lifepoint--; |
503 | 524 | } |
@@ -506,14 +527,16 @@ void ST_freelist (ST_Ordered_Pair *list) { | ||
506 | 527 | |
507 | 528 | /*ST_pair関数 |
508 | 529 | * 第一引数と第二引数とで順序対を作る*/ |
509 | -ST_Ordered_Pair *ST_pair (ST_First_Type n, ST_Ordered_Pair *p) { | |
530 | +ST_Ordered_Pair *ST_pair (ST_First_Type n, ST_Ordered_Pair *p) | |
531 | +{ | |
510 | 532 | ST_Ordered_Pair *s; |
511 | 533 | s = (ST_Ordered_Pair *) ST_emalloc(sizeof(ST_Ordered_Pair)); |
512 | 534 | s->first = n; |
513 | 535 | s->second = p; |
514 | 536 | s->lifepoint = 0; |
515 | 537 | s->first_tree = &ST_EMPTY; |
516 | - if (!ST_isEmpty(p)) { | |
538 | + if (!ST_isEmpty(p)) | |
539 | + { | |
517 | 540 | p->lifepoint++; |
518 | 541 | } |
519 | 542 | return s; |
@@ -522,9 +545,12 @@ ST_Ordered_Pair *ST_pair (ST_First_Type n, ST_Ordered_Pair *p) { | ||
522 | 545 | /*ST_getNumber関数 |
523 | 546 | * リストの項目に、関数fで指定された条件式を満たすものが一つでもあれば、その初めに満たす項目が何番目(n > 0)かを返す |
524 | 547 | * なければ、0*/ |
525 | -int_fast32_t ST_getNumber (ST_Ordered_Pair *list, Ord2bool_t f) { | |
526 | - for(int_fast32_t i = 1; !ST_isEmpty(list); list = ST_second(list)) { | |
527 | - if (f(list)) { | |
548 | +int_fast32_t ST_getNumber (ST_Ordered_Pair *list, Ord2bool_t f) | |
549 | +{ | |
550 | + for(int_fast32_t i = 1; !ST_isEmpty(list); list = ST_second(list)) | |
551 | + { | |
552 | + if (f(list)) | |
553 | + { | |
528 | 554 | return i; |
529 | 555 | } |
530 | 556 | ++i; |
@@ -537,7 +563,8 @@ int_fast32_t ST_getNumber (ST_Ordered_Pair *list, Ord2bool_t f) { | ||
537 | 563 | ST_Ordered_Pair *ST_setChurchNumber (uint_fast32_t length, Ord2ST_Ordered_Pair f, ST_Ordered_Pair *list) |
538 | 564 | { |
539 | 565 | int32_t i; |
540 | - for (i = 0; i < length; i++) { | |
566 | + for (i = 0; i < length; i++) | |
567 | + { | |
541 | 568 | /*lengthが4の場合、list = f(f(f(f(list))));*/ |
542 | 569 | list = (*f)(list); |
543 | 570 | } |
@@ -591,11 +618,35 @@ ST_First_Type ST_pop (ST_Stack_List stack) | ||
591 | 618 | /*ST_getFirstTree 関数 |
592 | 619 | * 二分木の最初の枝を返す関数 |
593 | 620 | * first関数との違いは、数値型を返すか、ポインタ型を返すかの差*/ |
594 | -ST_Ordered_Pair* ST_getFirstTree(ST_Ordered_Pair *list) | |
621 | +ST_Binary_Tree ST_getFirstTree(ST_Binary_Tree node) | |
595 | 622 | { |
596 | - if (ST_isEmpty(list)) { | |
623 | + if (ST_isEmpty(node)) | |
624 | + { | |
597 | 625 | return &ST_EMPTY; |
598 | - } else { | |
599 | - return list->first_tree; | |
600 | 626 | } |
627 | + else | |
628 | + { | |
629 | + return node->first_tree; | |
630 | + } | |
631 | +} | |
632 | + | |
633 | +/*ST_isLeaf 関数 | |
634 | + * 与えられたノードが葉であるかどうかを調べる関数 | |
635 | + * 葉であれば、true、枝であれば、false*/ | |
636 | +bool ST_isLeaf(ST_Binary_Tree node) | |
637 | +{ | |
638 | + /*ノードが葉であるためには、一番目の枝がない(first_treeメンバがST_Emptyである)ことが必要 | |
639 | + * なお、二番目の枝は参考にしない*/ | |
640 | + return ST_isEmpty(ST_getFirstTree(node)); | |
641 | +} | |
642 | + | |
643 | +/*ST_getSecondTree 関数 | |
644 | + * 二分木の右の枝を返す関数*/ | |
645 | +ST_Binary_Tree ST_getSecondTree(ST_Binary_Tree node) | |
646 | +{ | |
647 | + if (ST_isLeaf(node)) | |
648 | + { | |
649 | + /*葉であるならば、右の枝はST_EMPTYと考える*/ | |
650 | + } | |
651 | + return node; | |
601 | 652 | } |
@@ -115,9 +115,24 @@ ST_Stack_List ST_push (ST_First_Type value, ST_Stack_List stack); | ||
115 | 115 | * スタックからは取り除かれる*/ |
116 | 116 | ST_First_Type ST_pop (ST_Stack_List stack); |
117 | 117 | |
118 | +/*以下では、二分木(binary tree)を順序対を使って、実装する | |
119 | + * ただし、ノードが枝の時は、ST_First_Type型の値を、 | |
120 | + * ノードが葉(leaf)の時は、ST_Ordered_Pair型の値を保持するようにする | |
121 | + * こうすることで、連結リストを値として扱う*/ | |
122 | +typedef ST_Ordered_Pair* ST_Binary_Tree; | |
123 | + | |
118 | 124 | /*ST_getFirstTree 関数 |
119 | - * 二分木の最初の枝を返す関数*/ | |
120 | -ST_Ordered_Pair* ST_getFirstTree(ST_Ordered_Pair*); | |
125 | + * 二分木の左の枝を返す関数*/ | |
126 | +ST_Binary_Tree ST_getFirstTree(ST_Binary_Tree); | |
127 | + | |
128 | +/*ST_isLeaf 関数 | |
129 | + * 与えられたノードが葉であるかどうかを調べる関数 | |
130 | + * 葉であれば、true、枝であれば、false*/ | |
131 | +bool ST_isLeaf(ST_Binary_Tree); | |
132 | + | |
133 | +/*ST_getSecondTree 関数 | |
134 | + * 二分木の右の枝を返す関数*/ | |
135 | +ST_Binary_Tree ST_getSecondTree(ST_Binary_Tree); | |
121 | 136 | |
122 | 137 | /*トークン化したときの識別用のマジックナンバー*/ |
123 | 138 | typedef enum { |
@@ -401,6 +401,12 @@ int main(int argc, char **argv) | ||
401 | 401 | assert(ST_getFirstTree(&dlist) == &ST_EMPTY); |
402 | 402 | assert(ST_getFirstTree(&elist) == &dlist); |
403 | 403 | assert(ST_getFirstTree(&flist) == &elist); |
404 | + ST_Binary_Tree btree= &dlist; | |
405 | + assert(ST_isEmpty(ST_getFirstTree(btree))); | |
406 | + assert(ST_isLeaf(btree)); | |
407 | + assert(!ST_isLeaf(&elist)); | |
408 | + assert(!ST_isLeaf(&flist)); | |
409 | + assert(ST_isLeaf(&ST_EMPTY)); | |
404 | 410 | |
405 | 411 | errno = 0; |
406 | 412 | eprint_log("Error!\n"); |