• 締切済み

リストの削除について

以下のようなプログラムを作ったのですが、このプログラムに削除をする関数を加えたいです。 たとえば削除する値2と入力した場合 1 3 7 8 9 15 19 20と表示させたいのですがどのように行えばよいでしょうか? 自分が作った削除の関数だとうまくできませんでした。どうしたらよいのでしょうか? よろしくお願いします。 #include<stdio.h> #define NUM 12 typedef struct{ int IntData; int NextIndex; } MyList; void ShowList(MyList data[]); int DeleteALL(int value,MyList data[]); int main(void) { int i; int datano=NUM; int dt[NUM]={1,2,2,3,2,7,8,9,15,19,20,2}; int del=0,temp=0,del=0; char sentaku[3]; MyList data[NUM]; for(i=0;i<datano;i++){ data[i].IntData=dt[i]; data[i].NextIndex=i+1; } data[NUM-1].NextIndex=-1; ShowList(data); while(1){ printf("選択(削除=v, 編集終了=q):"); scanf("%s",sentaku); if(sentaku[0]=='v'){ printf("削除する値:"); scanf("%d",&del); temp=DeleteALL(del,data) printf("%d つのノードを削除しました\n",temp); ShowList(data); } else if(sentaku[0]=='q'){ return 0; } else{puts("もう一度入力");} } } void ShowList(MyList data[])//表示する関数 { int i=0; printf("リスト: "); while(i!=-1){ printf("%d ",data[i].IntData); i=data[i].NextIndex; } printf("\n"); } /* 以下自分が作った削除の関数 */ int DeleteALL(int value,MyList data[]) { int i=0,dn=0,count=1; while(data[i].NextIndex!=-1){ i=data[i].NextIndex; dn++; } for(i=0;i<dn;i++){ if(value==data[i].IntData){ count++; data[i-1].NextIndex=data[i].NextIndex; data[i].NextIndex=-1; } return count; }

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.7

>>countは削除した数ですので問題はありません。 >とありますが、DeleteALL()関数開始時点ではまだ一つの要素も削除し >ていないはずですので、いきなり1が入るのは問題ではないでしょう >か? そうです。大問題です。 削除した数である以上、初期値は「ゼロ」に決まっていますね。

jack_242
質問者

お礼

ご指摘頂いた通りでした。ありがとうございます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.6

データの持ち方がまずいと思います 削除データをNextIndexを-にする データの最後に最後を示すダミーのデータを置く としておいた方がいいように思います 現状の-1を削除データとした場合 先頭のデータ『1』を削除すると ShowListでは何も表示できなくなります #5氏の回答にある data[i-1].NextIndex=data[i].NextIndex の部分も i-1が -1になってしまい構造体配列以外のデータを書き換えようとします

  • E-Yu
  • ベストアンサー率40% (2/5)
回答No.5

DeleteALL()関数にバグがあるようです。 まず一点。 int count=1; >countは削除した数ですので問題はありません。 とありますが、DeleteALL()関数開始時点ではまだ一つの要素も削除していないはずですので、いきなり1が入るのは問題ではないでしょうか? >while(data[i].NextIndex!=-1){ >i=data[i].NextIndex; >dn++; >} で「data[i].NextIndex != -1」であったとき、最後のdata[i]の数がカウントされていないのではないでしょうか? そして最後の一点。これは一目見て「ん?これで大丈夫なのか?」と思った点です。 DeleteALL()関数のfor文中の >data[i-1].NextIndex=data[i].NextIndex; の部分です。 i-1というのが非常に危険な匂いを醸し出しています。今回のバグの大きな原因はここにあります。 削除要素が2個並んでいた場合、2回目の >data[i-1].NextIndex=data[i].NextIndex; で問題が発生します。 リスト上一つ前の要素ではなく、削除した要素を書き換えてしまっているためです。 流れ的にはこんな感じ? 値          1,2,2 次へのインデックス  1,2、-1    ↓ 1つ目の2を削除 値          1,2,2 次へのインデックス  2、2、-1    ↓ 2つ目の2を削除 値          1,2,2 次へのインデックス  2、-1、-1 一度DeleteALL()関数実行中に 実行経過を出力してみてはいかがでしょうか?デバッガが使えるのであれば、そちらで確認するのもいいと思います。

