###前提・実現したいこと
お世話になります・・・
いくつかの数字を入力して、隣り合う二数が連続した数であるならばその二数をぬいてその処理がなくなるまで行い、結果を出す。というプログラムを考えています。
構造体を勉強したため、何気なくで組んでみましたが、うまく動作せず、見にくいコードになってしまいました。
###発生している問題・エラーメッセージ
隣り合う二数の比較に構造体のメンバをそのまま使っているのですがわかりにくいコードであること。
処理後つなぎ合わせているため、メモリ解放するためにもう一度一からつながなければならないのか。
###該当のソースコード
C
1 2#include<stdio.h> 3#include<stdlib.h> 4#define MAXLINE 11 5 6void get_num(char ary[]); 7 8 9typedef struct _number 10{ 11 short int num; //数字格納 12 struct _number *prev; //ひとつ前の構造体へのポインタを格納 13 struct _number *next; //次の構造体へのポインタを格納 14}array; 15 16 17int main() 18{ 19 int i; //配列の添え字 20 array *p, *start; //アドレスのp、構造体の先頭 21 array *q; //解放のアドレス 22 char num[MAXLINE]; //getchar()の数字を格納 23 short int cnt = 1; //数列整理のカウンタ 24 25 for (i = 0; i < 10; i++) 26 { 27 if (i == 0) 28 { 29 p = malloc(sizeof(array)); //構造体のメモリを確保 30 if (p == NULL) 31 { 32 printf("memory allocattion error\n"); 33 return EXIT_FAILURE; 34 } 35 start = p; //基準、始のアドレスを残しておく 36 p->prev = NULL; 37 38 get_num(num); 39 } 40 else 41 { 42 p->next = malloc(sizeof(array)); //次の構造体用のメモリ確保 43 if (p == NULL) 44 { 45 printf("memory allocattion error\n"); 46 return EXIT_FAILURE; 47 } 48 p->next->prev = p; //次の構造体の前へのポインタに現在のアドレス 49 p = p->next; 50 } 51 p->num = num[i]; //構造体の数字格納メンバに数字を格納 52 } 53 p->next = NULL; //終端NULL 54 55/*数列の隣り合う要素を比較して連続数ならその二つの要素をとばす*/ 56 p = start; 57 while (cnt != 0) 58 { 59 if (p->next==NULL) 60 p = start; 61 cnt = 0; 62 if ((p->num + 1 == p->next->num) || (p->num == p->next->num + 1)) 63 { 64 if (p == start) { 65 p = p->next->next->next; 66 cnt++; 67 } 68 else { 69 p->prev->next = p->next->next; 70 cnt++; 71 } 72 } 73 p = p->next; 74 } 75 76 p = start; 77 while (1) 78 { 79 printf(" %d", p->num); 80 p = p->next; 81 if (p->next == NULL) 82 break; 83 } 84 85 86 87 /*動的確保したメモリの解放*/ 88 p = start; //保存していた基準のアドレスに 89 while (p != NULL) //終端NULLになるまで 90 { 91 q = p; //解放用でまわすqにp(pのメモリを消す為) 92 p = p->next; //次に移動 93 free(q); //解放 94 95 } 96 97 return 0; 98} 99 100 101void get_num(char ary[]) //数字の文字列を格納する関数 102{ 103 short int k, c; 104 for (k = 0; k <10 && (c = getchar()) != '\r'; k++) 105 ary[k] = c - '0'; 106 ary[k] = '\0'; 107 108 while (getchar() != '\n'); 109} 110 111
今回聞きたくて該当になる部分はここになります。
/*数列の隣り合う要素を比較して連続数ならその二つの要素をとばす*/ p = start; while (cnt != 0) { if (p->next==NULL) p = start; cnt = 0; if ((p->num + 1 == p->next->num) || (p->num == p->next->num + 1)) { if (p == start) { p = p->next->next->next; cnt++; } else { p->prev->next = p->next->next; cnt++; } } p = p->next; } p = start; while (1) { printf(" %d", p->num); p = p->next; if (p->next == NULL) break; }
###試したこと
当初は配列で考えたのですが、処理後配列の長さが変わるということで可変型が言いと思い、構造体にしました。
このコードで 0123456789 と入力すると 01236 となるため、まだ変数の扱いが間違っているのは把握してます。
うまい表現方法などがあれば教えていただけると幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/13 00:08
2017/07/13 01:36
2017/07/13 01:37
2017/07/13 01:54
2017/07/13 02:02
2017/07/13 02:19 編集
2017/07/13 02:25
2017/07/13 02:43 編集
2017/07/13 02:46
2017/07/13 02:51
2017/07/13 03:00
2017/07/13 03:10