Skip to content
This repository was archived by the owner on May 22, 2026. It is now read-only.

Commit 5ddf26a

Browse files
Add data structure examples: one-way linked list.
1 parent 696152c commit 5ddf26a

4 files changed

Lines changed: 161 additions & 6 deletions

File tree

data_structure/README.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1-
# データ構造
1+
# データ構造(Data Structure)
22

3-
## スタック
3+
## スタック(Stack)
44

55
- Last In First Out でデータを取り出す構造
66
- データが入るリストとスタックポインタとなる変数を用意してデータを入れた時にスタックポインタを増やして,データを取り出した時にスタックポインタを減らす。
77

88
---
99

10-
## キュー
10+
## キュー(Queue)
1111

1212
- First in First Out でデータを取り出す。
1313
- キューにデータを入れることを enqueque,データを取り出すことを dequeue という。
1414

15-
### リングバッファ
15+
### リングバッファ(Ring Buffer)
1616

1717
- リングバッファ: 記憶領域がリング状になったもの。
18-
- リングバッファを実装するにはデータを入れる配列,データの先頭,データの最後尾となる変数を用意する。データは配列の(データの最後尾+1)%リングバッファのサイズの場所に追加する。データは配列の先頭から取り出し,データの先頭の位置を(データの取り出し前の先頭の位置+1)%リングバッファのサイズを更新する(+1 する)
18+
- 配列を取り出す index と配列を入れる index を定義し,これらは配列の長さで割った余りを使って実装する。 --> 割り算によって円形の配列を実現している
1919

20-
###
20+
---
21+
22+
## 連結リスト(linked list)
23+
24+
- 各データが次のデータのへの参照情報としてリンク(ポインタ)を持つデータ構造。
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# coding: utf-8
2+
"""
3+
片方向リスト
4+
"""
5+
from typing import Union
6+
7+
8+
def insert_list(data: int) -> bool:
9+
"""
10+
データの最後尾に値を追加し,追加できた時にTrueを返す。
11+
"""
12+
global data_list, pointer
13+
is_empty = False
14+
15+
# データに空き領域があるか調べる。
16+
for i in range(LIST_SIZE):
17+
if data_list[i] is None:
18+
n = i # 配列の先頭から最も近い空き領域のインデックス
19+
is_empty = True
20+
break
21+
if not is_empty:
22+
print("no empty space")
23+
return False
24+
25+
# 配列にデータが入っており,pointerがNoneでない=最後尾に連結する。
26+
for i in range(LIST_SIZE):
27+
if (data_list[i] is not None) and (pointer[i] is None):
28+
pointer[i] = n
29+
break
30+
31+
# データの追加
32+
data_list[n] = data
33+
pointer[n] = None # データの最後尾なのでpointerはNone
34+
print(f"insert data: {data}.")
35+
return True
36+
37+
38+
def delete_list(data: int) -> bool:
39+
"""
40+
削除対象のdataを受け取り,削除できたらTrueを返す。
41+
"""
42+
global head
43+
is_found = False
44+
45+
# 削除対象のデータを探し,data_listのindexをnに格納する。
46+
for i in range(LIST_SIZE):
47+
if data_list[i] == data:
48+
n = i
49+
is_found = True
50+
break
51+
52+
if not is_found:
53+
print("no data found")
54+
return False
55+
56+
# pointer[i]がnを指しているのでpointer[n]が指している要素に変更する。
57+
if n != head:
58+
for i in range(LIST_SIZE):
59+
if pointer[i] == n:
60+
pointer[i] = pointer[n]
61+
62+
# 削除するのがheadの時はheadをheadが指していたpointerつまり,headの次の要素に変更する。
63+
else:
64+
head = pointer[n]
65+
if head is None:
66+
head = 0
67+
68+
# データの削除
69+
data_list[n] = None
70+
pointer[n] = None
71+
print(f"delete data {data}")
72+
return True
73+
74+
75+
def put_list():
76+
"""
77+
リストのデータの一覧を出力する
78+
"""
79+
p = head
80+
while True:
81+
print(data_list[p], end="-->")
82+
if pointer[p] is None:
83+
print("EOF")
84+
break
85+
p = pointer[p] # 取り出したらpを更新する。
86+
87+
88+
# global変数の初期設定
89+
LIST_SIZE = 5 # リストのサイズ
90+
data_list = [None] * LIST_SIZE # データ
91+
pointer = [None] * LIST_SIZE
92+
head = 0 # 先頭ノードの位置を管理する
93+
94+
95+
def main():
96+
for i in range(1, 6):
97+
insert_list(i)
98+
put_list()
99+
100+
# 削除テスト
101+
delete_list(3)
102+
put_list()
103+
104+
# headを消してみる
105+
delete_list(1)
106+
put_list()
107+
108+
109+
if __name__ == '__main__':
110+
main()

data_structure/linked_list/two_way_list.c

Whitespace-only changes.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# coding: utf-8
2+
"""
3+
線形リスト
4+
"""
5+
6+
7+
class Node:
8+
def __init__(self, data: int):
9+
self.data = data
10+
self.prev_node = None
11+
self.next_node = None
12+
13+
14+
class DoubleLinkedList:
15+
def __init__(self):
16+
self.head = None
17+
18+
def insert(self, data: int) -> None:
19+
20+
def delete(self, data: int) -> None:
21+
22+
def print_list(self) -> None:
23+
tmp = self.head
24+
while tmp:
25+
print(tmp.data, end=",")
26+
tmp = tmp.next_node
27+
if tmp == self.head:
28+
return
29+
else:
30+
print("List is empty.")
31+
32+
33+
def main():
34+
doubly_linked_list = DoubleLinkedList()
35+
for i in range(5):
36+
doubly_linked_list.insert(i)
37+
doubly_linked_list.print_list()
38+
39+
40+
if __name__ == '__main__':
41+
main()

0 commit comments

Comments
 (0)