結構數組、鏈表、文件操作和自定義函數是常用的。主要是需要把基礎知識掌握牢固。
先定義結構,再定義結構的成員,選擇壹個數組存儲圖書的各種信息。可以使用for和do while循環來輸入信息。
存儲信息需要文件操作函數,如fopen、fwrite等。
刪除和添加可以刪除節點或添加節點。
搜索等都可以通過字符串操作的各種功能來實現。
附加參考源代碼
#包含?& ltstdio.h & gt
#包含?& ltstring.h & gt
#包含?& ltstdlib.h & gt
#包含?& ltconio.h & gt
#定義書籍?" f:\\books.txt "
#定義?booksbak"f:\\booksbak.txt "
struct?bookinfo
{
夏爾?國際標準書號[20];
夏爾?標題[30];
夏爾?作者[20];
int?數數;
};
struct?書
{
struct?bookinfo?onebook
struct?書?*下壹個;
};
struct?書?*searchBook?(?struct?書?*listptr,char?國際標準書號[])
{
while(listptr!=(struct?書?*)0)
如果?(strcmp(list ptr-& gt;onebook.isbn,isbn)==0)
回歸?listptr
其他
list ptr = list ptr-& gt;接下來;
回歸?(struct?書?*)0;
}
作廢?MainSearchbook(struct?書?*firstptr)
{
struct?書?* ptr
夏爾?ISBN no[20];
Printf("請輸入ISBN:");
scanf("%s ",& ampISBN no);
ptr=searchBook(firstptr,ISBN no);
如果?(ptr!=(struct?書?*)0)
{
Printf("找到了!!!\ n ");
printf("ISBN:%s\n ",ptr-& gt;one book . ISBN);
printf("Title:%s\n ",ptr-& gt;one book . title);
printf("作者:%s\n ",ptr-& gt;one book . author);
}
其他
printf("抱歉,不是?找到了!!!\ n ");
}
int?addBook(struct?書?*listptr,struct?bookinfo?註意)
{
while(list ptr-& gt;下壹個!=0)
list ptr = list ptr-& gt;接下來;
list ptr-& gt;next=(struct?書?*)malloc(sizeof(struct?書));
list ptr-& gt;下壹個-& gt;onebook = note
list ptr-& gt;下壹個-& gt;next = 0;
回歸?0;
}
作廢?MainAdd(struct?書?*listptr,FILE?*fp)
{
int?ok;
struct?bookinfo?註意;
Printf("請輸入ISBN:");
scanf("%s ",e . ISBN);
Printf("請輸入標題:");
scanf("%s ",標題);
Printf("請輸入作者:");
scanf("%s ",作者);
ok=addBook(listptr,註);
如果?(ok==0)
{
//將添加的書籍寫入文件並保存。
fprintf(fp," \n%s?%s?%s?%d”,note.isbn,note.title,note.author,0);
Printf("添加書籍成功!!!\ n ");
}
其他
Printf("添加書籍失敗!!!\ n ");
}
int?removeBook(struct?書?*listptr,char?國際標準書號[])
{
while(list ptr-& gt;下壹個!=(struct?書?*)0)
{
如果?(strcmp(list ptr-& gt;下壹個-& gt;onebook.isbn,isbn)==0)
{
list ptr-& gt;next = list ptr-& gt;下壹個-& gt;接下來;
回歸?0;
}
其他
list ptr = list ptr-& gt;接下來;
}
回歸?-1;
}
作廢?MainRemove(struct?書?*listptr,FILE?*fp)
/************************************************************************/
/*?刪除圖書功能,通過ISBN刪除鏈表節點,刪除文件中相應的信息*/
/*?刪除文件中的壹行是壹種愚蠢的方式,將所需信息寫入新文件,刪除舊文件並重命名...*/
/************************************************************************/
{
夏爾?ISBN no[20];
int?ok;
struct?bookinfo?onebook
Printf("請輸入ISBN:");
scanf("%s ",& ampISBN no);
ok=removeBook(listptr,is bnno);
如果?(!好的)
{
文件?* fpbak
如果?((fpbak=fopen(booksbak," a+")= = NULL)
Printf("文件無法打開!!!\ n ");
fseek(fp,0,SEEK _ SET);?//移動到文件的開頭
while((fscanf(fp," %s?%s?%s?%d\n ",& ampone book . ISBN & amp;one book . title & amp;one book . author & amp;onebook.count))!=EOF)
{
如果?(strcmp(onebook.isbn,isbnno)!=0)
{
fprintf(fpbak," %s?%s?%s?%d\n ",onebook.isbn,onebook.title,onebook.author,one book . count);
}
}
fclose(FP);
fclose(fpbak);
如果?(移除(書籍))?//刪除失敗,返回非0。
{
Printf("刪除文件失敗!!!\ n ");
回歸?;
}
其他
如果?(rename(booksbak,books))//重命名失敗,返回非零值。
{
Printf("重命名失敗!!!\ n ");
回歸?;
}
Printf("刪除成功!!!\ n ");
}
其他
Printf("沒有這樣的書!!!");
}
intchoice(無效)
{
int?c;
Printf("1。查看書籍\ n ");
Printf("2。添加圖書\ n ");
Printf("3。刪書\ n”);
Printf("4。退出程序\ n ");
Printf("請選擇序列號:");
回歸?c = getchar();
//返回?c = getche();
printf(" \ n \ n ");
}
int?addEntry(文件?*fp,struct?書?*firstptr)
/************************************************************************/
/*主要用於加載存儲在文件中的圖書信息*/
/************************************************************************/
{
struct?bookinfo?onebook
while((fscanf(fp," %s?%s?%s?%d\n ",& ampone book . ISBN & amp;one book . title & amp;one book . author & amp;onebook.count))!=EOF)
{
while(first ptr-& gt;下壹個!=0)
first ptr = first ptr-& gt;接下來;
first ptr-& gt;next=(struct?書?*)malloc(sizeof(struct?書));
first ptr-& gt;下壹個-& gt;onebook = onebook
first ptr-& gt;下壹個-& gt;next = 0;
}
回歸?0;
}
int?main(int?argc,char?*argv[])
{
int?ch;
struct?書?第壹;
strcpy(first.onebook.isbn,“123456”);
strcpy(first.onebook.title,《編程?c”);
strcpy(first.onebook.author,“yhb”);
first . next = 0;
struct?書?* firstptr = & amp第壹;?//鏈表頭指針
文件?* fp
如果?((fp=fopen(books," a+")= = NULL)
Printf("文件無法打開!!!");
addEntry(fp,first ptr);
while(1)
{
系統(“CLS”);?//清除屏幕
/************************************************************************/
/*想想為什麽要清空這裏的緩沖區*/
/*由於last (choice函數)的getchar(),緩沖區中還剩下壹個' \n '...*/
/*可以看看這句話。沒有這句話,妳會有麻煩?*/
/*如果不使用fflush,可以用getche()*/替換getchar()
/*比較getchar()、getch()、getche()...*/
/************************************************************************/
fflush(stdin);?
ch = choice()-48;
切換?(ch)
{
案子?1:
main search book(first ptr);
打破;
案子?2:
MainAdd(firstptr,FP);
打破;
案子?3:
MainRemove(firstptr,FP);
打破;
案子?4:
Printf("感謝使用...\ n ");
退出(0);
默認值:
Printf("請輸入正確的序列號!");
}
系統(“暫停”);
}
回歸?0;
}