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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yuryu

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

#1

投稿記事 by yuryu » 13年前

名前(文字列)、歳を入力したら、それまでに入力した名前と歳を昇順に表示し、次の入力を促す。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

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

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

#2

投稿記事 by たかぎ » 13年前

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

yuryu

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

#3

投稿記事 by yuryu » 13年前

回答ありがとうございます。

>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

fulls
記事: 72
登録日時: 14年前
住所: 埼玉

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

#4

投稿記事 by fulls » 13年前

Cとしてコンパイルする事で解決できたならいいのですが、16行目のnewと言う名前がマズイのでは?
C++でコンパイルする場合、演算子のnewと誤解されるような気がするのですが。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

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

#5

投稿記事 by beatle » 13年前

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

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

non
記事: 1097
登録日時: 14年前

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

#6

投稿記事 by non » 13年前

yuryu さんが書きました: しかし、正しく動作しませんでした;;ちょっとwhile文の範囲とかおかしいと思うので、もう少し考えてみます。
どう正しく動かないかを言ってもらわないと、いまいちわからないのですが。

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

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

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#7

投稿記事 by みけCAT » 13年前

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/
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る