jack_242
質問者

お礼

回答ありがとうございます。 私の作った関数だと削除するノードが2つ続いていない場合は問題は無かったのですが(ご指摘頂いたcount以外) 連続した場合に結果がおかしくなってしまいます。

回答No.4

#include <stdio.h> #include <stdlib.h> typedef struct list{ int v; struct list *next; } LIST; int dela(int *a, int n, int m) { int i, j; for(i = j = 0; i < n; i ++){ a[j] = a[i]; if(a[j] != m) j ++; } return n - j; } void showa(int *a, int n) { int i; for(i = 0; i < n; i ++) printf("%d ", a[i]); putchar('\n'); } void freelist(LIST *l) { LIST *p; for(p = l; p; p = l){ l = l->next; free(p); } } int makelist(LIST **l, int *a, int n) { LIST *p; int i; *l = NULL; for(i = 0; i < n; i ++){ if((p = malloc(sizeof(LIST))) == NULL){ freelist(*l); return 0; } p->v = a[i]; p->next = *l; *l = p; } return 1; } int dell(LIST **l, int n) { LIST h, *p = &h, *q; int i = 0; for(h.next = *l; p->next; ){ if(p->next->v == n){ q = p->next; p->next = p->next->next; free(q); i ++; } else p = p->next; } *l = h.next; return i; } void showl(LIST *l) { if(!l) return; showl(l->next); printf("%d ", l->v); } int main(void) { LIST *l; int a[12] = {1, 2, 2, 3, 2, 7, 8, 9, 15, 19, 20, 2}; int n = 12, m; /* リスト */ makelist(&l, a, n); showl(l); m = dell(&l, 2); printf("\n%d\n", m); showl(l); freelist(l); putchar('\n'); /* 配列 */ showa(a, n); m = dela(a, n, 2); printf("%d\n", m); showa(a, n - m); return 0; }

jack_242
質問者

お礼

回答ありがとうございます。 参考書などを読んでポインタを使えばできるということは分かっているのですが、どうしても配列のみで表現したいのです。 ご回答頂いた関数dellは配列で表すとどのようになるのでしょうか? よろしくお願いします。

  • crew21
  • ベストアンサー率26% (58/222)
回答No.3

質問者さんの話は、(本当の意味の)削除ではなく、番号を飛ばして表示するようなものですよね。 だとすると(コンパイルしてないから細かな文法エラーは出るかもしれんがそれは勘弁してもらうとして) void tobashi2(MyList dat[]) { for(int i=0; i<NUM; i++ ) { if(dat[i].IntData != 2 ) { printf("%d ", dat[i]); } } } みたいなのでは、ダメなのん?

jack_242
質問者

補足

ご回答ありがとうございます。NextIndexを変えることによってデータを表示させなくするということです。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

さしあたり、DeleteALL関数で、  ・countの初期値は1でよいでしょうか?  ・dnの値は正しいですか?

jack_242
質問者

補足

countは削除した数ですので問題はありません。 dnの値も11と12とした場合どちらも結果が同じでした。 私自身では data[i-1].NextIndex=data[i].NextIndex; data[i].NextIndex=-1; この部分が何か間違っていることは分かっているのですが、どうした良いのかがわからない状態です。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

提示されたコードをそのままコンパイルしようとすると、エラーが出ます。 さしあたり、コンパイルエラーが出ないコードを 提示してくださいますか?

jack_242
質問者

補足

