對(duì)不起 我盡力了 我最努力的代碼就保存到這里了
#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("#? ? ? ? ? ? ? | 設(shè)計(jì)制作:魯永哲? 王億健? ?|? ? ? ? ? ? #\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("請(qǐng)輸入序號(hào):");
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;//圖書總數(shù)
FILE *fp;
WORK *p=NULL, head,? *prev;
head.next = NULL;//有可能頭結(jié)點(diǎn)就是最后一個(gè)結(jié)點(diǎn),所以next 必須為 NULL
prev = &head;
///打開文件,沒有則出錯(cuò),以下是沒有出錯(cuò)運(yùn)行
if ((fp = fopen("圖書信息.dat", "r")) != NULL)
{
///文件打開成功,循環(huán)讀取內(nèi)容組合成鏈表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一個(gè)結(jié)點(diǎn)的next一定要為空
prev->next = p;
prev = p;
}
fclose(fp);
}
///輸入信息,存放到結(jié)點(diǎn)pnew中
WORK *pnew = NULL;
pnew = (WORK *)malloc(sizeof(WORK));
printf("請(qǐng)?zhí)砑右槐緢D書信息,例如:\n書名:西游記 \n作者:吳承恩 \n單價(jià):50\n");
printf("下面開始添加\n書名:");
scanf("%s", pnew->name);
printf("作者:");
scanf("%s", pnew->writer);
printf("單價(jià):");
scanf("%f", &pnew->money);
pnew->next = NULL;
////將pnew添加到鏈表末尾
p = head.next;?
while (p != NULL){
prev = p;
max_id++;
p=p->next;
}
///此時(shí)prev是最后一個(gè)結(jié)點(diǎn)
max_id++;
pnew->id = max_id;
prev->next = pnew;
//將整個(gè)鏈表寫入文件
if ((fp = fopen("圖書信息.dat", "w")) == NULL)
{
printf("寫入文件出錯(cuò),程序異常退出");
return;
}
p=head.next;
while (p != NULL)
{
fwrite(p, sizeof(WORK), 1, fp);
p = p->next;
}
fclose(fp);
///回收鏈表占用的內(nèi)存
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("|? ?序號(hào)? |? ? ? ?書? ? ? 名? ? ? ?|? ? ?作? 者? ? ?|? ?單價(jià)? ? ? |\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;//有可能頭結(jié)點(diǎn)就是最后一個(gè)結(jié)點(diǎn),所以next 必須為 NULL
prev = &head;
///打開文件,沒有則出錯(cuò),以下是沒有出錯(cuò)運(yùn)行
if ((fp = fopen("圖書信息.dat", "r")) != NULL)
{
///文件打開成功,循環(huán)讀取內(nèi)容組合成鏈表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一個(gè)結(jié)點(diǎn)的next一定要為空
prev->next = p;
prev = p;
}
fclose(fp);
}
int n;
printf("輸入你要修改圖書的序號(hào):");
scanf("%d", &n);
p = head.next;
while (p != NULL)
{
if (p->id == n) break;
p = p->next;
}
printf("下面開始修改\n", p->id);
printf("序號(hào):%d\n", p->id);
printf("書名(%s):", p->name);
scanf("%s",p->name );
printf("作者(%s):", p->writer);
scanf("%s", p->writer);
printf("價(jià)格(%f):", p->money);
scanf("%f",&p->money);
//將整個(gè)鏈表寫入文件
if ((fp = fopen("圖書信息.dat", "w")) == NULL)
{
printf("寫入文件出錯(cuò),程序異常退出");
return;
}
p = head.next;
while (p != NULL)
{
fwrite(p, sizeof(WORK), 1, fp);
p = p->next;
}
fclose(fp);
///回收鏈表占用的內(nèi)存
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;//有可能頭結(jié)點(diǎn)就是最后一個(gè)結(jié)點(diǎn),所以next 必須為 NULL
prev = &head;
///打開文件,沒有則出錯(cuò),以下是沒有出錯(cuò)運(yùn)行
if ((fp = fopen("圖書信息.dat", "r")) != NULL)
{
///文件打開成功,循環(huán)讀取內(nèi)容組合成鏈表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一個(gè)結(jié)點(diǎn)的next一定要為空
prev->next = p;
prev = p;
}
}
fclose(fp);
int n;
//輸入你要?jiǎng)h除圖書的序號(hào)
printf("請(qǐng)輸入你要?jiǎng)h除圖書的序號(hào):");
scanf("%d", &n);
////現(xiàn)實(shí)圖書內(nèi)容,再次確認(rèn)
p = head.next;
while (p != NULL){
if (p->id == n){
printf("-------------------------------------------------------------------\n");
printf("|? ?序號(hào)? |? ? ? ?書? ? ? 名? ? ? ?|? ? ?作? 者? ? ?|? ?單價(jià)? ? ? |\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"確認(rèn)刪除", 1);
if (ret ==2) return;
//////////////////////////////
p = head.next;
if (n == 1){//若果刪除第一個(gè),直接處理
head.next = p->next;
free(p);
}else{///如果刪除第二個(gè)以后,遍歷對(duì)比
while (p != NULL)
{
prev = p;
p = p->next;
if (p == NULL) break;
if (p->id == n) {
prev->next = p->next;
free(p);
break;
}
}
}
//重新排序,并寫入序號(hào)
p = head.next;
int max_id = 0;
while (p != NULL)
{
max_id++;
p->id = max_id;
p = p->next;
}
//將整個(gè)鏈表寫入文件
if ((fp = fopen("圖書信息.dat", "w")) == NULL)
{
printf("寫入文件出錯(cuò),程序異常退出");
return;
}
p = head.next;
while (p != NULL)
{
fwrite(p, sizeof(WORK), 1, fp);
p = p->next;
}
fclose(fp);
///回收鏈表占用的內(nèi)存
p = head.next;
while (p != NULL)
{
prev = p->next;
free(p);
p = prev;
}
printf("刪除成功,且序號(hào)已重新排列");
system("pause");
}
void find()
{
FILE *fp;
WORK *p = NULL, head, *prev;
head.next = NULL;//有可能頭結(jié)點(diǎn)就是最后一個(gè)結(jié)點(diǎn),所以next 必須為 NULL
prev = &head;
///打開文件,沒有則出錯(cuò),以下是沒有出錯(cuò)運(yùn)行
if ((fp = fopen("圖書信息.dat", "r")) != NULL)
{
///文件打開成功,循環(huán)讀取內(nèi)容組合成鏈表
while (!feof(fp))
{
int ret;
p = (WORK *)malloc(sizeof(WORK));
ret = fread(p, sizeof(WORK), 1, fp);
if (ret == 0) break;
p->next = NULL;//最后一個(gè)結(jié)點(diǎn)的next一定要為空
prev->next = p;
prev = p;
}
}
fclose(fp);
char str[10];
int n,i;
printf("輸入查詢編號(hào)(1按序號(hào)查詢,2按書名查詢,3按作者查詢):");
scanf("%d",&i);
if (i == 1)
{
printf("輸入你要查詢圖書的序號(hào):");
scanf("%d", &n);
p = head.next;
while (p != NULL)
{
if (p->id == n){
printf("-------------------------------------------------------------------\n");
printf("|? ?序號(hào)? |? ? ? ?書? ? ? 名? ? ? ?|? ? ?作? 者? ? ?|? ?單價(jià)? ? ? |\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("|? ?序號(hào)? |? ? ? ?書? ? ? 名? ? ? ?|? ? ?作? 者? ? ?|? ?單價(jià)? ? ? |\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("|? ?序號(hào)? |? ? ? ?書? ? ? 名? ? ? ?|? ? ?作? 者? ? ?|? ?單價(jià)? ? ? |\n");
printf("-------------------------------------------------------------------\n");
printf("|? ? %-3d? |? %-20s? |? %-12s? |? %-9.1f? |\n", p->id, p->name, p->writer, p->money);
printf("-------------------------------------------------------------------\n");
}
p = p->next;
}
}
printf("查詢結(jié)束");
system("pause");
}