質問編集履歴

1

char型Furiganaの定義と、選択ソートで書いてみたコードを追加いたしました。ご意見、改善点ご指摘いただけますと幸いです。

2022/06/07 13:51

投稿

don
don

スコア10

test CHANGED
File without changes
test CHANGED
@@ -4,13 +4,125 @@
4
4
  ②名前順リスト(アルファベット、漢字、ひらがな、全ての入力に対応)
5
5
  を作りたいのですが、上手くいきません。
6
6
 
7
- ①についてはバブルソートで作りたいです。
7
+ ~~①についてはバブルソートで作りたいです。~~
8
+ バブルソートにこだわりはありません。自分がバブルソートしか使ったことがないため、初めにこう書きました。
9
+ 以下に新たに作ってみた選択ソートでの並び替えをコードも載せておきます。
10
+ ↓正直しっくり来ていません。
11
+
12
+ ```C++
13
+ // 登録順に並び替え
14
+ CharaList *sortListOrderRegist( CharaList *pList )
15
+ {
16
+ if( nullptr == pList ){ // 異常系
17
+ return nullptr;
18
+ }
19
+
20
+ CharaNode *pTargetNode;
21
+ CharaNode *pUnsortNode;
22
+ CharaNode *pMax;
23
+ CharaNode *pPrevMax;
24
+ CharaNode *pSortNode = NULL;
25
+
26
+ pUnsortNode = pList->pHead;
27
+ while( NULL != pUnsortNode ){
28
+ pMax = pUnsortNode;
29
+ pPrevMax = NULL;
30
+ pTargetNode = pUnsortNode;
31
+ for( pTargetNode = pUnsortNode; NULL != pTargetNode->pNext; pTargetNode = pTargetNode->pNext ){
32
+ // 最大値要素と比較対象要素を比較する
33
+ if( pTargetNode->pNext->nCharaNum > pMax->nCharaNum ){
34
+ // 最大値要素の更新
35
+ pMax = pTargetNode->pNext;
36
+ pPrevMax = pTargetNode;
37
+ }
38
+ }
39
+
40
+ // 最大値要素を未ソートリストから削除
41
+ if( NULL == pPrevMax ){
42
+ pUnsortNode = pMax->pNext;
43
+ }
44
+ else {
45
+ pPrevMax->pNext = pMax->pNext;
46
+ }
47
+
48
+ // 最大値要素をソート済リストの先頭に追加
49
+ if( NULL == pSortNode ){
50
+ pSortNode = pMax;
51
+ pMax->pNext = NULL;
52
+ }
53
+ else {
54
+ pSortNode->pPrev = pMax;
55
+ pMax->pNext = pSortNode;
56
+ pSortNode = pMax;
57
+ }
58
+ }
59
+ if( NULL != pSortNode ){
60
+ pSortNode->pPrev = NULL;
61
+ }
62
+ pList->pHead = pSortNode;
63
+ }
64
+
65
+
66
+ // 名前順に並び替え
67
+ CharaList *sortListOrderName( CharaList *pList )
68
+ {
69
+ if( nullptr == pList ){ //異常系
70
+ return nullptr;
71
+ }
72
+
73
+ CharaNode *pTargetNode;
74
+ CharaNode *pUnsortNode;
75
+ CharaNode *pMax;
76
+ CharaNode *pPrevMax;
77
+ CharaNode *pSortNode = NULL;
78
+
79
+ pUnsortNode = pList->pHead;
80
+ while( NULL != pUnsortNode ){
81
+ pMax = pUnsortNode;
82
+ pPrevMax = NULL;
83
+ pTargetNode = pUnsortNode;
84
+ for( pTargetNode = pUnsortNode; NULL != pTargetNode->pNext; pTargetNode = pTargetNode->pNext ){
85
+ // 最大値要素と比較対象要素を比較する
86
+ if( pTargetNode->pNext->strName > pMax->strName ){
87
+ /* 最大値要素の更新 */
88
+ pMax = pTargetNode->pNext;
89
+ pPrevMax = pTargetNode;
90
+ }
91
+ }
92
+
93
+ // 最大値要素を未ソートリストから削除
94
+ if( NULL == pPrevMax ){
95
+ pUnsortNode = pMax->pNext;
96
+ }
97
+ else {
98
+ pPrevMax->pNext = pMax->pNext;
99
+ }
100
+
101
+ // 最大値要素をソート済リストの先頭に追加
102
+ if( NULL == pSortNode ){
103
+ pSortNode = pMax;
104
+ pMax->pNext = NULL;
105
+ pMax->pPrev = NULL;
106
+ }
107
+ else {
108
+ pSortNode->pPrev = pMax;
109
+ pMax->pNext = pSortNode;
110
+ pSortNode = pMax;
111
+ }
112
+ }
113
+ if( NULL != pSortNode ){
114
+ pSortNode->pPrev = NULL;
115
+ }
116
+ pList->pHead = pSortNode;
117
+ }
118
+ ```
8
119
 
9
120
  以下、リスト構造の定義になります。
10
121
  ```C++
11
122
  typedef struct CharacterStatus{
12
123
  string strName;
13
124
  int nCharaNum; // 登録順ソートのため
125
+    char chFurigana[256]; // 名前順ソートで利用する---
14
126
  CharacterStatus *pPrev;
15
127
  CharacterStatus *pNext;
16
128
  } CharaNode;