線形リストのソートについて

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

線形リストのソートについて

#1

投稿記事 by ブラブラ » 11年前

線形リストでバブルソートをしているのですが実行結果によってコアダンプをしたりしなかったりします。
やはりソート内がおかしいのでしょうか?指摘をお願いします。

コード:

#include <stdio.h>
#include <stdlib.h>
struct list{
char name[50];//名前
int age;//年齢
struct list *next;
  struct list *back;
};
int main(void){
  int t=1,k;
struct list *data;//初期構造体
data = (struct list *)malloc(sizeof(struct list));//領域確保
struct list *tmp = data;//保存用
struct list *tmp2;//保存用2
 struct list *tmp3;//保存用3
 tmp->back = NULL;
/*入力*/
puts("入力_______________________________________");
while(t){
printf("名前入力:");scanf("%s",tmp->name);
printf("年齢入力:");scanf("%d",&tmp->age);
printf("続行(y/n:1/0):");scanf("%d",&t);
tmp->next = NULL;
if(t==1){
struct list *data2;//新しい領域
data2 = (struct list *)malloc(sizeof(struct list));
tmp->next = data2;
 data2->back = tmp;
tmp = tmp->next;
}
}
/*バブルソート*/
 for(tmp=data;(tmp->next->next)==NULL;tmp=tmp->next){
   for(tmp2=tmp->next;(tmp2->next)==NULL;tmp2=tmp2->next){
     if((tmp->age)>(tmp2->age)){
       if(tmp->back!=NULL)
	 tmp->back->next=tmp2;
       if(tmp2->next!=NULL)
	 tmp2->next->back=tmp;
       tmp3=tmp->next;
       tmp->next=tmp->next->next;
       tmp->back=tmp3;
       tmp3=tmp2->back;
       tmp2->back=tmp2->back->back;
       tmp2->next=tmp3;
       tmp=tmp->back;tmp2=tmp2->next;
     }
   }
 }
/*出力*/
puts("データ___________________________________");
tmp = data;
while(tmp){
printf("%s、%d歳\n",tmp->name,tmp->age);
tmp = tmp->next;
}
return 0;
}


box
記事: 2002
登録日時: 14年前

Re: 線形リストのソートについて

#2

投稿記事 by box » 11年前

とりあえず字下げ(インデント)をきれいにして、
見やすいようにしていただけると助かります。

ここの掲示板に投稿されている他の方々が
どういう風に字下げしているか、ごらんになってみてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

Re: 線形リストのソートについて

#3

投稿記事 by box » 11年前

とりあえず字下げをいじくってみました。ロジックは変えていません。

ついでに、元のコードの36行目と38行目のif文の
勢力範囲を明確にするために { と } を加えました。
質問者さんの意図どおりになっているでしょうか。
何か違うような気がします。

tmp, tmp2, tmp3って、似たような名前を付けて混乱しませんか?

ソートする前(リストに放り込んだままの状態)の
データが意図どおりになっているかどうかを確認する方がよいと思います。

また、双方向リストの前に、単方向リストでのソートがちゃんとできる
コードを勉強する方がいいような気がします。

コード:

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

struct list {
    char name[50];      // 名前
    int age;            // 年齢
    struct list *next;
    struct list *back;
};

int main(void)
{
    int t = 1, k;
    struct list *data;                                      // 初期構造体
    data = (struct list *) malloc(sizeof(struct list));     // 領域確保
    struct list *tmp = data;                                // 保存用
    struct list *tmp2;                                      // 保存用2
    struct list *tmp3;                                      //保存用3
    tmp->back = NULL;

    /* 入力 */
    puts("入力_______________________________________");
    while (t) {
        printf("名前入力:"); scanf("%s", tmp->name);
        printf("年齢入力:"); scanf("%d", &tmp->age);
        printf("続行(y/n:1/0):"); scanf("%d", &t);
        tmp->next = NULL;
        if (t == 1) {
            struct list *data2;                             //新しい領域
            data2 = (struct list *) malloc(sizeof(struct list));
            tmp->next   = data2;
            data2->back = tmp;
            tmp         = tmp->next;
        }
    }

    /* バブルソート */
    for (tmp = data; tmp->next->next == NULL; tmp = tmp->next) {
        for (tmp2 = tmp->next; tmp2->next == NULL; tmp2 = tmp2->next) {
            if (tmp->age > tmp2->age) {
                if (tmp->back != NULL) {
                    tmp->back->next = tmp2;
                }
                if (tmp2->next != NULL) {
                    tmp2->next->back = tmp;
                }
                tmp3       = tmp->next;
                tmp->next  = tmp->next->next;
                tmp->back  = tmp3;
                tmp3       = tmp2->back;
                tmp2->back = tmp2->back->back;
                tmp2->next = tmp3;
                tmp        = tmp->back;
                tmp2       = tmp2->next;
            }
        }
    }

    /* 出力 */
    puts("データ___________________________________");
    tmp = data;
    while (tmp) {
        printf("%s、%d歳\n", tmp->name, tmp->age);
        tmp = tmp->next;
    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

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