[トップ][一覧][最近の更新]

編集履歴:過去のバージョン

2015/09/09 09:56:20 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 ダウンロード先(外部リンク)]