• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revisãodbe36897620a065742219efa4aac94b0f3608c5f (tree)
Hora2017-09-02 22:36:26
Autordhrname <dhrname@user...>
Commiterdhrname

Mensagem de Log

New the ST_isLeaf function

Mudança Sumário

Diff

--- a/source_code/shadowstar.c
+++ b/source_code/shadowstar.c
@@ -439,13 +439,19 @@ const ST_Ordered_Pair ST_EMPTY = {
439439 /*ST_isEmpty 関数
440440 * 引数のlistがST_EMPTYかどうかをチェックするときに使う。ST_EMPTYならばtrue( = 1)
441441 * 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+ {
444446 eprintf("NULL argument error on the function ST_isEmpty");
445447 return false;
446- } else if (list == &ST_EMPTY) {
448+ }
449+ else if (list == &ST_EMPTY)
450+ {
447451 return true;
448- } else {
452+ }
453+ else
454+ {
449455 return false;
450456 }
451457 }
@@ -453,10 +459,13 @@ bool ST_isEmpty (ST_Ordered_Pair *list) {
453459 /*ST_first 関数
454460 * 順序対の一番目を返す
455461 * 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+ {
458466 return 0.0;
459- } else {
467+ } else
468+ {
460469 return list->first;
461470 }
462471 }
@@ -464,21 +473,27 @@ ST_First_Type ST_first (ST_Ordered_Pair *list) {
464473 /*ST_second 関数
465474 * 順序対の二番目を返す
466475 * 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+ {
469480 /*ペアの二番目を取得できない場合は、自分自身を返す*/
470481 return list;
471- } else {
482+ }
483+ else
484+ {
472485 return list->second;
473486 }
474487 }
475488
476489 /*メモリ割り当てを呼び出す関数
477490 * 引数nはメモリのサイズ*/
478-void *ST_emalloc(size_t n) {
491+void *ST_emalloc(size_t n)
492+{
479493 void *p;
480494 p = calloc(1, n);
481- if (p == NULL) {
495+ if (p == NULL)
496+ {
482497 eprintf("%u bytes failed on the function ST_emalloc", n);
483498 }
484499 return p;
@@ -487,17 +502,23 @@ void *ST_emalloc(size_t n) {
487502 /*ST_freelist関数
488503 * 引数のlistを解放させる
489504 * 他から参照されていない限り、ST_EMPTY以外のリストすべてが対象*/
490-void ST_freelist (ST_Ordered_Pair *list) {
505+void ST_freelist (ST_Ordered_Pair *list)
506+{
491507 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+ {
493510 next = ST_second(list);
494- if (list == next) {
511+ if (list == next)
512+ {
495513 break;
496- } else {
514+ }
515+ else
516+ {
497517 free(list);
498518 list = NULL;
499519 }
500- if (!ST_isEmpty(next)) {
520+ if (!ST_isEmpty(next))
521+ {
501522 /*すでに死んだため参照カウンタを減らす*/
502523 next->lifepoint--;
503524 }
@@ -506,14 +527,16 @@ void ST_freelist (ST_Ordered_Pair *list) {
506527
507528 /*ST_pair関数
508529 * 第一引数と第二引数とで順序対を作る*/
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+{
510532 ST_Ordered_Pair *s;
511533 s = (ST_Ordered_Pair *) ST_emalloc(sizeof(ST_Ordered_Pair));
512534 s->first = n;
513535 s->second = p;
514536 s->lifepoint = 0;
515537 s->first_tree = &ST_EMPTY;
516- if (!ST_isEmpty(p)) {
538+ if (!ST_isEmpty(p))
539+ {
517540 p->lifepoint++;
518541 }
519542 return s;
@@ -522,9 +545,12 @@ ST_Ordered_Pair *ST_pair (ST_First_Type n, ST_Ordered_Pair *p) {
522545 /*ST_getNumber関数
523546 * リストの項目に、関数fで指定された条件式を満たすものが一つでもあれば、その初めに満たす項目が何番目(n > 0)かを返す
524547 * なければ、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+ {
528554 return i;
529555 }
530556 ++i;
@@ -537,7 +563,8 @@ int_fast32_t ST_getNumber (ST_Ordered_Pair *list, Ord2bool_t f) {
537563 ST_Ordered_Pair *ST_setChurchNumber (uint_fast32_t length, Ord2ST_Ordered_Pair f, ST_Ordered_Pair *list)
538564 {
539565 int32_t i;
540- for (i = 0; i < length; i++) {
566+ for (i = 0; i < length; i++)
567+ {
541568 /*lengthが4の場合、list = f(f(f(f(list))));*/
542569 list = (*f)(list);
543570 }
@@ -591,11 +618,35 @@ ST_First_Type ST_pop (ST_Stack_List stack)
591618 /*ST_getFirstTree 関数
592619 * 二分木の最初の枝を返す関数
593620 * first関数との違いは、数値型を返すか、ポインタ型を返すかの差*/
594-ST_Ordered_Pair* ST_getFirstTree(ST_Ordered_Pair *list)
621+ST_Binary_Tree ST_getFirstTree(ST_Binary_Tree node)
595622 {
596- if (ST_isEmpty(list)) {
623+ if (ST_isEmpty(node))
624+ {
597625 return &ST_EMPTY;
598- } else {
599- return list->first_tree;
600626 }
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;
601652 }
Binary files a/source_code/shadowstar.o and b/source_code/shadowstar.o differ
--- a/source_code/star.h
+++ b/source_code/star.h
@@ -115,9 +115,24 @@ ST_Stack_List ST_push (ST_First_Type value, ST_Stack_List stack);
115115 * スタックからは取り除かれる*/
116116 ST_First_Type ST_pop (ST_Stack_List stack);
117117
118+/*以下では、二分木(binary tree)を順序対を使って、実装する
119+ * ただし、ノードが枝の時は、ST_First_Type型の値を、
120+ * ノードが葉(leaf)の時は、ST_Ordered_Pair型の値を保持するようにする
121+ * こうすることで、連結リストを値として扱う*/
122+typedef ST_Ordered_Pair* ST_Binary_Tree;
123+
118124 /*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);
121136
122137 /*トークン化したときの識別用のマジックナンバー*/
123138 typedef enum {
--- a/source_code/startest.c
+++ b/source_code/startest.c
@@ -401,6 +401,12 @@ int main(int argc, char **argv)
401401 assert(ST_getFirstTree(&dlist) == &ST_EMPTY);
402402 assert(ST_getFirstTree(&elist) == &dlist);
403403 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));
404410
405411 errno = 0;
406412 eprint_log("Error!\n");
Binary files a/source_code/startest.o and b/source_code/startest.o differ