現在C言語の自己参照型について勉強をして入るのですが
mallocで確保した領域でソートを行うにはどのようにすれば
良いのでしょうか。
(qsort関数は使わず、独自の関数で行う)
*図
-database
|number
|name
|next----batabase
_____________|number
_____________|name
_____________|next------と続く
ソースコード
#include <stdio.h>
struct database{
int number;
char f_name;
struct *next;
};
int data_sort(){
/* ここのやり方がWebを見ても理解が出来ない状態です。 */
}
int main(){
struct database *d1,*d2;
d1 = (struct database *)malloc(sizeof(struct database*))
d2 = NULL;
while(cnt < 10){
scanf("%d",&d1->number);
scanf("%s",d1->name);
d1->next = d2;
d2 = d1;
cnt++;
}
data_sort();
}
No.3ベストアンサー
- 回答日時:
>「ソートしてある状態を保ちながら、リストへ挿入する」
>というのは、mainで配列を組んで配列内でソートしてから、
>ソートした値をmallocで確保した領域に入れるという事なのでしょうか・・。
そうではありません。
配列は一切使いません。リスト構造を使っている意味がなくなりますので。
「ソートしてある状態を保ちながら、リストへ挿入する」とは、こういうことです。
リストの初期状態(空っぽであることです)を含めて、当該のリストは
何らかのキー(番号とか名前)でソート済です。
そのリストを先頭からサーチしていくと、いま着目しているデータを
リストのどこに挿入すればよいかがわかります。
挿入すべき場所が見つかったら、適切にポインタを張り替えます。
こうすることで、当該のリストは「いつでもソート済」の
状態にあることになります。
この回答への補足
回答ありがとうございます。
何となくですが、少し見えてきたような気がします。
ポインタの張替え方法が、分からないので例えでいいので
教えていただけないでしょうか…。
No.2
- 回答日時:
汚いと文句が飛んできそうですが
typedef struct tagData{
int num;
char name[256];
struct tagData *next;
}DATA;
void data_sort(DATA **start);
int main()
{
DATA *d1,*d2,*d3;
char buf[256];
int num = 0;
d1 = NULL;
while(1){
printf("[%03d].num = ",num+1);
gets(buf);
if (atoi(buf)== -1)break;
d2 =(DATA *)malloc(sizeof(DATA));
d2->num =atoi(buf);
printf("[%03d].name = ",num+1);
gets(buf);
strcpy(d2->name,buf);
num++;
d2->next = NULL;
if (d1 == NULL) {
d1 = d2;
}else{
for (d3 = d1 ;; d3 = d3->next){
if(d3->next == NULL) {
d3->next = d2;
break;
}
}
}
}
data_sort(&d1);
}
void data_sort(DATA **start)
{
DATA *d1,*tmp,**d3;
int i,j,num = 0;
if (*start == NULL)return;
for (d1 = *start ;; d1 = d1->next){
num++;
if(d1->next == NULL)break;
}
if (num == 1)return;
d3 = (DATA **)malloc(sizeof(DATA *) * num);
num = 0;
for (d1 = *start ;; d1 = d1->next){
d3[num++] = d1;
if (d1->next == NULL)break;
}
for (i = 0; i < (num - 1); i++){
for (j = (num - 1); j > i; j--){
if (d3[j-1]->num > d3[j]->num){
tmp = d3[j-1];
d3[j-1] = d3[j];
d3[j] = tmp;
}
}
}
*start = NULL;
for (i = 0; i < num; i++){
d3[i]->next = NULL;
if (*start == NULL){
*start = d3[i];
}else{
for (tmp = *start ; ; tmp = tmp->next) {
if (tmp->next == NULL) {
tmp->next = d3[i];
break;
}
}
}
}
free(d3);
}
回答ありがとうございます。
やはり、領域を確保して値を入れた後の処理(ソート)は、
思ったより、難しいようですね・・・。
ソースを書いていただきありがとうございます。
このソースは参考にします。
No.1
- 回答日時:
リスト構造でソートを行なうには、
「ソートしてある状態を保ちながら、リストへ挿入する」
という方法が楽だと思います。
もちろん、データの入力順にリスト構造を作って後からソートする、という方法も使えます。
ところで、リスト構造以前の話として、
>#include <stdio.h>
malloc関数を使うのであれば、stdlib.hもインクルードしてあげましょう。
>struct *next;
こういう定義はできません。今回使っているのは何型の構造体ですか?
>char f_name;
f_nameには1バイト分しか領域を取っていないのに
>scanf("%s",d1->name);
文字列の入力を求めています。正しくありません。メンバー名の食い違いもありますね。
回答ありがとうございます。
「ソートしてある状態を保ちながら、リストへ挿入する」
というのは、mainで配列を組んで配列内でソートしてから、
ソートした値をmallocで確保した領域に入れるという事なのでしょうか・・。
もし、上記のようなものなら少し目的が違うので、もう少し考えて見ます。
ありがとうございました。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語・要素除去
-
昇順ソート
-
VB.NETでファイル名順にファイ...
-
Excel VBAで並べ替えをしたい
-
DataGridViewソート時に先頭行...
-
javaのソートについて。
-
C# DataTable ソートについて
-
DirectoryInfo型配列ソート(C#)
-
構造体配列のソート
-
10個の整数を入力して小さい順...
-
クイックソートって??
-
多次元配列のソート方法
-
DataGridViewの昇順降順。
-
System.IO.Directory.GetFiles...
-
GridViewで列のソートを無効に...
-
C# DataGridView のヘッダーセ...
-
C言語 構造体の中に共用体を定...
-
VBAのプログラムで、DIAG = 1# ...
-
関数から配列を返すには?
-
ExcelVBAで質問です。離れた二...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
あるディレクトリ内のファイル...
-
VBA基本構文の作り方 2列の...
-
ファイル名「1.jpg ~10.jpg~...
-
Excelですべての組合せ(重複組...
-
vbでDataTableの抽出コピー
-
C# DataTableの行をソートしてD...
-
listboxの並び替え
-
(VBA) Dir 関数で取得するファ...
-
コレクションの数値をSortで並...
-
C言語・要素除去
-
Fortran77で多次元配列を並び替...
-
C# DataTable ソートについて
-
excel VBA の条件をつけての列...
-
VBScriptで重複レコードを削除...
-
文字列をソートする方法
-
n番目に大きい数を求めるアル...
-
C言語でアナグラムを求めるプロ...
おすすめ情報