ページ 11

みなさんの力をお貸しください

Posted: 2010年7月15日(木) 00:04
by derorian
来週までに出さなければいけない課題がわかりません。
問題は2問あります。

・動的データ構造について

1.線形リスト構造(stackデータ構造)

[1]

 [1.1] stackデータ構造の生成
    条件1:挿入と削除のプログラムを作る
    条件2:pueueではない
    条件3:もし~ならばという風に使い分ける(if文)

 [1.2] stackデータ構造については理解しています。しかし、プログラムの組み方がわかりません。

 [1.3] プログラムの組み方がまったくわかりません。来週までなので早めの回答をお願いします。

 [1.4] 今のままではプログラムを書いていただいてもわからないので詳しい説明があると幸いです。


[2]  
 [2.1] OS : Windows vista

 [2.2] コンパイラ名 : VC++ ソフト名:visual stadio 2008


[3]
 初心者ではないのですが1からプログラムを組むことはやったことはありませんので、初心者と同じぐらいです。ちなみにアルゴリズムとデータ構造という授業です。

問題は[1.1]ですが、下記のプログラムを少し変えるという話を聞きました。↓↓↓


#include stdafx.h

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

void main()
{
struct tbox
{

int data;
struct tbox *point;
};

struct tbox *root, *work, *awork;
FILE *fpi;
int flag;
int workint;
int code;

fpi = fopen(data.dat , r);
root = NULL;
flag = 1;
while(flag)
{
if((code = fscanf(fpi,%d,&workint)) !=EOF)
{
work = (struct tbox *)malloc(sizeof(struct tbox));
work -> data = workint;

work -> point = NULL;
if (root == NULL)
root = work;
else
awork -> point = work;
awork = work;
}
else
flag = 0;
}
work = root;
while(work != NULL)
{
printf(%d\n, work -> data);
work = work -> point;
}
}

2.木構造(二分探索木)


[1]

 [1.1] 二分探索木
    条件1:いかに早く効率よく、データの集まりが一つのデータを探し出せるか

 [1.2] プログラムの組み方がわかりません。

 [1.3] プログラムの組み方がまったくわかりません。来週までなので早めの回答をお願いします。

 [1.4] 今のままではプログラムを書いていただいてもわからないので詳しい説明があると幸いです。


[2]  
 [2.1] OS : Windows vista

 [2.2] コンパイラ名 : VC++ ソフト名:visual stadio 2008


[3]
 初心者ではないのですが1からプログラムを組むことはやったことはありませんので、初心者と同じぐらいです。ちなみにアルゴリズムとデータ構造という授業です。

こちらはこのようなプログラムとなっています。下記のプログラムをいじることで効率良くなるそうです。

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

struct treebox
{
struct treebox *leftpointer;
int data;
struct treebox *rightpointer;
};

struct treebox *work , *awork;

void searchtree()
{
if(awork -> data > work ->data)
{
if(awork -> leftpointer = NULL)
awork -> leftpointer = work;
else
{
awork = awork -> leftpointer;
searchtree();
}
}
else
{
if(awork -> rightpointer == NULL)
awork -> rightpointer = work;
else
{
awork = awork -> rightpointer;
searchtree();
}
}
}

void printtree(struct treebox *p)
{
if(p != NULL)
{
printtree(p -> leftpointer);
printf(%d\n , p ->data);
printtree(p ->rightpointer);
}
}

int main()
{
struct treebox *root;
int flag;
int c;
int workint;

root = (struct treebox *)malloc(sizeof(struct treebox));
root -> leftpointer = NULL;
scanf(%d,&root -> data);
root ->rightpointer = NULL;


awork = root;


flag = 1;
while(flag)
{
workint = scanf(%d , &c);
if((workint == EOF))
flag = 0;
else
{

work -> leftpointer = NULL;
work -> data = c;
work ->rightpointer =NULL;
searchtree();
awork = root;
}
}
awork = root;
printtree(awork);

}


