前提・実現したいこと
双方向循環リストでの選択ソートを削除と挿入をもって実装したい。
発生している問題・エラーメッセージ
交換にあたるコードがわからない。
また、書いてみたが無限ループや完璧でないソートになった。
該当のソースコード
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 selection_sort_cell(NODE *link_list_head); 22 23int main(void){ 24 NODE *list_head; 25 26 srand((unsigned int)time(NULL)); 27 28 list_head=make_list(NUM); 29 printf("ランダムで作成したリストを表示\n"); 30 print_list(list_head); 31 selection_sort_cell(list_head); 32 printf("選択ソート後\n"); 33 print_list(list_head); 34 printf("\n"); 35 36 free_list(list_head); 37 38 return 0; 39} 40 41NODE* make_list(int num){ 42 NODE *list, *cel, *list_head; 43 int i; 44 45 list=make_cell(DUMMY); 46 list->next=list; 47 list->prev=list; 48 list_head=list; 49 50 for(i=0; i<num; i++){ 51 cel=make_cell(rand()%MAX); 52 list=list->next; 53 insert_cell_to_list(cel, list); 54 } 55 return (list_head); 56} 57 58NODE* make_cell(int val){ 59 NODE *p; 60 61 p=(NODE*)malloc(sizeof(NODE)); 62 if (p == NULL) { 63 fprintf(stderr, "Memory allocation error!\n"); 64 exit(-1); 65 } 66 p->value =val; 67 p->next =NULL; 68 p->prev =NULL; 69 return(p); 70} 71 72void insert_cell_to_list(NODE *x, NODE *p){ 73 74 x->prev = p; 75 x->next = p->next; 76 p->next->prev = x; 77 p->next = x; 78} 79 80NODE* delete_cell_from_list(NODE *x){ 81 82 x->prev->next = x->next; 83 x->next->prev = x->prev; 84 return (x); 85} 86 87void print_list(NODE *link_list_head){ 88 NODE *p; 89 90 for (p = link_list_head->next; p != link_list_head; p = p->next) { 91 printf("%d\n", p->value); 92 } 93} 94 95void free_list(NODE *link_list_head){ 96 NODE *p, *q; 97 98 p=link_list_head; 99 p->prev->next = NULL; 100 while (p!=NULL){ 101 q=p->next; 102 free(p); 103 p=q; 104 } 105} 106 107void selection_sort_cell(NODE *link_list_head){ 108 NODE *p, *q, *low, *tmp; 109 110 for (p = link_list_head->next; p != link_list_head->prev; p = p->next) { 111 low = p; 112 for (q = p->next; q != link_list_head; q = q->next) { 113 if (low->value > q->value) { 114 low = q; 115 } 116 } 117 /* ここからソート(未完成) */ 118 tmp = delete_cell_from_list(low); 119 insert_cell_to_list(tmp, p); 120 tmp = delete_cell_from_list(p); 121 insert_cell_to_list(tmp, low->prev); 122 p = p->next; 123 } 124}
試したこと
ソート部分を自分が考えたように書いたが、うまくいかなかった。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/02 17:43