すみませんでした。以下のプログラムでコンパイルエラーは出ないはずです。よろしくお願いします。 #include<stdio.h> #define NUM 12 typedef struct{ int IntData; int NextIndex; } MyList; void ShowList(MyList data[]); int DeleteALL(int value,MyList data[]); int main(void) { int i; int datano=NUM; int dt[NUM]={1,2,2,3,2,7,8,9,15,19,20,2}; int del=0,temp=0; char sentaku[3]; MyList data[NUM]; for(i=0;i<datano;i++){ data[i].IntData=dt[i]; data[i].NextIndex=i+1; } data[NUM-1].NextIndex=-1; ShowList(data); while(1){ printf("選択(削除=v, 編集終了=q):"); scanf("%s",sentaku); if(sentaku[0]=='v'){ printf("削除する値:"); scanf("%d",&del); temp=DeleteALL(del,data); printf("%d つのノードを削除しました\n",temp); ShowList(data); } else if(sentaku[0]=='q'){ return 0; } else{puts("もう一度入力");} } } void ShowList(MyList data[])//表示する関数 { int i=0; printf("リスト: "); while(i!=-1){ printf("%d ",data[i].IntData); i=data[i].NextIndex; } printf("\n"); } /* 以下自分が作った削除の関数 */ int DeleteALL(int value,MyList data[]) { int i=0,dn=0,count=1; while(data[i].NextIndex!=-1){ i=data[i].NextIndex; dn++; } for(i=0;i<dn;i++){ if(value==data[i].IntData){ count++; data[i-1].NextIndex=data[i].NextIndex; data[i].NextIndex=-1; }} return count; }

