[Top Page][All Pages][Recent Changes]

Edit History:Diff

Changes of 低機能双方向連結リスト構造モジュール between Epoch and 2015/09/09 09:56:08 JST

  • + added lines
  • - deleted lines

Return to the edit history

+ #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 ダウンロード先(外部リンク)]