
No.2ベストアンサー
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 256
#define MAX_LIST 3
int comp(const void *a, const void *b)
{
return strcmp( (const char*)a , (const char*)b ) ;
}
int main(){
char StringList[MAX_LIST][MAX_LEN];
int i;
for( i = 0 ; i < MAX_LIST ; i++ ){
fgets( StringList[i] , MAX_LEN , stdin );
}
qsort( StringList , MAX_LIST , sizeof(char) * MAX_LEN , comp);
printf("\n");
for( i = 0 ; i < MAX_LIST ; i++ ){
printf("%s",StringList[i]);
}
}
参考URL:http://www.doumo.jp/postgretips/tips.jsp?tips=46
No.4
- 回答日時:
// 片方向線形リストによるソート
#include <むふふ>
#define D_MAXSTR_LEN (65535) // 入力される文字列の許容文字数
// ノード構造体
typedef struct _tag_CNODE {
_tag_CNODE *pnext; // 次のノード
int len; // 文字列の長さ(必要ないとおもわれ
char *pstr; // 動的確保した文字列を格納するポインタ
} CNODE, *PCNODE;
// -----------------------------------------------------------------------------
// 文字列を線形リストに追加する
// pnTop : ノードリストの先頭を格納するPCNODEのポインタのポインタ
// pinput : 追加する文字列
// 返値 : 0=正常終了/-1=NULL入力/-2=許容文字数超え/-3=メモリ不足
int AddCNode(PCNODE *pnTop, char *pinput)
{
int i; // 汎用
char *p, *q; // 汎用
PCNODE nA, nB, nZ; // nA:新規作成ノード / nB:比較用 / nZ:一時的前方
if( !(p = pinput) || !(*pinput) ) return(-1); // ▲何も入力されてない?
i = 0; while(*p && i < D_MAXSTR_LEN) { p++; i++; } // 文字数をカウント
if(i > D_MAXSTR_LEN) return(-2); // ▲入力された文字列が最大文字数を超えたらエラー
// ノードを動的に作成する。(mallocは使うのかよw
if(!(nA = (PCNODE)malloc(sizeof(CNODE)))) return(-3); // ▲確保できなかったらエラー
if(!(nA->pstr = (char*)malloc((nA->len = i) + 1))) // 文字列を格納する為のメモリを確保
{ free(nA); return(-3); } // ▲エラーなので確保ノード開放
p = pinput; q = nA->pstr; while(*p++ = *q++); // 文字列をコピー
// ここからソート&片方向線形リストに追加する処理
// リストがカラ?
if(!(nB = *pnTop)) { *pnTop = nA; return(0); } // 必然的に作成したノードがトップ ■終了
// リストの先頭から順に比較していく処理
// ココに入る前に、既にトップノードを取出し済み
nZ = NULL; // 最初は一時的前方無いので
while(nB) { // ループ開始
p = pinput; q = nB->pstr;
while(*p && *q && *p != *q) { p++; q++; } // 同じ文字で無くなるまで進む
if( !(*p) || *p < *q ) // ●新規側の文字列が短いor若いor(全く同じ場合)
{ // 比較ノードの前方に新規ノードを付け足す
// if( !(*q) ) { /* ココに全く同じ場合の処理を書く */ }
// 対象の前方ノードがあるなら、前方ノードのpnextを新規ノードにする
if(nZ) nZ->pnext = nA; else *pnTop = nA; // 前方が無いなら新規がトップになる
nA->pnext = nB; // 新規の次ノードは、今回比較したノード
nB = NULL; // 抜ける為
} else { // ●新規側が長いor若くない
nZ = nB; // 次の一時的前方は今回比較したノード
if(!(nB = nB->pnext)) // リストの最後まできた?
{ // 必然的に新規が末尾になる
nZ->pnext = nA; // 今回比較したノードの次ノードは新規作成ノード
nA->pnext = NULL; // 自分が末尾
}
}
}
return(0); // ■終了
}
// -----------------------------------------------------------------------------
// リスト開放
// pTop : リストの先頭
void ReleaseCNode(PCNODE pTop)
{
PCNODE p = pTop;
while(p) { PCNODE q = p->pnext; free(p->pstr); free(p); p = q; }
}
// -----------------------------------------------------------------------------
// 使用例
void Main(void)
{
PCNODE ptop, q;
ptop = NULL;
// 入力を足してく
AddCNode(&ptop, "AKIRA");
AddCNode(&ptop, "AKIKO");
AddCNode(&ptop, "AIKOSANN");
// 実際の取り出し
q = ptop; while(q) { printf("%s\r\n", q->pstr); q = q->pnext; }
// 後始末
ReleaseCNode(ptop);
}
// -----------------------------------------------------------------------------
みづれーぇ(タブを大文字空白に変換してるYo)
こんなとこ。
バリアブルな入力に、たいお~
コンパイラを通してないよ~。
だから、エラーとかでるよ~。ロぢックエラーもあるかもよ~。
永久ループとかリークの危険性がちょっぴりある。
あと、メモリ使いまくりだよ~。エラーチェックも甘いし。
ちょーてきとうに作ったから~。
大規模になると、頭2文字でリストを分けたり。
頭4文字をlongとかに変換して、高速に処理しる。
PS.#2~#3さんがソース書いてるから触発されて書いちゃった。
規定違反?
No.3
- 回答日時:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *x, const void *y){
return(strcmp(*(char**)x,*(char**)y));
}
void main(void){
char *data[]={ "AKIRA","AKIKO","AIKOSANN" };
char *wk;
int i;
printf("before:\n");
for(i=0;i<3;i++)
printf("%s\n",data[i]);
qsort(data,sizeof(data)/sizeof(char*),sizeof(char*),cmp);
printf("after:\n");
for(i=0;i<3;i++)
printf("%s\n",data[i]);
}
No.1
- 回答日時:
strcmpを使って、文字(アスキーコード)の「大きさ」を比べます。
詳しくは↓の辺で。ソートする部分は自作してみましょう。
参考URL:http://www.bohyoh.com/CandCPP/C/Library/strcmp.h …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
4色定理はなぜグラフ理論で証...
-
ノードとは
-
同じタグ名の項目取得
-
C#でTreeViewのCheckBoxのサイ...
-
vbsのDOMDocumentで要素のText...
-
各ノードの行数取得
-
SNMP ステータスポーリングと...
-
C#のツリービューでツリーノー...
-
XMLで要素が記述された順番に意...
-
東芝のDynabookなのですがアン...
-
127.0.0.1とlocalhost
-
VBSでのDOM操作について
-
C#で使用中のファイルに別のフ...
-
Access VBAでXMLが読み込めない
-
あせんうぶり言語
-
xmlstarletで他ファイルからエ...
-
XMLはなぜ普及したのか?
-
VBでXMLファイルを作ると xmlns...
-
バッチファイルでテキストファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
SNMP リンクダウンとノードダ...
-
C#でTreeViewのCheckBoxのサイ...
-
昔Winnyってありましたけど、あ...
-
ノードとは
-
同じタグ名の項目取得
-
TreeViewに重複する値をセット
-
TreeViewのNodeについて
-
ツリービューを閉じさせたくない。
-
最長経路探索
-
2分探索木の高さを求めるプロ...
-
各ノードの行数取得
-
4色定理はなぜグラフ理論で証...
-
C# TreeView 効率良いノード追...
-
複数のマックPCによる数値計算...
-
プログラミングC言語について次...
-
C言語:文字列の並び替え
-
CTreeCtrlで、あるノード以下だ...
-
SNMP ステータスポーリングと...
おすすめ情報