関連するQ&A

  • 双方向リスト 指定行の削除について

    現在、双方向リストを使用したプログラミングを作成しています。 コマンドラインから指定したファイルを読み込み、各行の文字列を データとする構造体に記録する。ひとつの構造体に1行の文字列を 記録し、それらの構造体を、行の順番に従ってつながった双方向 リスト構造として、ファイル全体を記録する。 さらに、キーボードから指定した行番号の行を削除する処理を行った後に、再度リストを順方向に表示する・・・といった内容です。 文字列を順、逆順ともに表示できるところまではできたのですが、肝心の行の削除の仕方がわからなくて、困ってます。 具体的には、入力した値をどのように関数に当てはめるのか、つまり行削除の関数の処理をどうすればよいのかがわかりません。 ↓は途中のプログラムです。 fcloseの上にキーボード入力と処理後の表示のコマンド、 一番最後のほうにリスト削除用の関数を入力するのだと思いますが・・・。 OSはLinuxです。 回答宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define LINE 1000 typedef struct num{ char line[LINE]; struct num *next; struct num *prev; }Num; void normal(Num **,Num **,char *); void reverse(Num *,Num *,char *); int main(int argc,char *argv[]) { FILE *fp; char line[LINE]; int i=0,j; Num *head,*tail,*p; head=NULL; tail=NULL; fp=fopen("test.txt","r"); if(fp==NULL){ fprintf(stdout,"File not found.\n"); exit(1); } while(fgets(line,LINE,fp)!=NULL) { normal(&head,&tail,line); } p=head; while(p!=tail){ printf("%s\n",p->line); p=p->next; } printf("%s\n",p->line); p=tail; while(p!=head){ printf("%s\n",p->line); p=p->prev; } printf("%s\n",p->line); fclose(fp); return 0; } void normal(Num **s,Num **e,char *g){ Num *tmp; int i; if(*s==NULL){ *s=(Num *)malloc(sizeof(Num)*1); (*e)=(*s); for(i=0;((g[i]!='\0')&&(g[i]!='\n'));i++){ (*s)->line[i]=g[i];} (*s)->next=*e; (*s)->prev=*s; } else{ tmp=(Num *)malloc(sizeof(Num)*1); for(i=0;((g[i]!='\0')&&(g[i]!='\n'));i++){ tmp->line[i]=g[i];} tmp->prev=(*e); (*e)->next=tmp; tmp->next=(*e); (*e)=tmp; } return ; } void reverse(Num *kan1,Num *kan2,char *g){ Num *tmp; int i; tmp=(Num *)malloc(sizeof(Num)*1); for(i=0;((g[i]!='\0')&&(g[i]!='\n'));i++){ tmp->line[i]=g[i];} tmp->prev=kan1; kan1->next=tmp; tmp->next=kan2; kan2->prev=tmp; return ; }

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • 双方向リストのプログラミングのチェック

    指定したファイルを読み込み、一行ずつ構造体に保存し、表示させる。その後、キーボードから指定した行を削除し、処理後の結果を表示させる・・・といったプログラミングを作成しています。 通常の表示の部分はできましたが、後は指定した行の削除の部分ができません。 あらかじめHPで調べてあるので、削除するときは、その削除したい行をまたいで、前後のリストを繋げるといった概念的なのは大体理解できました。 自分なりに考えたり調べて、下のように打ちました。 ですが、キーボードから入力した値をどう関数に対応させていくのか、 delete_head,delete_tailの関数の部分に出る、head,tailは使えない的なエラーの対処の仕方がわからなく、詰まってます。 アドバイス、他にも直す場所等ありましたらお願いします。 #include<stdio.h> #include<stdlib.h> #define LINE 1000 typedef struct num{ char line[LINE]; struct num *next; struct num *prev; }Num; void normal(Num **,Num **,char *); void reverse(Num *,Num *,char *); void delete_head(void); void delete_tail(void); void delete(Num *target); int main(int argc,char *argv[]) { FILE *fp; char line[LINE]; int i=0,j; Num *head,*tail,*p; head=NULL; tail=NULL; fp=fopen("test.txt","r"); if(fp==NULL){ fprintf(stdout,"File not found.\n"); exit(1); } while(fgets(line,LINE,fp)!=NULL) { normal(&head,&tail,line); } p=head; while(p!=tail){ printf("%s\n",p->line); p=p->next; } printf("%s\n",p->line); p=tail; while(p!=head){ printf("%s\n",p->line); p=p->prev; } printf("%s\n",p->line); printf("input number\n"); scanf("%d",&j); p=head; for(i=0;i<=j;i++);{ p=p->next; } if(p==head){ delete_head(void); } else if(p==tail){ delete_tail(void); } else{ delete(p->prev); } p=head; while(p!=tail){ printf("%s\n",p->line); p=p->next; } printf("%s\n",p->line); fclose(fp); return 0; } void normal(Num **s,Num **e,char *g){ Num *tmp; int i; if(*s==NULL){ *s=(Num *)malloc(sizeof(Num)*1); (*e)=(*s); for(i=0;((g[i]!='\0')&&(g[i]!='\n'));i++){ (*s)->line[i]=g[i];} (*s)->next=*e; (*s)->prev=*s; } else{ tmp=(Num *)malloc(sizeof(Num)*1); for(i=0;((g[i]!='\0')&&(g[i]!='\n'));i++){ tmp->line[i]=g[i];} tmp->prev=(*e); (*e)->next=tmp; tmp->next=(*e); (*e)=tmp; } return ; } void reverse(Num *kan1,Num *kan2,char *g){ Num *tmp; int i; tmp=(Num *)malloc(sizeof(Num)*1); for(i=0;((g[i]!='\0')&&(g[i]!='\n'));i++){ tmp->line[i]=g[i];} tmp->prev=kan1; kan1->next=tmp; tmp->next=kan2; kan2->prev=tmp; return ; } void delete_head(void){ Num *second=head->next; if(secound==NULL){ free(head); head=NULL; tail=NULL; } else{ second->prev=NULL; free(head); head=second; } } void delete_tail(void){ Num *second_last=head->prev; if(second_last==NULL){ free(tail); head=NULL; tail=NULL; } else{ second_last->next=NULL; free(tail); tail=second_last; } } void delete(Num *target){ Num *after_target; Num *before_target; after_target=target->next; before_target=target->prev; after_target->prev=target->prev; before_target->next=target->next; free(target); }

  • 至急!教えてください。

    #include <stdio.h> #include <windows.h> #define COUNT (3) struct Seiseki{ char name[20]; int score1; int score2; int score3; int score4; int score5; int average; }; int getValue(char str[], char temp[], int n){ memset(temp, 0, 19); while(*(str+n) == ' '){ n++; } int i = 0; while(*(str+n) != ' ' && *(str+n) != 0){ temp[i] = *(str+n); i++; n++; } return n; } void getAverage(Seiseki *seiseki){ int total = seiseki->score1 + seiseki->score2 + seiseki->score3 + seiseki->score4 + seiseki->score5; seiseki->average = total / 5; } void getSeiseki(Seiseki seiseki[]){ char temp[20]; char str[256]; for(int i = 0; i < COUNT; i++){ printf_s("%d 人目の点数と名前 > ", i+1); memset(str, 0, 255); gets(str); int n = 0; n = getValue(str, temp, n); strcpy(seiseki[i].name, temp); n = getValue(str, temp, n); seiseki[i].score1 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score2 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score3 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score4 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score5 = atoi(temp); getAverage(&seiseki[i]); } } void showSeiseki(Seiseki seiseki[]){ for(int i = 0; i < COUNT; i++){ printf("%d %s %d %d %d %d %d\n", i+1, seiseki[i].name, seiseki[i].score1, seiseki[i].score2, seiseki[i].score3, seiseki[i].score4, seiseki[i].score5, seiseki[i].average); } } void showScoresAverage(Seiseki seiseki[]){ int total1 = 0; int total2 = 0; int total3 = 0; int total4 = 0; int total5 = 0; for(int i = 0; i < COUNT; i++){ total1+=seiseki[i].score1; total2+=seiseki[i].score2; total3+=seiseki[i].score3; total4+=seiseki[i].score4; total5+=seiseki[i].score5; } int ave1 = total1 / COUNT; int ave2 = total2 / COUNT; int ave3 = total3 / COUNT; int ave4 = total4 / COUNT; int ave5 = total5 / COUNT; printf_s("\naverage %d %d %d %d %d\n",ave1, ave2, ave3, ave4, ave5); } void main(){ Seiseki seiseki[COUNT]; printf_s("生徒 %d 名分の成績を入力してください:\n", COUNT); getSeiseki(seiseki); printf_s("\n成績表\n# NAME #1 #2 #3 #4 #5 average\n"); showSeiseki(seiseki); showScoresAverage(seiseki); } 間違っている点がありますか? ありましたらどこに入れるか教えてください。 改良点などありましたらお願いします。

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。

  • 文字列str内の全ての数字を削除する関数

    文字列str内の全ての数字を削除する関数 void del_digit(char str[]) を作成。 (例えば、"ab1C9"を受け取ったら、"ABC"にする) という関数を作りたいのですが、うまくいきません。 過去に似たような『文字列内の数字削除』の質問をされた方が いましたが、ポインタを使っていました。 http://okwave.jp/qa1775576.html ポインタを使わずにするには、どうしたらよいのでしょうか? 途中まで作ってみたのですが、うまく動きません。 #include <stdio.h> #include <ctype.h> void del_digit(char str[]) {     unsigned i = 0, j = 0;     char ctr[] = {'0'};     while (str[i] != '\0') {           ctr[i] = str[i];           i++;     }     i = 0;     while (ctr[i] != '\0') {           if (ctr[i] < '0' || ctr[i] > '9') {              str[j] = toupper(ctr[i]);              j++;           }           i++;     }     str[j] = '\0'; } int main(void) {     char str[100];     printf("文字列を入力してください:");     scanf("%s", str);     del_digit(str);     printf("%s\n", str);     return (0); }

  • 配列のサイズを動的に拡張

    お世話になっております。 配列のサイズを動的に拡張について悩んでおります。例えばint x[5]という配列があって、データが埋まったら動的にx[6]にする・・ っといったものです。自分で試行錯誤した結果、以下のようなプログラムを作成しました。 int *data,count=0,num=10;// グローバル変数 // 配列にデータを加える関数add void add(int t){  if(count+1>num){ // サイズを超えたら配列をサイズを+1    int i,*tmp_data;    tmp_data = new int [count];    for(i=0;i<num;i++) tmp_data[i] = data[i]; // 一時的に保存    delete[] data; // 古いのを消す    data = new int [num+1]; // 新しく作る    for(i=0;i<num;i++) data[i] = tmp_data[i]; // 新しいのにコピー    num+=1; // 最大値をプラス    data[count]=t;    delete[] tmp_data;  }  else data[count]=t;  count++; // 入力されたカウントをプラス } main関数内で、data = new int [10];と宣言し、add(3);のように使用しています。またnewのメモリ確保のエラー処理は省いております。 動くことは動くのですが・・ご覧の通り、グローバル変数が3つになり、データをコピーしたりと、複雑になってしまいました。 もっと簡単に出来るのでは・・っと思い質問させて頂きました。 こうすれば、もっと簡単になるよ!など。。ご回答頂ければ幸いです。

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • 構造体配列とポインタについて

    いつもお世話になっています。 皆様には、本当にお世話になっています。 先日、皆様にアドバイスをいただいたのですが、私の勉強不足で結局・・・並び替えて表示できなかったです。 大変申し訳ないのですが、どこがダメなのか教えてください。 /********************/ /*--- 英単語辞書 ---*/ /********************/ #include <stdio.h> #include <string.h> #define NUMBER 50 /*登録数*/ #define MAX_NAME 20 /*単語の最大文字数*/ #define MAX_WAYAKU 30 /*和訳の最大文字数*/ /************************/ /*--- 単語帳の構造体 ---*/ /************************/ typedef struct { char name[MAX_NAME]; /*単語*/ char wayaku[MAX_WAYAKU]; /*和訳*/ }words; /***********************************************/ /*----- 単語の交換 -----*/ /***********************************************/ void swaps(words x, words y) { words temp = x; temp = x; x = y; y = temp; } /************************************************/ /*------ 単語と和訳の登録 ------*/ /* 関数tourokuword()は引数words tango[]の、イン*/ /*クリメントしたtango_counの順番に格納する。  */ /************************************************/ void tourokuword(words tango[], int tango_count) { char word[MAX_NAME]; /*単語の名前*/ char wa[MAX_WAYAKU]; /*単語の和訳*/ int i = 0; int j; printf("[単語]:"); scanf("%s", word); /*単語を単語帳に登録*/ strcpy(tango[tango_count].name, word); printf("[和訳]:"); scanf("%s", wa); /*和訳を単語帳に登録*/ strcpy(tango[tango_count].wayaku, wa); for( i = 0; i < tango_count; i++){ if(strcmp(tango[tango_count].name, tango[i].name) > 0){ swaps(tango[tango_count], tango[i]); } } } /***********************************************/ /*----- 登録された単語を表示する -----*/ /* 関数printword()は引数words tango[]の、イン */ /*クリメントしたtango_counの並び替えて表示する */ /***********************************************/ void printword(words tango[], int tango_count) { int i = 0; puts("登録されている単語を表示します。\n"); for (i = 0 ; i < tango_count; i++) { printf("[単語]:%s\n", tango[i].name); /*単語の表示*/ printf("[和訳]:%s\n", tango[i].wayaku); /*和訳の表示*/ } } /****************/ /*--- メイン ---*/ /****************/ int main(void) { words tangochou[NUMBER]; /*単語帳に50件登録*/ int menu_num; /*メニュー番号*/ int slct_num; /*選択番号*/ int tango_count = 0; /*登録数のカウント*/ while(1){ /****************************/ /*--- メニュー番号の入力 ---*/ /****************************/ do { printf("1・・・登録. 2・・・表示. 3・・・終了.\n"); printf("メニュー番号を入力してください。:"); scanf("%d", &menu_num); /*メニュ番号の入力*/ if (menu_num > 0){ break; } }while(menu_num != 0); /*メニュ番号が該当しない時は再入力*/ switch (menu_num){ case 1 :/*--- メニュー 1:単語と和訳の登録 ---*/ while(1) { if (tango_count < NUMBER){ printf("英単語と和訳を入力してください。:\n"); /*単語と和訳の登録*/ tourokuword(tangochou, tango_count); tango_count++; }else { puts("50件以上です。\n"); return 0; /*50件以上は終了する*/ } /*登録を続けるか?*/ printf("続けますか【Yes・・・1/No…0】:"); scanf("%d", &slct_num); if(slct_num != 1){ /*0なら終了。1なら継続。*/ break; } } break; case 2 :/*--- メニュー 2:登録された単語と和訳の表示 ---*/ printword(tangochou, tango_count); /*単語と和訳の表示*/ break; case 3 :/*--- メニュー 3:終了 ---*/ puts("終了します。\n"); return (0); default:/*--- メニュー 4:非メニュー番号の処理 ---*/ puts("メニュー番号が間違っています。"); break; } } return (0); }

  • ループ

    #include<stdio.h> int main(void) { int i=1,sum=0; int num=1; while(num>0) { printf("整数を入力してください。(マイナスの値で終了)\n"); scanf("%d",&num); printf("%dが入力されました。(%d番目の繰り返しです)\n",num,i); sum+=i; printf("1から%dまでをたすと%dです。\n",i,sum); i++; } printf("繰り返しが終わりました。\n"); printf("加算値は%dです。\n",sum); printf("%d回繰り返しました。\n",i); return 0; } このプログラムで101以上の数値は加算しないようにするにはどうすればいいですか。