• 締切済み

C言語:文字列の並び替え

3つの文字列を入力して、昇順に並び替えを行う方法教えて下さい。 例えば、 AKIRA AKIKO AIKOSANN と、入力されたら、 AIKOSANN AKIKO AKIRA   となるようにアルファベットが早い順に並びかえを行いたいのです。 わかる方、助けてください!

みんなの回答

  • VirtualT2
  • ベストアンサー率58% (18/31)
回答No.5

#4ダス あう、一部ミスってる。 すみません…(;;

  • VirtualT2
  • ベストアンサー率58% (18/31)
回答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さんがソース書いてるから触発されて書いちゃった。 規定違反?

noname#9404
質問者

お礼

こんなに詳しく書いてくださる方がいたとは!!!驚きと感謝で、感激です(><)ありがとうございました!!

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答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]); }

  • sha-girl
  • ベストアンサー率52% (430/816)
回答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
noname#9404
質問者

お礼

こんなに詳しく書いてくださりありがとうございます!! 参考になりました!

  • Aizaka
  • ベストアンサー率21% (12/55)
回答No.1

 strcmpを使って、文字(アスキーコード)の「大きさ」を比べます。詳しくは↓の辺で。  ソートする部分は自作してみましょう。

参考URL:
http://www.bohyoh.com/CandCPP/C/Library/strcmp.html
noname#9404
質問者

お礼

ホームページ参考にさせていただきました!ありがとうございました!

関連するQ&A