Revisão | edca4b5ad73bceb93241a4a518609f46f490d3f0 (tree) |
---|---|
Hora | 2017-09-01 23:26:17 |
Autor | dhrname <dhrname@user...> |
Commiter | dhrname |
New the ST_getFirstTree function
@@ -416,14 +416,15 @@ ST_Ordered_Pair *ST_eval() | ||
416 | 416 | } |
417 | 417 | |
418 | 418 | /*以下の連結リスト構造については数学の集合とラムダ計算と項書き換え系を参照のこと |
419 | + * モデル | |
419 | 420 | * ここでは、:=を定義とする |
420 | 421 | * 空集合 := {} |
421 | 422 | * 対、あるいはNo Ordered Pair := {a, b} |
422 | 423 | * 集合の性質として{a, b} = {b, a} |
423 | - * 順序対 あるいは、Ordered Pair := (a, b) | |
424 | - * (a, b) := { a, {a, b} } | |
425 | - * n項組 あるいは、n組、n-tupples := [a, b, c, ... ] | |
426 | - * [a, b, c] := (a, ( b, (c, {}) ) )*/ | |
424 | + * 順序対 あるいは、Ordered Pair := (a, b)とすると、 | |
425 | + * (a, b) := {a, {a, b}} | |
426 | + * n項組 あるいは、n組、n-tupples := [a, b, c, ... ]とすると、 | |
427 | + * [a, b, c] := (a, ( b, (c, {}) ) )で表せる*/ | |
427 | 428 | |
428 | 429 | /*ST_EMPTY |
429 | 430 | * 空リストを表現する構造体 |
@@ -431,7 +432,8 @@ ST_Ordered_Pair *ST_eval() | ||
431 | 432 | const ST_Ordered_Pair ST_EMPTY = { |
432 | 433 | 0.0, |
433 | 434 | NULL, |
434 | - 0 | |
435 | + 0, | |
436 | + NULL | |
435 | 437 | }; |
436 | 438 | |
437 | 439 | /*ST_isEmpty 関数 |
@@ -510,6 +512,7 @@ ST_Ordered_Pair *ST_pair (ST_First_Type n, ST_Ordered_Pair *p) { | ||
510 | 512 | s->first = n; |
511 | 513 | s->second = p; |
512 | 514 | s->lifepoint = 0; |
515 | + s->first_tree = &ST_EMPTY; | |
513 | 516 | if (!ST_isEmpty(p)) { |
514 | 517 | p->lifepoint++; |
515 | 518 | } |
@@ -542,7 +545,7 @@ ST_Ordered_Pair *ST_setChurchNumber (uint_fast32_t length, Ord2ST_Ordered_Pair f | ||
542 | 545 | } |
543 | 546 | |
544 | 547 | /*ST_getItem 関数 |
545 | - * 入力されたリストの最後からnum番目にある項目の値を取り出す(num >= 0)*/ | |
548 | + * 入力されたリストの最後からnum番目にある項目の最初の値を取り出す(num >= 0)*/ | |
546 | 549 | ST_First_Type ST_getItem (ST_Ordered_Pair *list, uint_fast32_t num) |
547 | 550 | { |
548 | 551 | return ST_first( ST_setChurchNumber(num, ST_second, list) ); |
@@ -584,3 +587,15 @@ ST_First_Type ST_pop (ST_Stack_List stack) | ||
584 | 587 | stackfree = NULL; |
585 | 588 | return value; |
586 | 589 | } |
590 | + | |
591 | +/*ST_getFirstTree 関数 | |
592 | + * 二分木の最初の枝を返す関数 | |
593 | + * first関数との違いは、数値型を返すか、ポインタ型を返すかの差*/ | |
594 | +ST_Ordered_Pair* ST_getFirstTree(ST_Ordered_Pair *list) | |
595 | +{ | |
596 | + if (ST_isEmpty(list)) { | |
597 | + return &ST_EMPTY; | |
598 | + } else { | |
599 | + return list->first_tree; | |
600 | + } | |
601 | +} |
@@ -35,11 +35,12 @@ typedef double ST_First_Type ; | ||
35 | 35 | |
36 | 36 | /*ST_OrderedPair 構造体 |
37 | 37 | * 順序対を作るための構造体 |
38 | - * ただし、属性fだけは操作として、next関数で使われる*/ | |
38 | + * タプルを用いて、連結リストや二分木を作るため、順序対の考え方を導入する*/ | |
39 | 39 | struct ST_OrderedPair { |
40 | 40 | ST_First_Type first; /*対となる一番目*/ |
41 | 41 | ST_Ordered_Pair *second; /*対となる二番目*/ |
42 | 42 | int32_t lifepoint; /*参照カウンタ*/ |
43 | + ST_Ordered_Pair *first_tree; /*対となる一番目(ただし、二分木で使う)*/ | |
43 | 44 | }; |
44 | 45 | |
45 | 46 | /*ST_EMPTY |
@@ -114,6 +115,10 @@ ST_Stack_List ST_push (ST_First_Type value, ST_Stack_List stack); | ||
114 | 115 | * スタックからは取り除かれる*/ |
115 | 116 | ST_First_Type ST_pop (ST_Stack_List stack); |
116 | 117 | |
118 | +/*ST_getFirstTree 関数 | |
119 | + * 二分木の最初の枝を返す関数*/ | |
120 | +ST_Ordered_Pair* ST_getFirstTree(ST_Ordered_Pair*); | |
121 | + | |
117 | 122 | /*トークン化したときの識別用のマジックナンバー*/ |
118 | 123 | typedef enum { |
119 | 124 | ST_UNKNOWN_TOKEN = 0, /*未知のトークン*/ |
@@ -328,7 +328,7 @@ int main(int argc, char **argv) | ||
328 | 328 | assert(tokens[2] == 0); |
329 | 329 | elapsed = clock() - before; |
330 | 330 | printf("Time is %.3f seconds\n", elapsed/CLOCKS_PER_SEC); |
331 | - | |
331 | + | |
332 | 332 | assert(ST_isEmpty(&ST_EMPTY)); |
333 | 333 | ST_Ordered_Pair alist= {FP_NAN, NULL, 0}; |
334 | 334 | ST_Ordered_Pair blist = {0.0, NULL, 0}; |
@@ -394,6 +394,15 @@ int main(int argc, char **argv) | ||
394 | 394 | ST_freelist(*stack); |
395 | 395 | ST_freelist(ppp); |
396 | 396 | |
397 | + ST_Ordered_Pair dlist= {FP_NAN, NULL, 0, &ST_EMPTY}; | |
398 | + ST_Ordered_Pair elist = {0.0, NULL, 0, &dlist}; | |
399 | + ST_Ordered_Pair flist = {1.0, &elist, 0, &elist}; | |
400 | + assert(ST_isEmpty(ST_getFirstTree(&ST_EMPTY))); | |
401 | + assert(ST_getFirstTree(&dlist) == &ST_EMPTY); | |
402 | + assert(ST_getFirstTree(&elist) == &dlist); | |
403 | + assert(ST_getFirstTree(&flist) == &elist); | |
404 | + | |
405 | + errno = 0; | |
397 | 406 | eprint_log("Error!\n"); |
398 | 407 | eprint_log("Error!\n"); |
399 | 408 | eprint_log(""); |