質問編集履歴
1
char型Furiganaの定義と、選択ソートで書いてみたコードを追加いたしました。ご意見、改善点ご指摘いただけますと幸いです。
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;
|