dポイントプレゼントキャンペーン実施中!

C言語の勉強をしております。
環境は、WindowsXP、VC++です。
シフトJISの文字を、英語(A~Z)、数字(0~9)、ひらがな(あ~ん)でソートしたいのですg、どうすれば良いのか分かりません・・・。
ネット等で色々見てみたのですが、どなたか分かりやすくご説明していただけないでしょうか?

使用する文字も上記だけなので、それ以外が入力された場合にチェックする機能も欲しいと思っております。

以上、よろしくお願いいたします。

A 回答 (5件)

交換法でやるなら


1) forの2重ループを組む pSrc と pDst
2) 2つの構造体のnameを使って strcmpなどの比較関数で大小をチェック
3) 並べ替えが必要な場合
4) pDstをリストから排除
  pDstの前の要素があるなら
  pDst->prev->next を pDest->next
  pDstの次の要素があるなら
  pDst->next->prev を pDest->prev
5) pDestの接続を更新
  pDst->next を pWork
  pDst->prev を pWork->prev
6) pSrcの接続を更新
  pSrcの前の要素があるなら
    pSrc->prev->next を pDst
  前の要素が無いなら
    pTop を pDstに更新
  pSrc->prevをpDst
7) pSrc を pDstに更新
8) 1)へもどって繰り返す
といったコードを組めば出来ますよ

この回答への補足

丁寧なご説明ありがとうございます。

参考にさせていただきます。

本当にありがとうございます。

補足日時:2008/11/07 11:06
    • good
    • 0

その構造体の定義やサンプルのデータなどを提示してみましょう



文字列の長さの違うものはどうするとか
短いものが優先、長さに関係なく先頭からオーダー順でソート

ABC,A,BB,ABD,AB,Ab
をどのようにソートしたいか
A,AB,ABC,ABD,Ab,BB
といった具合かなど ・・・

この回答への補足

構造体の定義は以下の通りです。
typedef struct address {
int s_flg; /* 検索フラグ */
char names[32];/* 名前 */
char tels[32];/* 電話番号 */
struct address *prev;/* 前へのポインタ */
struct address *next;/* 次へのポインタ */
}Address;

文字列の長さの違うものは長さに関係なくです。
>A,AB,ABC,ABD,Ab,BB
>といった具合かなど ・・・

の通りにしたいと思っております。

双方向リストの構造体は、先頭アドレスのみ管理し、最後のデータのnextにはNULLを入れております。

補足日時:2008/11/06 14:07
    • good
    • 0

複数の文字列のソートなら普通に英字のみのソートと同様に出来ます


文字列内の文字の並び替えなら先頭から1バイトずつ見ていって2バイト文字か1バイト文字かを判定しながら並び替える必要があります
どっちでしょうか

この回答への補足

ご回答ありがとうございます。
複数の文字列のソートです。

ASCIIなどの1バイト文字文字と同じように出来るとは知らなかったです・・・。
ただ、もともとの文字コードとは違う順序でソートしたい場合はどうすれば良いのでしょうか?
例)ASCIIでは、# < * < 0 < … < 9
だけど、
* < # < 0 < … < 9
したい場合など・・・。

教えていただけますでしょうか?

補足日時:2008/11/06 12:06
    • good
    • 0

>シフトJISの文字を、英語(A~Z)、数字(0~9)、ひらがな(あ~ん)でソートしたいのです


特に深く考える必要はありません。
半角の時と同じ方法でソートできます。

「ファイル名を指定して実行」に charmap と打ってみてください。
そこでフォントを MSゴシック にすると文字コードが見れます。

たとえば全角の あ~ん までは 順番に並んでいます。
全角 あ は 0x82A0
全角 い は 0x82A2
ですので 単純に数値として比較すればOKです。
(ただし、小さい文字"ょ"や、濁点付きの文字"だ"なども含まれます)

>使用する文字も上記だけなので、それ以外が入力された場合にチェックする機能
これ以外の文字をはじく場合は、
0~9、A~Z、あ~ん 以外の範囲かどうかチェックすればいいでしょう。
(上にも書きましたが、濁点付きの文字なども含まれるため、ひらがなに関しては配列に使用する文字(あ~ん)を入れておいて比較するしかないと思います)

ライブラリがあるかもしれませんので、
探してみるのをお勧めします。

この回答への補足

ご回答ありがとうございます。

さっそく試してみたのですが、どこに文字コードが出てくるのでしょうか?

あと、「ライブラリ」の意味が分かりません・・・orz

補足日時:2008/11/06 12:02
    • good
    • 0

で、入出力部分は出来ているのでしょうか?


何かのコントロールに対する入力チャックなのか
ファイルから読み込むのか
出力はコンソールへ対してなのかメッセージボックスなのか

現在お使いのコードがあるなら支障の無い範囲で公開しましょう

プログラミングスタイルは何なのか WIN32SDK/MFC/STLなど
VC++のバージョンは何なのか VC6/2002/2003/2005/2008

ソートするのはどのようなものか
1つの文字配列をソートするのか
文字列の配列をソートするのか
文字列の配列ならば長さによる重み付けなどをするのか

この回答への補足

入出力は出来ています。
テキストファイルから読み取り、双方向リストの構造体へmallocしながら格納させています。

出力はコンソールです。
「プログラミングスタイル」が何の事なのか分かりませんorz

ソートするのは配列ではなく、双方向リストの構造体です。

説明不足で申し訳ございません・・・。

補足日時:2008/11/06 12:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!