自己参照構造体
作り方
構造体の中に構造体を含むことができます。
こんな感じにします。
使う
使うときはこうします。あまりにも意味が無い使い方ですが例ということで許してください。
#console
#include<vcrt71.sbp>
Type X
a As Long
b As Long
End Type
Type Y
i As Long
j As Long
k As X'これ
End Type
'構造体表示関数
Sub Prt(p As *Y)
printf(Ex"%d %d %d %d\n" , p->i , p->j , p->k.a , p->k.b)
End Sub
Dim t As Y
t.i = 1
t.j = 2
t.k.a = 3
t.k.b = 4
Prt(VarPtr(t))
a.b.c.dというように、.構造体をつないでいきます。
次に今回の表題である自己参照構造体について説明します。
構造体の中に、自分を指すポインタを持つものです。
'自己参照構造体
#console
#include<vcrt71.sbp>
Type Human
nam[20] As Byte '名前(全角10文字まで)
age As Long'年齢
nex As *Human '次の人のポインタ
End Type
'データセット関数
Sub SetDat(dat As *Human , nam As *Byte , age As Long ,pn As *Human)
strcpy(dat->nam , nam)
dat->age = age
dat->nex = pn
End Sub
'データ表示関数
Sub PrtDat(dat As *Human)
printf(Ex"名前:%s 年齢:%d\n" , dat->nam , dat->age)
End Sub
Dim hito[2] As Human'構造体配列
Dim n As Long
SetDat(VarPtr(hito[0]) , "大阪太郎" , 45 , VarPtr(hito[1]))
SetDat(VarPtr(hito[1]) , "山口次郎" , 40 , VarPtr(hito[2]))
SetDat(VarPtr(hito[2]) , "沖縄三郎" , 38 , VarPtr(hito[0]))
For n= 0 To 2
PrtDat(hito[n].nex)
Next
'こんなこともできます...
'この書き方は 1 2 0 1 2 を指します
PrtDat(hito[0].nex->nex->nex->nex->nex)
'---------------------------------------------------
'今度は構造体ポインタで同じことをします
Dim char As *Human
char = malloc(sizeof(Human) * 3)
SetDat(VarPtr(char[0]) , "大阪長女" , 95 , VarPtr(char[1]))
SetDat(VarPtr(char[1]) , "越前康介" , 765 , VarPtr(char[2]))
SetDat(VarPtr(char[2]) , "たぬきち" , 123 , VarPtr(char[0]))
For n= 0 To 2
PrtDat(char[n].nex)
Next
'mallocしたものはfreeします
free(char)
すみません、意味の無い上に長いプログラムになってしまいました。
まず、23行目のDim hito[2] As Humanで構造体の配列を宣言しました。これで、構造体を3つ宣言しています。
SetDat関数で、構造体にデータを入れています。ここで、構造体のポインタを渡しています。
4つ目の引数で、次の構造体のポインタを渡しています。
以上の例で、ココロで感じることはできると思います。
あとは、自分で似たようなプログラムをいっぱい作って、いっぱいバグってください。
そうしているうちにきっと、理解できるでしょう。
下手ですが、イメージです。
hito[0] hito[1] hito[2]
+---+---+---+ +---+---+---+ +---+---+---+
|nam|age|nex| -> |nam|age|nex| -> |nam|age|nex| -> hito[0]を指す
+---+---+---+ +---+---+---+ +---+---+---+