バブルソートを使って文字列を辞書順に並べるプログラムを作成したいのですがうま...
it200189さん
バブルソートを使って文字列を辞書順に並べるプログラムを作成したいのですがうまくいきません・・・。
バブルソートを使って文字列を辞書順に並べるプログラムを作成したいのですが、コンパイルはできますが実行してもうまく出力されません・・・。
どこがおかしいのか、わからないので詳しい方よろしくお願いします。
またこのやり方とは異なる方法で作成できるという方せひプログラムを掲載してください!
参考にさせていただきます!
#include<stdio.h>
#include<string.h>
struct QUEUE{
struct QUEUE *prev;
struct QUEUE *next;
char alpha[];
};
static struct QUEUE name[10];
void InQueue(struct QUEUE * dst ,struct QUEUE *src){
src->prev = dst->prev;
src->next = dst->prev->next;
dst->prev = src;
dst->prev->next = src;
}
void DeQueue(struct QUEUE *src){
src->prev->next = src->next;
src->next->prev = src->prev;
}
void InitQueue(struct QUEUE *pQueue ,int size){
int i;
struct QUEUE *pEndQueue;
struct QUEUE *pTempQueue;
pEndQueue = pQueue + size-1;
pQueue->prev = NULL;
pQueue->next = pEndQueue;
pEndQueue->prev = pQueue;
pEndQueue->next = NULL;
pTempQueue = pQueue + 1;
pEndQueue = pEndQueue - 1;
pTempQueue->prev = NULL;
pTempQueue->next = pEndQueue;
pEndQueue->prev = pTempQueue;
pEndQueue->next = NULL;
i = 3;
while ( i < size - 2) {
pTempQueue = pQueue + i;
InQueue(pEndQueue,pTempQueue);
i++;
}
}
void BubbleSort(struct QUEUE *pSort ,int size){
int i;
int j;
// struct QUEUE *pTemp;
// pTemp = pSort;
while(size > 0){
i = 0;
// pSort = pTemp;
pSort = name[1].next;
while(i < size - 1){
j = 0;
while(pSort->alpha[j] != '\0'){
if(pSort->alpha[j]>pSort->next->alpha[j]){
DeQueue(pSort->next);
InQueue(pSort,pSort->next);
break;
}
else if(pSort->alpha[j]<pSort->next->alpha[j]){
pSort = pSort->next;
break;
}
j++;
}
i++;
}
size--;
}
}
void main(){
int i;
// static struct QUEUE name[10];
struct QUEUE *pStr;
char str[4][10] = {"tani","okada","naka","oka"};
InitQueue(name,8);
i = 0;
while(i<4){
strcpy(name[i + 2].alpha,str[i]);
i++;
}
BubbleSort(name[1].next,4);
pStr = name[1].next;
i = 0;
while(i<4){
printf("%s\n",pStr->alpha);
pStr = pStr->next;
i++;
}
}
No.2ベストアンサー
- 回答日時:
> DeQueue(pSort->next);
> InQueue(pSort,pSort->next);
この動作をよく考えてください
A⇔B(=pSort)⇔C(=pSort->next)⇔D⇔E
と並んでいるところで DeQueue(pSort->next)とすると
A⇔B(=pSort)⇔D(新しいpSort->next)⇔E
となります。
そこで InQueue(pSort,pSort->next);とすれば、pSortの位置にpSort->next、つまりBの位置にDを入れようとします。
Cではありません。この双方向リストからCにアクセスする方法は失われてしまいました。
動作がおかしくなるのも道理です。InQueueにこのBDを当てはめれば、リスト構造がぐちゃぐちゃになることがわかります。
/*
呼び出し時点では以下の通り
A->next = B
B->prev = A, B->next = D
D->prev = B, D->next = E
*/
D->prev = B->prev; /* → D->prev = A */
D->next = B->prev->next; /* → D->next = A->next → D->next =B */
B->prev = D;
B->prev->next = D; /* → A->next = D */
/*
終了では以下の通り
A->next = D
B->prev = D, B->next = D
D->prev = A, D->next =B
*/
対策するなら、 削除する要素(上の例のC)を覚えておく変数を用意して
t = pSort->next; /* struct QUEUE *t; と宣言しておく */
DeQueue(pSort->next);
InQueue(pSort,t);
とするか、入れかえ専用関数を用意するかです
他にも
> char alpha[];
大きさが指定されていないので、strcpyでコピーできるだけの大きさがありません。
とか、
> pSort = name[1].next;
ソートの途中過程で順番が入れ替わっているので、先頭を表しているとは限りません。
とか、
InitQueueの動作と、実際に使っている様子とが一致してないとか(QUEUEの仕様をちゃんとまとめてないのでは?)
とか、
BubbleSort関数の引数pSortの意味がない
とか、
そもそも、Queue(待ち行列)というデータ構造の名前と、実際の動作が一致してないのは、なんかしっくりこない
とか、色々とあります。
こちらで実際に動かせるようになるまで、そうとう箇所の変更が必要でした。
No.1
- 回答日時:
リスト構造の配列、というデータ構造を採用した
理由を教えてください。
そのデータ構造を使っているために、本来はもっと簡単に
書けるプログラムを変にこねくり回しているように見えます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
InvokeMemberメソッドとは何を...
-
ばばぬきプログラムについて
-
構造体のリスト削除
-
「an=(n-1)/(n+1)のときlim[n→∞...
-
Enterキーを押されたら次の処理...
-
マイナスからプラスへ転じた時...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
DWORDの実際の型は何でしょうか
-
fgetsなどのときのstdinのバッ...
-
c言語で、繰り返し文の中で、0....
-
2÷3などの余りについて
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
*をユーザーが入力した数字の数...
-
プログラムでの数字につく”f”の...
-
正負を反転させて出力するプロ...
-
(int *)の意味
-
sscanfとscanfの違いがよくわか...
-
C言語のプログラムで#include<m...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InvokeMemberメソッドとは何を...
-
構造体のリスト削除
-
双方向リストのバブルソートに...
-
バブルソートを使って文字列を...
-
空のカラムを挿入
-
C言語 リスト
-
isset — 変数が宣言されている...
-
コールバック関数はnullになら...
-
C#でのEXCEL出力に関して
-
リスト構造
-
バグの原因がわかりません(c言...
-
API 録音 MCI
-
【C++】ストリームオブジェクト...
-
ポインタを使った連結リストへ...
-
C# ref引数のnull判定
-
.htaccessで
-
マイナスからプラスへ転じた時...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
「指定されたキャストは有効で...
おすすめ情報