|
リスト構造を勉強中で
データの追加や削除、出力を行うプログラムを作っているのですが
初めのコマンドでsを選んだときは、関数save_dataを呼び出し
すべてのノードのデータをファイルに書き込もうと思っているのですが
ファイルに何も書き込まれません。
どこがおかしいのでしょうか、ご教授下さい。
コンパイラはBCC OSはwindows xpです。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
typedef struct __node{
int key;
char name[20];
struct __node *next;
}Node;
void print(void){
puts("*****please select job****");
puts("--------------------------");
puts("i:insert data");
puts("d:deleat data");
puts("f:find list");
puts("s:save data");
printf("q:quit\n\n");
printf("select >");
}
void data_input(int *key,char *name){//データの入力
char buf[16];
printf("Please input key >");
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%d",key);
if(name != NULL){
printf("Please input name >");
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%s",name);
}
}
Node *insert_list(int key,char *name,Node *head){//データをリストに挿入
Node *p;
if ((p=malloc(sizeof(Node))) == NULL) puts("memory error\n"),exit(1);
p->key = key;
strcpy(p->name,name);
p->next = head;
return p;
}
Node *deleat_list(int key,Node *head){//データをリストから削除
Node *p,*q;
if(head == NULL) {
puts("Data is nothing!");
return NULL;
}
if (key == head->key){
p = head->next;
free(head);
puts("deleat is compleated!");
return p;
} else{
p = head;
while (p != NULL){
if (p->next != NULL && p->next->key == key){
q = p->next;
p->next = p->next->next;
free(q);
puts("deleat is compleated!");
return head;
}
p = p->next;
}
}
puts("The key is not found");
return head;
}
void find_list(Node *p){//リストのデータを標準出力に表示
printf("----------DATA LIST----------\n");
while (p != NULL){
printf("key=%d name=%s\n",p->key,p->name);
p = p->next;
}
printf("-----------------------------\n");
}
void save_data(FILE *f,Node *p){//リストのデータをファイルに書き込む。
while(p != NULL){
fprintf(f,"%d,%s\n",p->key,p->name);
p = p->next;
}
puts("Data is saved!");
}
int main(void){
Node *head=NULL;
char buf[16],name[16];
int key;
FILE *fout;
if ((fout=fopen("db_save.txt","w")) == NULL) puts("open error"),exit(1);
while (print(), fgets(buf,sizeof(buf),stdin) != NULL){
buf[0] = tolower(buf[0]);
puts("");
switch (buf[0]){
case 'i': data_input(&key,name);
head = insert_list(key,name,head);
puts("Insert is completed!"); break;
case 'd': data_input(&key,NULL);
head = deleat_list(key,head); break;
case 'f': find_list(head); break;
case 's': save_data(fout,head); break;
case 'q': puts("End works"); return 0;
default : puts("Plese input collectly"); break;
}
puts("\n");
}
fclose(fout);
return 0;
}
|