hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
ラボ/片方向リンクリスト - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

ラボ

片方向リンクリスト

新しい片方向リンクリスト

newmodを使ってデータ構造のインスタンスを複数作成可能な片方向リンクリストです。

データ構造

実装例

fileMSLinkedList.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
|
!
-
|
!
 
 
 
 
 
 
 
 
 
-
|
-
|
!
 
 
 
 
 
//
// モジュール変数を使った複数インスタンス作成可能な片方向リンクリスト(昇順)
// より柔軟な片方向リンクリストにするには降順パラメータなどを追加したり、
// 重複を許したりなど...
// いろいろ手を加えてバリエーションを増やせます
//
#module "MSingleLinkedList" m_max, m_cur, m_head, m_entry, m_data, m_next, m_count
 
#define _NULL -1
#define _FREE 0
#define _USED 1
#define ALLOC_CNT 10; 自動拡張をあからさまに分かるように拡張サイズを少なくしています。通常は64(*4byte)〜が手頃。
 
#modinit
    m_max = ALLOC_CNT
    m_cur = 0
 
    dim m_entry, m_max
    dim m_data,  m_max
    dim m_next,  m_max
    dim m_count, m_max
 
    m_head = m_cur
    m_entry(m_head) = _USED
    m_next(m_head) = _NULL
 
    return
 
; 未使用のセルのインデックスを返す
#modfunc SLL_GetEntry
    flag = 0
 
    repeat m_max
        m_cur++
        if( m_cur >= m_max ): m_cur = 0
        if( m_entry(m_cur) == _FREE ): flag = 1: break
    loop
 
    if( flag ): return m_cur
 
    m_cur = m_max
    m_max += ALLOC_CNT
 
    // データの自動拡張
    m_entry(m_max-1) = _FREE
    m_data(m_max-1)  = _FREE
    m_next(m_max-1)  = _FREE
    m_count(m_max-1) = _FREE
    
    return m_cur
 
; リスト内の指定した値のセルを探す
#modfunc SLL_Search int x, var l
    p = m_next(m_head)
    q = m_head
 
    flag = 0
    repeat
        if( p == _NULL ): break
        if( x == m_data(p) ): flag = 1: break
        if( x < m_data(p) ): break
        q = p
         p = m_next(p)
    loop
 
    l = q
    if( flag ): return p: else: return _NULL
 
; リストに要素を追加する
#modfunc SLL_Insert int x
 
    SLL_Search thismod, x, q: p = stat
 
    ; 重複カウント
    if( p != _NULL ){
        m_count(p)++
        return
    }
 
    ; 新しいセルの挿入
    SLL_GetEntry thismod
 
    new = stat
    m_entry(new) = _USED
    m_data(new) = x
    m_count(new) = 1
 
    m_next(new) = m_next(q)
    m_next(q) = new
 
    return
 
; リストから要素を削除する
#modfunc SLL_Delete int x
 
    SLL_Search thismod, x, q: p = stat
 
    if( p != _NULL ){
        m_count(p)--
 
        if( m_count(p) == 0 ){
            m_next(q) = m_next(p)
            m_entry(p) = _FREE
        }
    }else{
        mes "要素"+x+"は見つかりません"
    }
 
    return
 
; 
#modfunc SLL_Enum
    p = m_next(m_head)
 
    repeat -1, 1
        if( p == _NULL ): break
        if( m_count(p) > 1 ){
            logmes ""+cnt+":"+m_data(p)+"("+m_count(p)+")"
        }else{
            logmes ""+cnt+":"+m_data(p)
        }
        p = m_next(p)
    loop
 
    return
#global

コメント

  • 細部までチェックしていないのでとんだバカを犯しているかも知れません。仕様も固まっていません。自動拡張を効果的に?使うことでにょきにょきリストを伸ばせます。が、無名領域の確保とは違うのでリストが大きくなるにつれ、拡張時にそれまでのデータのコピーも発生します。 -- kz3 2006-07-09 (日) 17:03:11
  • これの応用で双方向、二分木までは楽に出来そうです。ヒープも配列で実装できるので書いていこうかな... -- kz3 2006-07-09 (日) 17:22:15

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

古い片方向リンクリスト

データ構造

リストの一種で要素の並びをそれを指すポインタ(pointer:指す)でリンク(link:連結)させた構造。
片方向リンクリストでは要素は1つのポインタを持ち、次の要素を指し示す。
C言語などの名前なしのメモリ領域を確保できる言語ではメモリの許す限りリストを伸ばせるがHSPには(WinAPIを使わないかぎり)名前なしのメモリは確保できないので配列サイズに限定される。

片方向リンクリストの内部状態
インデックス0123456789
_value--584623612?2445--
_next2356879410

