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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel>マクロ>特定のセルで同じ情報が登録されている行を1行にまとめたい(文字連結) 6 2023/01/05 16:30
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- その他(Microsoft Office) 逆順 3 2023/08/24 09:30
- その他(Microsoft Office) 1の行を固定した上でVBAを用いて日付順に自動並べ替え 2 2022/06/06 15:09
- Excel(エクセル) Excelで、行に複数の数字が入力されているセルが複数の列存在し、行を跨いでセル内の数値を並び替える 5 2022/06/17 18:03
- Excel(エクセル) Excelの列から検索して該当する行を別シートに転記するVBA 2 2022/12/20 09:35
- Excel(エクセル) 【エクセル】並び替えからの並び替え方法 7 2022/07/22 09:46
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- Excel(エクセル) オフィスをLibreOfficeからmicrosoft 2013に変えました。 1 2022/05/09 00:28
- Excel(エクセル) Excelの並び替え(先頭の文字以外を基準に並び替えたい) 3 2023/07/07 22:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
ルート要素ノードが2個ある場合?
-
あるノードリストに、特定の名...
-
SNMP リンクダウンとノードダ...
-
双方向リストの関数
-
TreeViewの再表示のちらつきを...
-
同じタグ名の項目取得
-
ノード数とは?
-
昔Winnyってありましたけど、あ...
-
XML::LibXMLのfindnodes()で、...
-
最長経路探索
-
ToolStripMenuItemの選択(VB)
-
C#でtreeviewの指定ノードを選...
-
複数のマックPCによる数値計算...
-
インターネットって、どうやっ...
-
ツリービューのノードをダブル...
-
カウントアップ
-
2分探索木の高さを求めるプロ...
-
アローダイアグラムの描画について
-
XML文書の指定した属性値を持つ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
SNMP リンクダウンとノードダ...
-
同じタグ名の項目取得
-
昔Winnyってありましたけど、あ...
-
コンテキストメニュークリック...
-
ルート要素ノードが2個ある場合?
-
マスターノード
-
複数のマックPCによる数値計算...
-
あるノードリストに、特定の名...
-
TreeView の初期表示について
-
TreeViewの再表示のちらつきを...
-
ツリービューのノードをダブル...
-
C# TreeView 効率良いノード追...
-
ノード数とは?
-
XML文書の指定した属性値を持つ...
-
C#のツリービューでツリーノー...
-
VB6.0でDOMを使用して...
-
TreeViewで複数ノードの選択は...
-
ノードとは
-
VisualBasic.net(2008) ツリー...
おすすめ情報