課題教えてください!

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

課題教えてください!

#1

投稿記事 by 背水の陣 » 13年前

課題1:
授業で取り扱ったスタックはデータを格納するために配列を用いているため、一定数以上の
データを Push することが出来ない。そこで、配列の代わりに連結リストを用いることで、メモ リ領域の許す限り無限にデータを Push することのできるスタックを実現する方法を考える。具 体的には、連結リストに対して Push と Pop の二つの手法を定義する。新しく push されたデー タを連結リストの末尾に加えていると、Push/Pop 操作のたびに毎回連結リストの先頭から末尾 までを辿らなければならない。そのため、多量のデータをこのスタックに Push すると、毎回の Push/Pop 操作に長い時間がかかるようになってしまう。これに対し、連結リストの先頭にデー タを足す(dummy データと次のデータの間にデータを挿入する)ようにすれば、リストを辿る必 要がないため、多量のデータに対しても問題なく動作しそうである。

①初期状態 dummy
②1をPush dummy→1
③2をPush dummy→2→1
④3をPush dummy→3→2→1

コード:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
typedef struct data{
  char num;
  struct data* next;
}DATA;
void Push(DATA* s,char n);
char Pop(DATA* s);
void PrintStack(DATA* s);
int main(){
  DATA start;
char input,p;
  start.num=-1;
  start.next=NULL;
  while(1){
    input=getchar();
    if(isdigit(input)){
      Push(&start,input);
    }else if(input=='p'){
      p=Pop(&start);
      if(p!=-1){
        printf("pop:%c\n",p);
      }
    }else if(input=='s'){
      PrintStack(&start);
    }else if(input=='q'){
break; }
}
return 0; }
void Push(DATA* s,char n){ //ここを作る
}
char Pop(DATA* s){ //ここを作る
}
void PrintStack(DATA* s){ //ここを作る
}
どうかお願いします。

背水の陣

Re: 課題教えてください!

#2

投稿記事 by 背水の陣 » 13年前

すみません。
フォーラムルールを読みました。
課題をそのまま載せてしまいましたので、追記します。

まず、C言語は初心者ですが、課題は難しく手がつけれそうにありません。
dummyを入れ、つぎに1を入れ、その次に2(i++)を入れていけばいいのは分かるのですが・・・
どう書いていけばいいのか、その書き方・構造が分かりません。

課題の提出〆切は明日となっており、苦闘しましたが解決しません。
どうか手助けをお願いします。

アバター
びす
記事: 31
登録日時: 14年前

Re: 課題教えてください!

#3

投稿記事 by びす » 13年前

初めてやったので、間違ってたらすみません...

コード:

void Push(DATA* s,char n){ //ここを作る
    DATA *next;
    next = (DATA*)malloc(sizeof(DATA));
    next->num = n;
    next->next = s->next;
    s->next = next;
}
char Pop(DATA* s){ //ここを作る
    char r = s->next->num;
    free(s->next);
    s->next = s->next->next;
    return r;
}
void PrintStack(DATA* s){ //ここを作る
    DATA *p = s;
    for(;p->next != NULL;){
        p = p->next;
        printf("%c\n",p->num);
    }
}

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

Re: 課題教えてください!

#4

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

私も作ってみました。

コード:

void Push(DATA* s,char n){
	DATA *ptr = malloc(sizeof(DATA));
	if (ptr != NULL)
	{
		*ptr = (DATA){ .num=n, .next=s->next };
		s->next = ptr;
	}
}
char Pop(DATA* s){
	DATA *ptr = s->next;
	s->next = ptr->next;
	char result = ptr->num;
	free(ptr);
	return result;
}
void PrintStack(DATA* s){
	for (DATA *ptr = s->next; ptr != NULL; ptr = ptr->next)
		printf("%c\n", ptr->num);
}

背水の陣

Re: 課題教えてください!

#5

投稿記事 by 背水の陣 » 13年前

すみません。返信を記入したつもりが、送れていなかったようです。
ご迷惑かけました。すみませんでした。

びすさん、たかぎさん。
ありがとうございました。
お二人のおかげで何とか解決できそうです!
ありがとうございました。

前回返信を記入した際に、もうひとつの課題についても触れさせていただいたのですが、
先にトピックを立ててしまった形になり、申し訳ありません。

本当にありがとうございました。

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

Re: 課題教えてください!

#6

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

背水の陣 さんが書きました:びすさん、たかぎさん。
ありがとうございました。
お二人のおかげで何とか解決できそうです!
そういわれるのなら、それでもかまいませんが...
自分で確認した上でそういっていますか?

背水の陣

Re: 課題教えてください!

#7

投稿記事 by 背水の陣 » 13年前

たかぎさんのは、
l17  for (DATA *ptr = s->next; ptr != NULL; ptr = ptr->next)
の部分でエラーがでました。
error: `for' loop initial declaration used outside C99 mode
です。
原因は、C言語ではfor文の中で変数宣言ができないという理由のようです。

びすさんのはエラーは起こっていません。
pにも反応します。
ただ、これが正解なのかは確信が持てませんが…

もし教えていただけると助かります。
よろしくお願いします。

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

Re: 課題教えてください!

#8

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

背水の陣 さんが書きました:原因は、C言語ではfor文の中で変数宣言ができないという理由のようです。
原因がわかっているのなら、それぐらいは自分で解決してください。
背水の陣 さんが書きました:びすさんのはエラーは起こっていません。
pにも反応します。
ただ、これが正解なのかは確信が持てませんが…
正しくないことだけは指摘しておきます。

閉鎖

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