More ... | 編集履歴:過去のバージョン2015/09/09 09:56:30 JST時点での低機能双方向連結リスト構造モジュールの内容低機能双方向連結リスト構造モジュール {{ #module /* |-----|-----|-----|-----|-----|-----| 整数だけのリスト構造を使用するためのモジュール |-----|-----|-----|-----|-----|-----| 動作速度は重視していません 変数名はいいのが思い浮かばなかったためテキトウです 整数のみの対応です |-----|-----|-----|-----|-----|-----| データ構造 : 双方向連結リスト形式 要素の先頭から順に 後方へのポインタ - 4バイト(POINTERSIZE) データ本体(整数のみ) - 4バイト(DATASIZE) 前方へのポインタ - 4バイト(POINTERSIZE) 合計で12バイト(POINTERSIZE*2+DATASIZE) また0番目の要素の前方へのポインタ及び末尾の要素の後方へのポインタには0が代入されています |-----|-----|-----|-----|-----|-----| 新規要素の挿入および後方への追加およびリスト構造の新規作成 addlist p1,p2 p1=ポインタ p2=-1~(0) : 何番目の後に追加するか statに新たしくつくられた要素の先頭アドレスが返されます p2<-1の場合は0が返されます エラーが発生した場合は0が返されます p2に1を代入した場合要素1と要素2の間に要素がつくられ元要素2は要素3になります p2に-1または存在しない要素の番号を代入した場合は末尾の後ろにつくられます |-----|-----|-----|-----|-----|-----| 要素の削除およびリスト構造の一括削除 dellist p1,p2 p1=ポインタ : リストの先頭ポインタ p2=-1~(0) : 何番目を削除するか statに削除された要素の前方の要素のアドレスが返されます (0番目を削除した場合にそのリスト構造の0番目となる要素のアドレスを取得する場合などに使えます) (0番目を削除した場合に0が返った場合はそのリストの要素はすべて解放されたということです) p1<=0またはp2<0の場合0が返されます p2に存在しない要素の番号を指定した場合末尾の要素が削除されます p2に-1を代入した場合ポインタが間違っていなければ1が返されまたそのポインタの示すリストの要素はすべて削除されます(リスト構造の一括削除) |-----|-----|-----|-----|-----|-----| リスト構造に含まれる要素の個数取得および既に削除されたリストかの確認および各要素のアドレス取得 getlistaddres p1,p2 p1=ポインタ : リストの先頭ポインタ p2=-1~(0) : 何番目の要素の先頭アドレスを返すか statに指定された番号の要素の先頭アドレスが入ります(p2=-1の場合は何番目までの要素があるかが返されます) p1<=0またはp2<-1の場合0が返されます p2に-1を代入した場合アドレスではなく要素の個数が返されます(0の場合そのリストはすでにすべて解放されています) p2に存在しない要素の番号を指定した場合0が返されます |-----|-----|-----|-----|-----|-----| リスト構造からのデータ取り出し(整数のみ) getvalue(p1,p2) p1=ポインタ : リストの先頭ポインタ p2=0~(0) : 何番目の要素のデータを返すか p1<=0またはp2<0の場合0が返されます p2に存在しない要素の番号を指定した場合0が返されます |-----|-----|-----|-----|-----|-----| リスト構造へのデータ書き込み(整数のみ) setvalue p1,p2 p1=ポインタ : リストの先頭ポインタ p2=0~(0) : 何番目の要素に書き込むか p3=0~(0) : 書き込むデータ 成功した場合statに1が返されます p1<=0またはp2<0の場合0が返されます p2に存在しない要素の番号を指定した場合0が返されます |-----|-----|-----|-----|-----|-----| */ //64ビットに移行した際の調整用 #define POINTERSIZE 4 //ポインタ部のサイズ #define DATASIZE 4 //データ部のサイズ #define PTRTYPE vartype("int") //ポインタ型 #define DATATYPE vartype("int") //データ型 #define ctype MAEP(%1) (%1+DATASIZE+POINTERSIZE) #define ctype USHIROP(%1) %1 #define ctype DATAP(%1) (%1+POINTERSIZE) #define GPTR $40//0で初期化された固定メモリ #uselib "kernel32.dll" #cfunc GlobalAlloc "GlobalAlloc" int,int #func GlobalFree "GlobalFree" int #cfunc GlobalSize "GlobalSize" int//すでにGlobalAllocで確保したメモリかどうかの判定に #deffunc addlist int p1, int p6, local pointer1 , local tmp4, local addforw, local addbakwr, local pointer3 if p6<-1 : return 0 if p1<=0{//リスト新規作成 pointer1=GlobalAlloc(GPTR,POINTERSIZE*2+DATASIZE) return pointer1 } if GlobalSize(p1)==0 : return 0 pointer1=GlobalAlloc(GPTR,POINTERSIZE*2+DATASIZE) if pointer1==0 : return 0 tmp4=p6 if p6==-1{ getlistaddres p1,-1//末尾の番号を取得 tmp4=stat-1 } getlistaddres p1,tmp4 pointer3=stat if pointer3<=0{ getlistaddres p1,-1//末尾の番号を取得 getlistaddres p1,stat-1 pointer3=stat } dupptr tmp4,MAEP(pointer3),POINTERSIZE,PTRTYPE//前方のアドレス取得 addforw=tmp4 /*dupptr tmp4,USHIROP(pointer3),POINTERSIZE,PTRTYPE//後方のアドレス取得 addbakwr=tmp4*/ if addforw>0{//前方要素に後方要素を結びつける処理 dupptr tmp4,USHIROP(addforw),POINTERSIZE,PTRTYPE tmp4=pointer1 } dupptr tmp4,MAEP(pointer1),POINTERSIZE,PTRTYPE//新たにつくられた要素に次の要素のアドレスを教えておく tmp4=addforw dupptr tmp4,MAEP(pointer3),POINTERSIZE,PTRTYPE tmp4=pointer1 dupptr tmp4,USHIROP(pointer1),POINTERSIZE,PTRTYPE//新たにつくられた要素に前の要素のアドレスを教えておく tmp4=p1 /*if addbakwr>0{//後方要素に前方要素を結びつける処理 dupptr tmp4,MAEP(addbakwr),POINTERSIZE,PTRTYPE tmp4=pointer1 }*/ return pointer1 #deffunc dellist int p2, int p3, local tmp1, local delforw, local delbakwr, local pointer2 if p2<=0 | p3<-1 : return 0 if GlobalSize(p2)==0 : return 0 if p3==-1{ pointer2=p2 repeat dellist pointer2,0 pointer2=stat if pointer2<=0:break loop return 1 } getlistaddres p2,p3//指定された番号の要素の先頭アドレス取得 pointer2=stat if pointer2<=0{//指定された番号の要素が見つからなかった場合末尾の要素のアドレスを代入する getlistaddres p2,-1 getlistaddres p2,stat-1 pointer2=stat } if pointer2<=0:return 0 dupptr tmp1,USHIROP(pointer2),POINTERSIZE,PTRTYPE//後方のアドレス取得 delbakwr=tmp1 dupptr tmp1,MAEP(pointer2),POINTERSIZE,PTRTYPE//前方のアドレス取得 delforw=tmp1 if delbakwr>0{//後方要素に前方要素を結びつける処理 dupptr tmp1,MAEP(delbakwr),POINTERSIZE,PTRTYPE tmp1=delforw } if delforw>0{//前方要素に後方要素を結びつける処理 dupptr tmp1,USHIROP(delforw),POINTERSIZE,PTRTYPE tmp1=delbakwr } GlobalFree pointer2 return delforw//delbakwr #deffunc getlistaddres int p4, int p5 , local tmp2, local tmp3, local counter1 if p4<=0 | p5<-1 :return 0 tmp3=p4 counter1=0 if GlobalSize(p4)==0 : return 0 while p5==-1 | counter1<p5//リストをたどっていく dupptr tmp2,MAEP(tmp3),POINTERSIZE,PTRTYPE //mes "a"+tmp2+" "+p5 if tmp2==0: _break tmp3=tmp2 counter1++ wend if p5==-1 : return counter1+1 if counter1<p5 : tmp3=0//指定した番号の要素が存在しなかったとき return tmp3 #defcfunc getvalue int p6, int p7, local tmp5, local pointer4 if p6<=0 | p7<0 :return 0 if GlobalSize(p6)==0 :return 0 getlistaddres p6,p7 pointer4=stat if pointer4<=0 :return 0 if GlobalSize(pointer4)==0 :return 0 dupptr tmp5,DATAP(pointer4),DATASIZE,DATATYPE return tmp5 #deffunc setvalue int p8, int p9, int p10, local tmp6, local pointer5 if p8<=0 | p9<0 :return 0 if GlobalSize(p8)==0 :return 0 getlistaddres p8,p9 pointer5=stat if pointer5<=0 :return 0 if GlobalSize(pointer5)==0 :return 0 dupptr tmp6,DATAP(pointer5),DATASIZE,DATATYPE tmp6=p10 return 1 #global #uselib "kernel32.dll" #cfunc GlobalSize "GlobalSize" sptr addlist 0,0 a=stat getlistaddres a,-1 mes "長さ"+stat addlist a,-1 mes stat getlistaddres a,-1 mes "長さ"+stat addlist a,1 mes stat getlistaddres a,-1 mes "長さ"+stat dupptr b,a+8,4 mes "アドレス"+a+" "+b setvalue a,1,100 mes stat mes "1番目="+getvalue(a,1) dellist a,1 mes stat mes "1番目="+getvalue(a,1) getlistaddres a,-1 mes "長さ"+stat dellist a,-1//全削除 mes stat //GlobalSizeで既にGlobalAllocで確保したメモリかどうかは判別してのエラー処理の確認 getlistaddres a,-1 mes "長さ"+stat dellist a,1 mes stat getlistaddres a,-1 mes "長さ"+stat mes GlobalSize(a) dellist a,0 mes stat mes a mes GlobalSize(a) getlistaddres a,-1 mes "長さ"+stat mes getvalue(a,0) }}} [https://aa38020e42f53ca54e166915354734af1f102cbd.googledrive.com/host/0B9vewWZYDiXefmNjRWZCb1FrUmpab3o2dk5nTXRkRFdGTXFqTWZjNExVTm41OHUwWFdRUG8/apps/liststrr.txt ダウンロード先(外部リンク)] |