質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1156閲覧

双方向循環リストでのバブルソート

submaru

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2020/08/01 15:08

編集2020/08/01 16:20

前提・実現したいこと

双方向循環リストでのバブルソートを行い、表示したい。

発生している問題・エラーメッセージ

ソート部分のプログラムが正しいかよくわからず、またソート後の表示ができない。
おそらくソートを行う関数で不具合が起こっており、無限ループになる。

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5typedef struct node{ 6 struct node *prev; 7 struct node *next; 8 int value; 9}NODE; 10 11#define DUMMY -1 12#define MAX 99 13#define NUM 10 14 15NODE* make_list(int num); 16NODE* make_cell(int val); 17void insert_cell_to_list(NODE *x, NODE *p); 18NODE* delete_cell_from_list(NODE *x); 19void print_list(NODE *link_list_head); 20void free_list(NODE *link_list_head); 21void bubble_sort_cell(NODE *link_list_head); 22 23int main(void){ 24 NODE *list_head; 25 26 srand((unsigned int)time(NULL)); 27 28 29 list_head=make_list(NUM); 30 printf("ランダムで作成したリストを表示\n"); 31 print_list(list_head); 32 bubble_sort_cell(list_head); 33 printf("バブルソート後\n"); 34 print_list(list_head); 35 printf("\n"); 36 37 free_list(list_head); 38 39 return 0; 40} 41 42NODE* make_list(int num){ 43 NODE *list, *cel, *list_head; 44 int i; 45 46 list=make_cell(DUMMY); 47 list->next=list; 48 list->prev=list; 49 list_head=list; 50 51 for(i=0; i<num; i++){ 52 cel=make_cell(rand()%MAX); 53 list=list->next; 54 insert_cell_to_list(cel, list); 55 } 56 return (list_head); 57} 58 59NODE* make_cell(int val){ 60 NODE *p; 61 62 p=(NODE*)malloc(sizeof(NODE)); 63 64 if (p == NULL) { 65 fprintf(stderr, "Memory allocation error!\n"); 66 exit(-1); 67 } 68 p->value =val; 69 p->next =NULL; 70 p->prev =NULL; 71 return(p); 72} 73 74void insert_cell_to_list(NODE *x, NODE *p){ 75 76 x->prev = p; 77 x->next = p->next; 78 p->next = x; 79 p->next->prev = x; 80} 81 82NODE* delete_cell_from_list(NODE *x){ 83 84 x->prev->next = x->next; 85 x->next->prev = x->prev; 86 87 return (x); 88} 89 90void print_list(NODE *link_list_head){ 91 NODE *p; 92 93 for (p = link_list_head->next; p != link_list_head; p = p->next) { 94 printf("%d\n", p->value); 95 } 96} 97 98void free_list(NODE *link_list_head){ 99 NODE *p, *q; 100 101 p=link_list_head; 102 p->prev->next = NULL; 103 while (p!=NULL){ 104 q=p->next; 105 free(p); 106 p=q; 107 } 108} 109 110 111void bubble_sort_cell(NODE *link_list_head){ 112 NODE *p, *q, *tmp; 113 114 for (p = link_list_head->next; p != link_list_head->prev; p = p->next) { 115 for (q = link_list_head->prev; q != p; q = q->prev) { 116 if (q->value < q->prev->value) { 117 tmp = delete_cell_from_list(q->prev); 118 insert_cell_to_list(tmp, q); 119 } 120 } 121 } 122}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

考えなおしたら解決しました。
回答ありがとうございました。

投稿2020/08/02 03:05

submaru

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2020/08/02 03:21

どのようにして解決したか、書いてもらえませんか? bubble_sort_cell の中の delete_celll_from_list と insert_cell_to_list でリストの入れ替えが あるので、2つの for 文の p = p->next と q = q->prev が正しく機能しないのは分かるんですが。 まさか、value だけを交換するようにしたとかではないでしょうね。
submaru

2020/08/02 06:53

交換をした時にqの更新をしました。あとはfor文の範囲の見直しです。
guest

0

C言語のコードを書くなら、デバッグできる環境を整えましょう。
Eclipseや、WindowsならVisualStudioなど。
コードの任意の場所で実行を止め、変数のナカミを見ることができます。そこから1行づつ実行して、コードの流れを見れるようになります
そうすれば、アテズッポでコードを書かなくて済むようになります。

投稿2020/08/01 22:50

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

全体は見ていませんが、明らかにまずい個所が一つ

C

1void insert_cell_to_list(NODE *x, NODE *p){ 2/*中略*/ 3 p->next = x;      // ここで p->next が x で上書きされるので 4 p->next->prev = x; // これは x->prev = x と自分を参照している 5}

投稿2020/08/01 18:53

e-watt

総合スコア84

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

submaru

2020/08/02 01:23

順番を逆にしたら大丈夫ですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問