文字列ソート

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

Re:文字列ソート

#31

投稿記事 by » 17年前

みなさん、どぉーも、ありがとーございます。。。

一応今回は、ソートの練習問題だったので、リスト構造のやりかたの練習をしてみます。

管理人

Re:文字列ソート

#32

投稿記事 by 管理人 » 17年前

そういえばソートして表示って問題の言葉に捉われなければ、単純に比較してコピーするだけの方がずっと計算早いですね。

結局リストと同じことになりそうですけど。
リストの配列版というか
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>

void disp(int num,int p[/url]){
	for(int i=0;i<=num;i++)
		printf("%d ",p);
	printf("\n");
}

int main(void){
	int i,j,num=0,*p,*pp,x;
	p = (int *)malloc(sizeof(int)*(num+1));
	while(1){
		printf("Input ---> ");
		if(scanf("%d",&x) == EOF)
			break;
		else {
			pp = (int *)malloc(sizeof(int)*(num+1));
			memcpy(pp, p, sizeof(int) * (num+1));
			free(p);
			p = (int *)malloc(sizeof(int)*(num+2));
			memcpy(p, pp, sizeof(int) * (num+1));
			free(pp);
		}
		if(num>0){
			for(i=0;i<num;i++)
				if(p>x) break;
			for(j=num;j>=i;j--)
				p[j+1]=p[j];
			p=x;	
		}
		else
			p[0]=x;
		disp(num,p);
		num++;
	}
	free(p);
	return 0;
}


  

管理人

Re:文字列ソート

#33

投稿記事 by 管理人 » 17年前

↑クリックで画像が拡大↑

ちょっと手元にパワーポイントとか絵を書いて説明できるものがないんで、
手書きの写真で説明します…;

汚い字ですみませんm(_ _)m

これは
8 11 13 21
と並んでいるときに

12が入力されたときに、どういう風に割り込んで、並べているか説明したものです。

管理人

Re:文字列ソート

#34

投稿記事 by 管理人 » 17年前

う、みなさんのお話を見ずに投稿しているとreallocのお話が・・。
reallocは使ったこと無かったので思いつきませんでした。
mallocよりreallocを使った方がずっとスマートですね(_ _|||)

管理人

Re:文字列ソート

#35

投稿記事 by 管理人 » 17年前

#include <stdio.h>
#include <stdlib.h>

void disp(int num,int p[/url]){
	for(int i=0;i<=num;i++)
		printf("%d ",p);
	printf("\n");
}

void sort(int *p,int num,int x){
	int i,j;
	for(i=0;i<num;i++) if(p>x) break;
	for(j=num;j>=i;j--)	p[j+1]=p[j];
	p=x;
	return ;
}

int main(void){
	int i,j,num=0,*p,x;
	p = (int *)malloc(sizeof(int)*(num+1));
	while(1){
		printf("Input ---> ");
		if(scanf("%d",&x) == EOF) break;
		else p=(int *)realloc(p,sizeof(int)*(num+2));
		if(num>0) sort(p,num,x);
		else p[0]=x;
		disp(num,p);
		num++;
	}
	free(p);
	return 0;
}


reallocを使って書き直しました。
何度もすみません(_ _||)

Re:文字列ソート

#36

投稿記事 by » 17年前

すごいですね。
わざわざ手書きまでしていただいて、すみません。
typedefを使えば、sortを何回もかかなくて、すむんですよね★
この前、教えていただきました!!

管理人

Re:文字列ソート

#37

投稿記事 by 管理人 » 17年前

どのソートが早いか測定してみました。
新しいトピをたてたのでよければみてください。

Re:文字列ソート

#38

投稿記事 by » 17年前

はい★ありがとうございます。

あと、もう一つ質問です。いいですか??

管理人さんに教えていただいたプログラムを、「999という数字が入力されたら、終了」という風にしたいんですけど、どのようにやればいいんしょうか??
どこに、その条件をいれるのかがわかりません。

お願いします。

管理人

Re:文字列ソート

#39

投稿記事 by 管理人 » 17年前

if(scanf("%d",&x) == EOF) break;
ここの部分でループを抜けています。

入力がEOFならブレイクという意味です。
これを入力されたものが999ならブレイクにすればいいのです。
つまり、スキャンしてから、その値がつまりxが999ならブレイクです。

Re:文字列ソート

#40

投稿記事 by » 17年前

if(scanf("%d",&x)==999) break;

でいいですか??

Re:文字列ソート

#41

投稿記事 by » 17年前

できましたぁーーーー★

ありがとうございます★

閉鎖

“C言語何でも質問掲示板” へ戻る