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

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

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

#1

投稿記事 by derorian » 15年前

来週までに出さなければいけない課題がわかりません。
問題は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);

}


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

Poco

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

#2

投稿記事 by Poco » 15年前

ご存知だとは思いますが、ここは「質問」掲示板です。
課題に対して、そのままの回答を得ることは期待しないでください。

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

derorian

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

#3

投稿記事 by derorian » 15年前

コンパイル手順はわかります

Poco

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

#4

投稿記事 by Poco » 15年前

では、問題に移りましょう。
問題文を提示してください。

derorian

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

#5

投稿記事 by derorian » 15年前

2問ありますが一つ目は

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

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

です。

Poco

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

#6

投稿記事 by Poco » 15年前

一つ目のプログラムは何をやっているか分かりますか?

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

derorian

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

#7

投稿記事 by derorian » 15年前

詳しくはわかりませんが大まかにならわかります。

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

Poco

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

#8

投稿記事 by Poco » 15年前

> 詳しくはわかりませんが大まかにならわかります。

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

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

derorian

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

#9

投稿記事 by derorian » 15年前

#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;
}
}


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

Poco

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

#10

投稿記事 by Poco » 15年前

最初のwhile文と2番目のwhile文はそれぞれ何をやっているか、分かりますか?
画像

derorian

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

#11

投稿記事 by derorian » 15年前

最初は変数同士をつないでいく
2番目は表示させる
ですか?

derorian

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

#12

投稿記事 by derorian » 15年前

キューのデータ構造をスタックのデータ構造に変えるというものなのでキューで間違いないと思います

Poco

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

#13

投稿記事 by Poco » 15年前

そうですね。
では、変数をどのようにつないでいるか具体的に分かりますか?

Poco

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

#14

投稿記事 by Poco » 15年前

> キューのデータ構造をスタックのデータ構造に変えるというものなのでキューで間違いないと思います

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

derorian

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

#15

投稿記事 by derorian » 15年前

awork -> point = work;
という部分でaworkとworkがつながると思います

Poco

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

#16

投稿記事 by Poco » 15年前

変数root、work、aworkがそれぞれ何を表しているか、分かりますか?

derorian

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

#17

投稿記事 by derorian » 15年前

すいません。workとaworkがつなぐ変数 rootは予備の変数ですか?

Poco

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

#18

投稿記事 by Poco » 15年前

キューを意識してください。
上記、プログラムで入力データが例えば1,2,3順序だった場合、
各入力が行われた後で、root、work、aworkはどうなっていくかを考えてください。

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

derorian

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

#19

投稿記事 by derorian » 15年前

すいません。明日までに考えておきます。

Poco

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

#20

投稿記事 by Poco » 15年前

頑張ってください。
ここが明確になれば、スタックではどうすればいいか、簡単に分かります。
では、お休みなさい。

閉鎖

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