このプログラムの解説をしていただけませんか?
% 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
%
どなたか・・・
Re:どなたか・・・
質問ですが、そのプログラムコンパイルできましたか?
残念ですが、僕の環境(WinXP+MinGW(gcc))ではエラーが出てコンパイルすらできませんでしたよ。
後、ソースコードは、その前後に、<pre></pre>とつけて投稿してください。(<>は半角で)
残念ですが、僕の環境(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>とつけて投稿してください。(<>は半角で)