前提・実現したいこと
双方向循環リストでのバブルソートを行い、表示したい。
発生している問題・エラーメッセージ
ソート部分のプログラムが正しいかよくわからず、またソート後の表示ができない。
おそらくソートを行う関数で不具合が起こっており、無限ループになる。
該当のソースコード
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}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/02 03:21
2020/08/02 06:53