#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define xmalloc malloc
#define xfree free
#define NAME_LENGTH 20 /* 名前を格納する文字列の長さ */
#define ADDRESS_LENGTH 30 /* 住所を格納する文字列の長さ */
typedef struct p_tag{
char name[NAME_LENGTH];
char address[ADDRESS_LENGTH];
int age;
struct p_tag *next;
} personal_t;
personal_t *makeNewNode(char *name, char *address, int age) {
personal_t *pNewNode;
if ((pNewNode = xmalloc(sizeof(personal_t))) != NULL) {
strncpy(pNewNode->name, name, NAME_LENGTH - 1);
(pNewNode->name)[NAME_LENGTH - 1] = '\0';
strncpy(pNewNode->address, address, ADDRESS_LENGTH - 1);
(pNewNode->address)[ADDRESS_LENGTH - 1] = '\0';
pNewNode->age = age;
pNewNode->next = NULL;
}
return pNewNode;
}
void add(personal_t **top, char *name, char *address, int age) {
personal_t *p;
if (*top == NULL || (*top)->age > age) {
if ((p = makeNewNode(name, address, age)) != NULL) {
p->next = *top;
*top = p;
}
} else {
add(&((*top)->next), name, address, age);
}
}
int get(personal_t **top, char *name, char *address, int *age) {
personal_t *p;
if (*top != NULL) {
p = *top;
*top = (*top)->next;
strncpy(name, p->name, NAME_LENGTH - 1);
name[NAME_LENGTH - 1] = '\0';
strncpy(address, p->address, ADDRESS_LENGTH - 1);
address[ADDRESS_LENGTH - 1] = '\0';
*age = p->age;
xfree(p);
return 0;
}
return 1;
}
#define BUFFLEN 1024
int main(int argc, char *argv[]) {
personal_t *pTop = NULL;
FILE *fp;
char name[NAME_LENGTH];
char address[ADDRESS_LENGTH];
char buff[BUFFLEN];
int age;
if (argc != 2) {
printf("Usage: %s datafilename.\n", argv[0]);
return EINVAL;
}
if ((fp = fopen(argv[1], "r")) == NULL) {
printf("No such file %s.\n", argv[1]);
return ENOENT;
}
while (fgets(buff, BUFFLEN, fp) != NULL) {
if (sscanf(buff, "%s %s %d", name, address, &age) == 3) { /* dangerous !! */
add(&pTop, name, address, age);
}
}
fclose(fp);
while (get(&pTop, name, address, &age) == 0) {
printf("%s %s %d\n", name, address, age);
}
return 0;
}
/* end */