質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

12553閲覧

【C言語】スタックをリストで実現するプログラム

drumath2237

総合スコア91

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/10/03 09:54

毎度お世話になっております。

高橋麻奈さんの「やさしいC アルゴリズム」をみて勉強しているのですが、リストを使ったスタックのコードで、がコンパイルエラーになってしまいました。
コードは下の通りです。

C

1#include <stdio.h> 2#include <malloc.h> 3 4void init(void); 5void add(void); 6void push(stack *s,int n); 7void delete(void); 8int pop(void); 9void display(void); 10void release(void); 11 12typedef struct _stack { 13 int data; 14 struct _stack *next; 15}stack; 16 17stack *head; 18 19int main(void) 20{ 21 int res; 22 23 init(); 24 while (1) { 25 printf("1--add\t2--delete\t3--show\t0--exit\n"); 26 scanf("%d\n", &res); 27 if (!res) { 28 break; 29 } 30 switch (res) { 31 case 1: 32 add(); 33 break; 34 case 2: 35 delete(); 36 break; 37 case 3: 38 display(); 39 break; 40 } 41 } 42 release(); 43 44 return 0; 45} 46void init() 47{ 48 head=NULL; 49 50} 51void add(void) 52{ 53 stack *s; 54 int n; 55 56 s=(stack*)malloc(sizeof(stack)); 57 if (s==NULL) { 58 printf("error\n"); 59 return ; 60 } 61 62 printf("put number\n"); 63 scanf("%d\n", &n); 64 push(s,n); 65 printf("%d has added.\n"); 66 67} 68void push(stack *s,int n) 69{ 70 s->data=n; 71 s->next=head; 72 head=s; 73} 74void delete(void) 75{ 76 printf("%d has just deleted \n",pop()); 77 78} 79int pop() 80{ 81 stack *s; 82 int n; 83 84 s=head; 85 86 n=s->data; 87 head=s->next; 88 free(s); 89 return n; 90 91} 92void display(void) 93{ 94 stack *s; 95 s=head; 96 97 98 printf("----\n"); 99 while (s!=NULL) { 100 printf("%d\n", s->data); 101 s=s->next; 102 } 103 printf("----\n"); 104} 105void release(void) 106{ 107 stack *s,*tmp; 108 109 s=head; 110 tmp=head; 111 while (s!=NULL) { 112 tmp=s->next; 113 free(s); 114 s=tmp; 115 } 116} 117

これをコンパイルすると

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
list_stack.c:
エラー E2147 list_stack.c 6: 引数宣言は 'stack' で始められない
警告 W8075 list_stack.c 64: 問題のあるポインタの変換(関数 add )
エラー E2356 list_stack.c 69: 'push' の再宣言で型が一致していない
エラー E2344 list_stack.c 6: 一つ前の 'push' の定義位置

  • 3 errors in Compile *

と返ってきます。

どうすればよいのか、どなたかご教授いただけないでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

6行目のvoid push(stack *s,int n);の時点では、stackがまだ宣言されていない状態なので、stackが何なのか分からない状態になっています。

プロトタイプ宣言より前に、typedefを移動してみてください。

投稿2015/10/03 10:11

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

drumath2237

2015/10/03 10:29

ありがとうございます! 無事解決できました。
guest

0

質問自体は解決できたようですが、コードを私なりに少し書き換えてみました。

c

1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct _stack { 5 int data; 6 struct _stack* next; 7} stack; 8 9void init(void); 10void add(void); 11int push(int n); 12void delete(void); 13int pop(int* n); 14void display(void); 15void release(void); 16 17stack* head = NULL; 18 19int main(void) { 20 char res; 21 22 init(); 23 while (1) { 24 printf("1:add, 2:delete, 3:show, 0:exit\n"); 25 // See https://ja.wikipedia.org/wiki/Scanf#fscanf 26 res = '\0'; 27 scanf("%[^\n]%*c", &res); 28 29 if (res == '0' || res == '\0') { 30 break; // 終了 31 } 32 switch (res) { 33 case '1': 34 add(); 35 break; 36 case '2': 37 delete(); 38 break; 39 case '3': 40 display(); 41 break; 42 default: 43 printf("---- ignore %c\n", res); 44 break; 45 } 46 } 47 release(); 48 return 0; 49} 50void init() { 51 if (head != NULL) { 52 release(); 53 } 54 head = NULL; 55} 56void release(void) { 57 stack* s = head; 58 59 while (s != NULL) { 60 stack* tmp = s->next; 61 free(s); 62 s = tmp; 63 } 64} 65 66void add(void) { 67 int n; 68 char c; 69 70 printf("put number\n"); 71 scanf("%d", &n); 72 scanf("%c", &c); // 改行を読み飛ばす 73 74 if (push(n) == 1) { 75 printf("%d has added.\n", n); 76 } else { 77 printf("--- error\n"); 78 } 79} 80int push(int n){ 81 stack* s = (stack*)malloc(sizeof(stack)); 82 if (s == NULL) { 83 return 0; // error 84 } 85 86 s->data = n; 87 s->next = head; 88 head = s; 89 return 1; // success 90} 91 92void delete(void) { 93 int n = 0; 94 if (pop(&n) == 1) { 95 printf("%d has just deleted \n", n); 96 } else { 97 printf("--- error\n"); 98 } 99} 100int pop(int* n) { 101 stack* s = head; 102 103 if (s == NULL) { 104 return 0; // error 105 } 106 head = s->next; 107 *n = s->data; 108 free(s); 109 return 1; // success 110} 111 112void display(void) { 113 printf("----\n"); 114 for (stack* s = head; s != NULL; s = s->next) { 115 printf("%d\n", s->data); 116 } 117 printf("----\n"); 118}

実行例;

$ gcc 1.c $ ./a.out 1:add, 2:delete, 3:show, 0:exit 3 ---- ---- 1:add, 2:delete, 3:show, 0:exit 1 put number 9 9 has added. 1:add, 2:delete, 3:show, 0:exit 1 put number 8 8 has added. 1:add, 2:delete, 3:show, 0:exit 3 ---- 8 9 ---- 1:add, 2:delete, 3:show, 0:exit 2 8 has just deleted 1:add, 2:delete, 3:show, 0:exit 3 ---- 9 ---- 1:add, 2:delete, 3:show, 0:exit 2 9 has just deleted 1:add, 2:delete, 3:show, 0:exit 3 ---- ---- 1:add, 2:delete, 3:show, 0:exit 2 --- error 1:add, 2:delete, 3:show, 0:exit 0

投稿2015/10/03 13:39

編集2015/10/04 12:32
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

drumath2237

2015/10/04 00:54

ご回答ありがとうございます。 確かに、エラー処理がありませんでしたね。 もし、なかったら、確保したメモリはそのままになってリークするんでしょうか?
katoy

2015/10/04 12:41

上のコードはエラー処理はほとんど考慮していません。 メモリーリークは気をつける必要がありますね。 今後メモリー管理について勉強していくと、スマートポインター , ガベージコレクションといったことに触れる機会が出てくると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問