欢迎光临散文网 会员登陆 & 注册

对不起 我尽力了 我最努力的代码就保存到这里了

2023-02-16 08:38 作者:幻影279  | 我要投稿

#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");

}


对不起 我尽力了 我最努力的代码就保存到这里了的评论 (共 条)

分享到微博请遵守国家法律