head

tail

new

リンクリストに対する操作は主に3つある。

探索
指定した要素の位置を求める
挿入
指定した要素の前後(実装による?)に新たな要素を挿入する
削除
指定した要素を削除する

実装例

+  fileSLinkedListAry2[sp].hsp

コメント

  • 近々書きます! -- kz3 2005-07-26 08:55:30 (火)
  • リンクの実装方法なのですが、配列で実装する以外にも、文字列で実装する方法もあります。文字列の場合、処理速度は、落ちるかもしれませんが結構いろいろな処理を実現できそうな気がします。この方法は、Tcl/Tkで、使われている方法だったと思います。具体的には、要素をスペースで区切った文字列をリストとして扱うという方法です。 -- くに 2005-07-26 17:14:17 (火)
  • 文字列?!!?今すぐ想像できません・・・どういうことだろう・・・まだ言わないでください^^; -- kz3 2005-07-27 19:05:38 (水)
  • すいません。リンクの実装ではなく、リストの実装でした。^^; -- くに 2005-07-27 19:15:02 (水)
  • どーん;; -- kz3 2005-07-27 19:30:39 (水)
  • す、すいません、もうちょっとで出来上がります・・・あとは挿入操作だけ;; -- kz3 2005-07-28 12:50:44 (木)
  • 未完成です・・・。現在挿入が上手く行きません;;それでも載せます。 -- kz3 2005-07-28 15:56:14 (木)
  • もう一度整理して考えてみようっと。。。 -- kz3 2005-07-28 16:25:55 (木)
  • ただいまhsp30にてコーディング中。 -- kz3 2005-08-26 07:38:42 (金)
  • 挿入実装完了。次は削除。 -- kz3 2005-08-28 13:36:09 (日)
  • 出来ました^^
    が、一度、挿入出来ないときがあったのですが再現できずじまいです。気のせいかな・・・。もし動作が怪しかったら報告お願いしますm_ _m
    -- kz3 2005-08-28 15:14:05 (日)
  • サンプルの実行方法は、入力ボックスに数字を2ケタまで入力します。その際、頭に+をつけると挿入、-をつけると削除になります。削除はその数値がなければ変化なしです。
    このリストは常にソート状態を保つようにしています。単純なリンクリストではないですね。また要素(またはキー)の重複も許しています。では・・・通常の配列による要素の挿入、削除にはない柔軟な配列版リンクドリストをお楽しみください^^; -- kz3 2005-08-28 15:21:42 (日)
  • ご意見・ご感想、お待ちしています!! -- kz3 2005-08-28 15:23:39 (日)
  • 負数に対応するためにnum = int(num)を入れたのですが対応していませんねぇ・・・ -- kz3 2005-08-28 15:53:29 (日)
  • 空のリストに「--1」として変化なしだったので勘違いしました^^;「+-1」で負数に対応します。が、負数は1ケタです^^何故なら入力ボックスが3字までしか入力を許していないからです。 -- kz3 2005-08-28 15:56:42 (日)
  • もしもし -- kz3 2005-08-30 12:06:31 (火)
  • ・・・雑談ページで雑談できない;; -- kz3 2005-08-30 12:06:50 (火)
  • くにさんが「リストの実装」「文字列を配列で実装する以外にも」と言っていたのはこのことだったのか。文字列の文字の並びを連続した領域の配列で表現するのではなく、文字を要素とするリンクリストで表現する、ということか。これならば文字列操作は配列全体ではなくポインタ操作で済むので…処理速度は落ちるどころか早くなるのでは…
    例えばここに文字列"Hello"と別の離れた位置に"world"があります。
    2つの文字列の先頭アドレスは離れています。
    文字列の連結を考えた場合、配列で実装している場合、2つの文字列の配列サイズを合計した領域を新たに確保してからメモリの内容をコピーします。
    が、文字の並びをリンクリストで実装していた場合、"hello"の"o"の次のポインタを、"world"の"w"のアドレスに向けてやるだけで2つの文字列は連結されました。
    リンクリストで実装した場合の文字列終端はNULLポインタです。
    くにさん、こういうことでいいのかな? -- kz3 2005-09-06 10:19:53 (火)
  • 文字列中の文字要素の一部分操作もポインタを操作するだけで容易に実装できる。(いや実装は容易じゃないが操作は容易です。)
    うん、きっとそういうことだ。確信。 -- kz3 2005-09-06 10:22:48 (火)


添付ファイル:
fileSLinkedListAry[sp].as
234件 [詳細]
fileSLinkedListAry2[sp].hsp
436件 [詳細]
fileMSLinkedList.hsp
465件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:42:13 (2436d)