・長文ですが、回答よろしくお願いします。アドバイスのほうもできればお願いします。

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 00:11
by Poco
ご存知だとは思いますが、ここは「質問」掲示板です。
課題に対して、そのままの回答を得ることは期待しないでください。

プログラムの組み方がわからないとのことですが、まずプログラムを組めるところから始めましょう。
derorianさんが提示された上記プログラムをコンパイルする手順は分かりますか?

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 00:26
by derorian
コンパイル手順はわかります

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 00:34
by Poco
では、問題に移りましょう。
問題文を提示してください。

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 00:41
by derorian
2問ありますが一つ目は

・動的データ構造
線形リスト構造

stackデータ構造の生成
挿入と削除を行うプログラムを作る
pueueではない
もし~ならばというふうに使い分ける

です。

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 00:49
by Poco
一つ目のプログラムは何をやっているか分かりますか?

#この課題の出し方だと、似たような内容をキュー(queue)でやっていますよね?

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 00:53
by derorian
詳しくはわかりませんが大まかにならわかります。

そうですね。このプログラムはキューで作られているので、その内容をスタックに変えるのが一番の目的ですね

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:05
by Poco
> 詳しくはわかりませんが大まかにならわかります。

では判る範囲を「ソースコードにコメントを入れる形で」説明してください。
わからない部分は「目立つ形で」コメントを入れてください。

#derorianさんの不明な点を、ご自身と回答者の皆さんが
#認識する(させる)ことが目的です。

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:24
by derorian
#include "stdafx.h"

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


void main()
{
struct tbox //動的データ構造を作成
{

int data;//struct tboxに対する変数
struct tbox *point;
};

struct tbox *root, *work, *awork;
FILE *fpi;
int flag;
int workint;
int code;

fpi = fopen("data.dat" , "r");
root = NULL;
flag = 1;
while(flag)
{
if((code = fscanf(fpi,"%d",&workint)) !=EOF)
{
work = (struct tbox *)malloc(sizeof(struct tbox));//workのなかの変数を動的に領域をとる
work -> data = workint;//

work -> point = NULL;
if (root == NULL)//NULLになったら
root = work;//workの値をrootにいれる
else
awork -> point = work;//workとポインタをつなぐ
awork = work;//aworkにworkの値を入れる
}
else
flag = 0;
}
work = root;//rootの値をworkに入れる
while(work != NULL)//workがNULLになるまで繰り返す
{
printf("%d\n", work -> data);
work = work -> point;
}
}


わかるところ少なくてすいません
ポインタ変数どうしをつないでいくことしかわかりません

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:36
by Poco
最初のwhile文と2番目のwhile文はそれぞれ何をやっているか、分かりますか?
画像

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:47
by derorian
最初は変数同士をつないでいく
2番目は表示させる
ですか?

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:53
by derorian
キューのデータ構造をスタックのデータ構造に変えるというものなのでキューで間違いないと思います

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:53
by Poco
そうですね。
では、変数をどのようにつないでいるか具体的に分かりますか?

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:54
by Poco
> キューのデータ構造をスタックのデータ構造に変えるというものなのでキューで間違いないと思います

すみません、私の勘違いでした。
#睡魔のせいにしときます…

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 01:58
by derorian
awork -> point = work;
という部分でaworkとworkがつながると思います

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 02:03
by Poco
変数root、work、aworkがそれぞれ何を表しているか、分かりますか?

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 02:08
by derorian
すいません。workとaworkがつなぐ変数 rootは予備の変数ですか?

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 02:13
by Poco
キューを意識してください。
上記、プログラムで入力データが例えば1,2,3順序だった場合、
各入力が行われた後で、root、work、aworkはどうなっていくかを考えてください。

#プログラムが組めなくても、紙と鉛筆があれば出来ます。

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 02:35
by derorian
すいません。明日までに考えておきます。

Re:みなさんの力をお貸しください

Posted: 2010年7月15日(木) 02:38
by Poco
頑張ってください。
ここが明確になれば、スタックではどうすればいいか、簡単に分かります。
では、お休みなさい。