对不起 我尽力了 我最努力的代码就保存到这里了
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
void addone();
void find();
void read1();
void updata();
void backspace();
typedef struct work
{
int id;
char name[20];
char writer[20];
float money;
work *next;
}WORK;
int main()
{
while (true)
{
system("cls");
printf("##########################################################\n");
printf("# #\n");
printf("# ------------------------------ #\n");
printf("# | 设计制作:鲁永哲 王亿健 | #\n");
printf("# ------------------------------ #\n");
printf("# #\n");
printf("# 1.列出所有图书 #\n");
printf("# 2.查询图书 #\n");
printf("# 3.增加新图书 #\n");
printf("# 4.修改图书 #\n");
printf("# 5.删除图书 #\n");
printf("# 6.退出 #\n");
printf("# #\n");
printf("##########################################################\n");
printf("请输入序号:");
int a = getchar();
if (a == '1') read1();
if (a == '2') find();
if (a == '3') addone();
if (a == '4') updata();
if (a == '5') backspace();
if (a == '6') exit(0);
}
system("pause");
return 0;
}
void addone()
{
int max_id = 0;//图书总数
FILE *fp;
WORK *p=NULL, head, *prev;
head.next = NULL;//有可能头结点就是最后一个结点,所以next 必须为 NULL
prev = &head;
///打开文件,没有则出错,以下是没有出错运行
if ((fp = fopen("图书信息.dat", "r")) != NULL)
{
///文件打开成功,循环读取内容组合成链表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一个结点的next一定要为空
prev->next = p;
prev = p;
}
fclose(fp);
}
///输入信息,存放到结点pnew中
WORK *pnew = NULL;
pnew = (WORK *)malloc(sizeof(WORK));
printf("请添加一本图书信息,例如:\n书名:西游记 \n作者:吴承恩 \n单价:50\n");
printf("下面开始添加\n书名:");
scanf("%s", pnew->name);
printf("作者:");
scanf("%s", pnew->writer);
printf("单价:");
scanf("%f", &pnew->money);
pnew->next = NULL;
////将pnew添加到链表末尾
p = head.next;
while (p != NULL){
prev = p;
max_id++;
p=p->next;
}
///此时prev是最后一个结点
max_id++;
pnew->id = max_id;
prev->next = pnew;
//将整个链表写入文件
if ((fp = fopen("图书信息.dat", "w")) == NULL)
{
printf("写入文件出错,程序异常退出");
return;
}
p=head.next;
while (p != NULL)
{
fwrite(p, sizeof(WORK), 1, fp);
p = p->next;
}
fclose(fp);
///回收链表占用的内存
p= head.next;
while (p != NULL)
{
prev = p->next;
free(p);
p = prev;
}
printf("添加成功,按任意键返回主菜单\n");
system("pause");
}
void read1()
{
printf("列出所有图书\n");
FILE *fp;
WORK *p, *head = NULL;
fp = fopen("图书信息.dat", "r");
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = head;
head = p;
}
p = NULL;
p = head;
printf("-------------------------------------------------------------------\n");
printf("| 序号 | 书 名 | 作 者 | 单价 |\n");
printf("-------------------------------------------------------------------\n");
while (p != NULL){
printf("| %-3d | %-20s | %-12s | %-9.1f |\n", p->id, p->name, p->writer, p->money);
p = p->next;
}
printf("-------------------------------------------------------------------\n");
system("pause");
}
void updata()
{
WORK *p, head, *prev;
FILE *fp;
p = NULL;
head.next = NULL;//有可能头结点就是最后一个结点,所以next 必须为 NULL
prev = &head;
///打开文件,没有则出错,以下是没有出错运行
if ((fp = fopen("图书信息.dat", "r")) != NULL)
{
///文件打开成功,循环读取内容组合成链表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一个结点的next一定要为空
prev->next = p;
prev = p;
}
fclose(fp);
}
int n;
printf("输入你要修改图书的序号:");
scanf("%d", &n);
p = head.next;
while (p != NULL)
{
if (p->id == n) break;
p = p->next;
}
printf("下面开始修改\n", p->id);
printf("序号:%d\n", p->id);
printf("书名(%s):", p->name);
scanf("%s",p->name );
printf("作者(%s):", p->writer);
scanf("%s", p->writer);
printf("价格(%f):", p->money);
scanf("%f",&p->money);
//将整个链表写入文件
if ((fp = fopen("图书信息.dat", "w")) == NULL)
{
printf("写入文件出错,程序异常退出");
return;
}
p = head.next;
while (p != NULL)
{
fwrite(p, sizeof(WORK), 1, fp);
p = p->next;
}
fclose(fp);
///回收链表占用的内存
p = head.next;
while (p != NULL)
{
prev = p->next;
free(p);
p = prev;
}
printf("修改成功.");
system("pause");
}
void backspace()
{
FILE *fp;
WORK *p = NULL, head, *prev;
head.next = NULL;//有可能头结点就是最后一个结点,所以next 必须为 NULL
prev = &head;
///打开文件,没有则出错,以下是没有出错运行
if ((fp = fopen("图书信息.dat", "r")) != NULL)
{
///文件打开成功,循环读取内容组合成链表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一个结点的next一定要为空
prev->next = p;
prev = p;
}
}
fclose(fp);
int n;
//输入你要删除图书的序号
printf("请输入你要删除图书的序号:");
scanf("%d", &n);
////现实图书内容,再次确认
p = head.next;
while (p != NULL){
if (p->id == n){
printf("-------------------------------------------------------------------\n");
printf("| 序号 | 书 名 | 作 者 | 单价 |\n");
printf("-------------------------------------------------------------------\n");
printf("| %-3d | %-20s | %-12s | %-9.1f |\n", p->id, p->name, p->writer, p->money);
printf("-------------------------------------------------------------------\n");
break;
}
p = p->next;
}
int ret=MessageBox(NULL, L"你是否确定删除该图书?", L"确认删除", 1);
if (ret ==2) return;
//////////////////////////////
p = head.next;
if (n == 1){//若果删除第一个,直接处理
head.next = p->next;
free(p);
}else{///如果删除第二个以后,遍历对比
while (p != NULL)
{
prev = p;
p = p->next;
if (p == NULL) break;
if (p->id == n) {
prev->next = p->next;
free(p);
break;
}
}
}
//重新排序,并写入序号
p = head.next;
int max_id = 0;
while (p != NULL)
{
max_id++;
p->id = max_id;
p = p->next;
}
//将整个链表写入文件
if ((fp = fopen("图书信息.dat", "w")) == NULL)
{
printf("写入文件出错,程序异常退出");
return;
}
p = head.next;
while (p != NULL)
{
fwrite(p, sizeof(WORK), 1, fp);
p = p->next;
}
fclose(fp);
///回收链表占用的内存
p = head.next;
while (p != NULL)
{
prev = p->next;
free(p);
p = prev;
}
printf("删除成功,且序号已重新排列");
system("pause");
}
void find()
{
FILE *fp;
WORK *p = NULL, head, *prev;
head.next = NULL;//有可能头结点就是最后一个结点,所以next 必须为 NULL
prev = &head;
///打开文件,没有则出错,以下是没有出错运行
if ((fp = fopen("图书信息.dat", "r")) != NULL)
{
///文件打开成功,循环读取内容组合成链表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一个结点的next一定要为空
prev->next = p;
prev = p;
}
}
fclose(fp);
char str[10];
int n,i;
printf("输入查询编号(1按序号查询,2按书名查询,3按作者查询):");
scanf("%d",&i);
if (i == 1)
{
printf("输入你要查询图书的序号:");
scanf("%d", &n);
p = head.next;
while (p != NULL)
{
if (p->id == n){
printf("-------------------------------------------------------------------\n");
printf("| 序号 | 书 名 | 作 者 | 单价 |\n");
printf("-------------------------------------------------------------------\n");
printf("| %-3d | %-20s | %-12s | %-9.1f |\n", p->id, p->name, p->writer, p->money);
printf("-------------------------------------------------------------------\n");
break;
}
p = p->next;
}
}
if (i== 2)
{
printf("输入你要查询图书的书名:");
scanf("%s", str);
p = head.next;
while (p != NULL)
{
if (NULL != strstr(p->name, str)){
printf("-------------------------------------------------------------------\n");
printf("| 序号 | 书 名 | 作 者 | 单价 |\n");
printf("-------------------------------------------------------------------\n");
printf("| %-3d | %-20s | %-12s | %-9.1f |\n", p->id, p->name, p->writer, p->money);
printf("-------------------------------------------------------------------\n");
}
p = p->next;
}
}
if (i == 3)
{
printf("输入你要查询图书的作者:");
scanf("%s", str);
p = head.next;
while (p != NULL)
{
if (0 == strcmp(str, p->writer)) {
printf("-------------------------------------------------------------------\n");
printf("| 序号 | 书 名 | 作 者 | 单价 |\n");
printf("-------------------------------------------------------------------\n");
printf("| %-3d | %-20s | %-12s | %-9.1f |\n", p->id, p->name, p->writer, p->money);
printf("-------------------------------------------------------------------\n");
}
p = p->next;
}
}
printf("查询结束");
system("pause");
}