どなたか・・・
Posted: 2009年1月18日(日) 02:11
このプログラムの解説をしていただけませんか?
% 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 –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
%
% 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 –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
%