修改了下
#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct Book // 声明结构体
{
int num; /*编号*/
char cla[10]; /*分类名*/
char name[15]; /*书名*/
char author[8]; /*作者名*/
char company[20]; /*出版单位*/
int count; /*数量*/
float price; /*价格*/
};
typedef struct Book DataType; // 结构体变量
typedef struct LNode
{
DataType data; // 数据域
struct LNode *next; // 指针域
} LinkList; // 结构体类型
LinkList *head; // 链表头指针
// 初始化
LinkList *InitList()
{
head = (LinkList *)malloc(sizeof(LinkList));
head->next = NULL; // 头指针置空
return head;
}
void DispList(LinkList *head)
{
LinkList *s = head->next;
// printf("\n 编号 分类\t 书名\t \t 作者 \t出版社 \t数量 \t\t价格\n");
printf("%-4s %-12s %-18s %-10s %-20s %-10s %-6s\n", "编号", "分类", "书名", "作者", "出版社", "数量", "价格");
while (s)
{
printf("%-4d %-12s %-18s %-10s %-20s %-10d %-6.2f\n", s->data.num, s->data.cla, s->data.name, s->data.author, s->data.company, s->data.count, s->data.price);
s = s->next;
}
}
void ReadFile() // 读取文件
{
FILE *fp; // 指向文件的指针
// int i=0;
LinkList *s, *last; // 声明指针变量 Books,
last = head; // 令两节点地址相同
if ((fp = fopen("jk62107_08_bk.txt", "r+")) == NULL)
{
printf("找不到此文件再试试!!!!\n");
return;
}
char buf[100];
fgets(buf, 100, fp); // 读入第一行
while (!feof(fp))
{
s = (LinkList *)malloc(sizeof(LinkList)); // 分配内存空间
fscanf(fp, "%d %s %s %s %s %d %f\n", &s->data.num, s->data.cla, s->data.name, s->data.author, s->data.company, &s->data.count, &s->data.price);
s->next = NULL; // s的下一节点置空
last->next = s; // 节点的指针域存放s节点的地址
last = last->next; // s
}
printf("\n\n文件读取成功\n\n");
fclose(fp);
DispList(head); // 显示文件内容
}
void Searchname() // 按书名查找图书
{
int flag = 0; // 标记变量的初值
char name[15];
LinkList Books, *s, *p; // 定义指针变量
printf("\n请输入需要查询的书名:");
scanf("%s", name);
printf("\n\t\t*+*+*+*+*+*+*+*+*+以下是您查找的信息*+*+*+*+*+*+*+*+*+");
p = head->next; // p指向首元节点
while (p != NULL)
{
if (strcmp(p->data.name, name) == 0) // 查找符合的图书
{
printf("\n\t编号:%-10d", p->data.num);
printf("\n\t书名:%-20s", p->data.name);
printf("\n\t作者名:%-20s", p->data.author);
printf("\n\t分类名:%-10s", p->data.cla);
printf("\n\t出版单位:%-20s", p->data.company);
printf("\n\t数量:%-20d", p->data.count);
printf("\n\t价格:%.2f", p->data.price);
flag = 1; // 找到标记变量设为1
// p = p->next; // 指针走到下一个节点
}
p = p->next;
}
if (flag == 0)
printf("\n\t\t没有相同书名");
getchar();
}
void Searchauthor() // 按作者名查找图书
{
int flag = 0;
char author[10];
LinkList Books, *s, *p;
printf("\n请输入需要查询的作者名:");
scanf("%s", author);
printf("\n\t\t*+*+*+*+*+*+*+*+*+以下是您查找的信息*+*+*+*+*+*+*+*+*+");
p = head->next;
while (p != NULL) // 查找符合的图书
{
if (strcmp(p->data.author, author) == 0) /*找到图书显示信息*/
{
printf("\n\t编号:%-10d", p->data.num);
printf("\n\t书名:%-20s", p->data.name);
printf("\n\t作者名:%-20s", p->data.author);
printf("\n\t分类名:%-10s", p->data.cla);
printf("\n\t出版单位:%-20s", p->data.company);
printf("\n\t数量:%-20d", p->data.count);
printf("\n\t价格:%-10.2f", p->data.price);
flag = 1;
}
p = p->next;
}
if (flag == 0)
printf("\n\t\t没有相同作者名");
getchar();
}
void Insert()
{
LinkList *p, *q; // 定义指向结构体的指针
p = (LinkList *)malloc(sizeof(LinkList)); // 为结构体开辟空间
if (p == NULL)
{
printf("malloc failed!\n");
getchar();
return;
}
printf("\n插入信息:\n");
printf("请输入编号:");
scanf("%d", &p->data.num);
printf("请输入书名:");
scanf("%s", p->data.name);
printf("请输入作者:");
scanf("%s", p->data.author);
printf("请输入分类名:");
scanf("%s", p->data.cla);
printf("请输入出版社:");
scanf("%s", p->data.company);
printf("请输入数量:");
scanf("%d", &p->data.count);
printf("请输入价格:");
scanf("%f", &p->data.price); //
p->next = NULL; // 将指针域置为空
// if (head->next == NULL) // 判断是否是第一次添加
// {
// head->next = p; // 是,让头指针指向p
// }
// else // 否,让尾指针指向p
// {
// head已被初始化,不可能为NULL
q = head; // q指向头节点
while (q->next != NULL) // 找到尾节点
{
q = q->next;
}
q->next = p; // 将尾节点指向p
//}
printf("插入成功!\n");
getchar();
}
void Save() /*以文本文件形式保存的函数*/
{
FILE *fp;
LinkList *p; //, *s
// char file[20]; 用来存放文件保存路径以及文件名
/*printf("请输入文件路径及文件名:");
scanf("%s", file);
*/
if ((fp = fopen("jk62107_08_bk.txt", "w+")) == NULL) /*判断能否打开文件*/
{
printf("不能打开文件!\n");
return;
}
fprintf(fp, "编号 分类\t 书名\t \t 作者 \t出版社 \t数量 \t\t价格\n");
p = head->next;
while (p != NULL) //
{
fprintf(fp, " %d %s\t %s\t %s %s\t %d\t \t%f\n", p->data.num, p->data.cla, p->data.name, p->data.author, p->data.company, p->data.count, p->data.price); // 将数据写入文件
p = p->next; /*下移一个结点*/
}
fclose(fp); // 写入完成,关闭文件
printf("文件已经保存!\n");
return;
}
int main()
{
InitList();
ReadFile();
Searchname();
Searchauthor();
Insert();
Save();
return 0;
}