ページ 11

リスト構造の問題なのですが;

Posted: 2012年1月29日(日) 23:20
by yuryu
名前(文字列)、歳を入力したら、それまでに入力した名前と歳を昇順に表示し、次の入力を促す。CTL-d を押すと終了する。


実行例

名前と歳をスペースで区切って入力して下さい
tanaka 22
現在のリスト
tanaka 22
名前と歳をスペースで区切って入力して下さい
satou 40
現在のリスト
tanaka 22
satou 40
名前と歳をスペースで区切って入力して下さい
watanabe 35
現在のリスト
tanaka 22
watanabe 35
satou 40
名前と歳をスペースで区切って入力して下さい
abe 37
現在のリスト
tanaka 22
watanabe 35
abe 37
satou 40
名前と歳をスペースで区切って入力して下さい
[CTR-d]


上のようなプログラムを作成せよ という学校の課題なのですが、自分でやってみたところエラーがでてしまい、なにがどういけないのか、どうなおせばよいのかさっぱりわかりません;

自分は初心者で、自分の書いたプログラムをすべて説明できるレベルになく(ポインタあたりから徐々についていけなくなってきました・・)、例題などとにらめっこしつつ、なんとかやっているレベルです;

↓が自分が作ってみたものです。

コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct list 
{
 char name[20];
 int age;
 struct list *next;
};

int main(void)
{

 struct list *head;
 struct list *dummy, *new, *prev, *current;

 dummy=(struct list *)malloc(sizeof(struct list));
 strcpy( dummy->name,"");
 dummy->age=0;
 dummy->next=NULL;
 head=dummy;


  while((new = (struct list *)malloc(sizeof(struct list)) ))
  {
      printf("名前と歳をスペースで区切って入力して下さい\n");
      if(scanf("%s%d", new->name,&new->age)==EOF)break;
      current=head;
      prev=head;

      while( current!=NULL %% new->age > current->age)
      {
          prev=current;
          current=current->next; /* 次の要素へ進む */
      }
  
      new->next=current; /* 新しい要素の次の要素へのアドレスを設定 */
      prev->next=new;  /* 新しい要素の直前の要素のnextに、新しい要素のアドレスを設定 */
  
   }
   
   printf("現在のリスト\n");
       while(head!=NULL)
	   {
           printf("    %20s %d\n",head->name,head->age);
	       head=head->next;
       }
 

 free(dummy);

 return 0;

 }

そしてでたエラーメッセージ(行番号より左を省略してあります)が

(16): error C2059: 構文エラー : 'new'
(25): error C2059: 構文エラー : '='
(25): fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。

です。コンパイラ?はMicrosoft Visual C++ 2010 Express というものです。


どこを直せばよいのか教えていただきたいです。よろしくお願いしますm(_ _)m

Re: リスト構造の問題なのですが;

Posted: 2012年1月30日(月) 00:39
by たかぎ
エラーの直接の原因は、おそらくC++としてコンパイルしようとしていることでしょう。
Cとしてコンパイルすれば、発生しているエラーは消えるはずです。
ただし、少なくとも、もう一か所問題点があります。
32行目の%%は&&の間違いではないでしょか?

Re: リスト構造の問題なのですが;

Posted: 2012年1月30日(月) 01:40
by yuryu
回答ありがとうございます。

>32行目の%%は&&の間違いではないでしょか?
おっしゃるとおり間違えていました;

調べてみて、Cコードとしてコンパイルしてみたところ、
(19): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
(28): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
と警告はでましたが、コンパイルできました。

しかし、正しく動作しませんでした;;ちょっとwhile文の範囲とかおかしいと思うので、もう少し考えてみます。ありがとうございましたm(__)m

Re: リスト構造の問題なのですが;

Posted: 2012年1月30日(月) 05:40
by fulls
Cとしてコンパイルする事で解決できたならいいのですが、16行目のnewと言う名前がマズイのでは?
C++でコンパイルする場合、演算子のnewと誤解されるような気がするのですが。

Re: リスト構造の問題なのですが;

Posted: 2012年1月30日(月) 07:32
by beatle
pefs3d さんが書きました:Cとしてコンパイルする事で解決できたならいいのですが、16行目のnewと言う名前がマズイのでは?
C++でコンパイルする場合、演算子のnewと誤解されるような気がするのですが。
この問題は既に解決されているようです.

yuryuさんへ.C言語がよく分からないってのは勉強不足ですから仕方ないですが,字下げ(インデント)は誰でもできることです.そこからレベル上げましょう.
チェック3 : インデントを揃えようを熟読してください.

Re: リスト構造の問題なのですが;

Posted: 2012年1月30日(月) 09:28
by non
yuryu さんが書きました: しかし、正しく動作しませんでした;;ちょっとwhile文の範囲とかおかしいと思うので、もう少し考えてみます。
どう正しく動かないかを言ってもらわないと、いまいちわからないのですが。

1 表示はループの中にないと、実行例のようになりません。
 そのとき、headは動かさないように別の変数にしましょう。できれば、関数にしましょう。

2 freeはmallocした回数行います。いまのままでは、1個しかfreeされてません。

3 CTRL-dを使うのはUNIXです。

Re: リスト構造の問題なのですが;

Posted: 2012年1月30日(月) 21:21
by みけCAT
yuryu さんが書きました:調べてみて、Cコードとしてコンパイルしてみたところ、
(19): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
(28): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
と警告はでましたが、コンパイルできました。
これはVC++特有の警告ですね。
Dev-C++を使えばこのような警告はでないと思います。
http://www.bloodshed.net/devcpp.html
http://sourceforge.jp/projects/dev-cpp-jp/releases/