@comment $OpenXM: OpenXM/src/asir-doc/int-parts/datatype/list.texi,v 1.1 2001/04/23 05:45:36 noro Exp $ @section List @example typedef struct oNODE @{ list を表すための node pointer body; node の内容 struct oNODE *next; 次への pointer @} *NODE; typedef struct oLIST @{ Risa list object short id; 識別子 (=O_LIST) short pad; struct oNODE *body; list 本体 @} *LIST; @end example @noindent list 構造は engine 内部において多用される. 前述の @code{DCP}, @code{VL} などは用途が特殊化されたものであるが, 一般には @code{NODE} が用いられ る. @code{LIST} は Risa object としての list である. この場合, list 本体 の各 node の body は Risa object を指している必要がある. @subsection リストの生成 @example #include "ca.h" MKNODE(n,b,nn) (macro; NODE n,nn; pointer b) body = b, next = nn なる NODE n を生成する. MKLIST(a,b) (macro; NODE b; LIST a) body=b なる LIST a を生成する. NEXTNODE(r,c) (macro; NODE r,c) r を node の先頭とし, c を node の末尾とするとき, 末尾に空の node を追加し, c をその空 node を指すようにする. r が 0 のとき, 空 node が生成され, r および c はその node を指す. @end example @code{MKNODE} は node の先頭にデータを追加していくときに 用いる. 逆に, node の末尾にデータを追加していくには @code{NEXTNODE} を 用いる. @example NODE r, c; for ( r = 0; ...; ... ) @{ NEXTNODE(r,c); c->body = ...; @} if ( r ) c->next = 0; @end example これにより, list の末尾にデータを追加しながら list を伸ばすことができる.