どなたか・・・

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

どなたか・・・

#1

投稿記事 by ジュビ » 16年前

このプログラムの解説をしていただけませんか?
% cat test18_1.c
#include <stdio.h>

#define MAXLINE 132
#define RECORD_SIZE sizeof(struct rec)
#define STACK_SIZE 12

struct rec
{
char *string;
struct rec *left, *right;
};

struct rec *add(struct rec *root, char *line);
struct rec *install(char *line);
void print_tree(struct rec *ptr);

main(int argc, char *argv[/url])
{
FILE *file;
char line[MAXLINE];

struct rec *root = NULL;

if (file = fopen(argv[1], “r”))
{
while (fgets(line, MAXLINE, file))
root = add(root, line);
printf_tree(root);
}
else
printf(“csort: can’t open %s\n”,argv[1]);
}

struct rec *add(struct rec *root,char *line)
{
struct rec **prev_ptr, *ptr;

if(root)
{
ptr = root;
while (ptr)
{
if (strcmp(line, ptr->string) <= 0)
{
prev_ptr = &ptr->left;
ptr = ptr->left;
else
{
prev_ptr = &ptr->right;
ptr = ptr->right;
}
}
*prev_ptr = install(line);
return(root);
}
return(install(line));
}

struct rec *install(char *line)
{
char *malloc();
struct rec *ptr;

ptr = (struct rec *)malloc(RECORD_SIZE);
ptr->string = malloc(strlen(line) + 1);
strcpy(ptr->string, line);

ptr->left = ptr->right = NULL;
return(ptr);
}

void print_tree(struct rec *ptr)
{
int i = 0;
struct rec *stack[STACK_SIZE];

while (1)
{
while (ptr)
{
stack[i++] = ptr;
ptr = ptr->left;
}
ptr = stack[--i];
if (i < 0)
break;
printf(“%s”, ptr->string);
ptr = ptr->right;
}
}

% cat temp
ELBOW GREASE. Labour.
DISGRUNTLED. Offended, disobliged.
JILTED. Rejected by woman.
GROG. Rum and water.
NUMBSCULL. Stupid fellow.
ZANY. The jester, or merry Andrew.
GAMBS. Thin, ill-shaped legs.
KICK THE BUCKET. To die.
AGAINST THE GRAIN. Unwilling.

% cc &#8211;o csort test18_1.c
% csort temp
AGAINST THE GRAIN. Unwilling.
DISGRUNTLED. Offended, disobliged.
ELBOW GREASE. Labour.
GAMBS. Thin, ill-shaped legs.
GROG. Rum and water.
JILTED. Rejected by woman.
KICK THE BUCKET. To die.
NUMBSCULL. Stupid fellow.
ZANY. The jester, or merry Andrew.
% csort garble
csort: can’t open garble
%

% cat temp
E
D
J
G
N
Z
G
K
A
%

non

Re:どなたか・・・

#2

投稿記事 by non » 16年前

バイナリツリーまたは二分木でググって、調べた上でわからないことを質問して下さい。

tk-xleader

Re:どなたか・・・

#3

投稿記事 by tk-xleader » 16年前

質問ですが、そのプログラムコンパイルできましたか?
残念ですが、僕の環境(WinXP+MinGW(gcc))ではエラーが出てコンパイルすらできませんでしたよ。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLINE 132
#define RECORD_SIZE sizeof(struct rec)
#define STACK_SIZE 12

struct rec
{
	char *string;
	struct rec *left, *right;
};

struct rec *add(struct rec *root, char *line);
struct rec *install(char *line);
void print_tree(struct rec *ptr);

main(int argc, char *argv[/url])
{
	FILE *file;
	char line[MAXLINE];

	struct rec *root = NULL;

	if (file = fopen(argv[1], "r"))
	{
		while (fgets(line, MAXLINE, file))
			root = add(root, line);
		print_tree(root);
	}
	else
		printf("csort: can’t open %s\n",argv[1]);
}

struct rec *add(struct rec *root,char *line)
{
	struct rec **prev_ptr, *ptr;

	if(root)
	{
		ptr = root;
		while (ptr)
		{
			if (strcmp(line, ptr->string) <= 0)
			{
				prev_ptr = &ptr->left;
				ptr = ptr->left;
			}
			else
			{
			prev_ptr = &ptr->right;
			ptr = ptr->right;
			}
		}
		*prev_ptr = install(line);
		return(root);
	}
	return(install(line));
}

struct rec *install(char *line)
{
	struct rec *ptr;

	ptr = (struct rec *)malloc(RECORD_SIZE);
	ptr->string = malloc(strlen(line) + 1);
	strcpy(ptr->string, line);

	ptr->left = ptr->right = NULL;
	return(ptr);
}

void print_tree(struct rec *ptr)
{
	int i = 0;
	struct rec *stack[STACK_SIZE];

	while (1)
	{
		while (ptr)
		{
			stack[i++] = ptr;
			ptr = ptr->left;
		}
		ptr = stack[--i];
		if (i < 0)
			break;
		printf("%s", ptr->string);
		ptr = ptr->right;
	}
}
と修正してやっとコンパイルとビルドが通りました。
後、ソースコードは、その前後に、<pre></pre>とつけて投稿してください。(<>は半角で)

もぐりん

Re:どなたか・・・

#4

投稿記事 by もぐりん » 16年前

こちらにも、マルチ投稿してますね?

http://www2.realint.com/cgi-bin/tarticl ... intc+32793

閉鎖

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